func TestIncludesFinderWithRegExpEmptyOutput(t *testing.T) {
	ctx := &types.Context{}

	output := ""

	ctx.Source = output

	parser := builder.IncludesFinderWithRegExp{Source: &ctx.Source}
	err := parser.Run(ctx)
	NoError(t, err)

	require.Equal(t, "", ctx.IncludeJustFound)
}
func TestIncludesFinderWithRegExpPaddedIncludes4(t *testing.T) {
	ctx := &types.Context{}

	output := "In file included from /tmp/arduino_modified_sketch_815412/binouts.ino:52:0:\n" +
		"/tmp/arduino_build_static/sketch/regtable.h:31:22: fatal error: register.h: No such file or directory\n"

	ctx.Source = output

	parser := builder.IncludesFinderWithRegExp{Source: &ctx.Source}
	err := parser.Run(ctx)
	NoError(t, err)

	require.Equal(t, "register.h", ctx.IncludeJustFound)
}
func TestIncludesFinderWithRegExpPaddedIncludes3(t *testing.T) {
	ctx := &types.Context{}

	output := "/some/path/sketch.ino:1:33: fatal error: SPI.h: No such file or directory\n" +
		"compilation terminated.\n"

	ctx.Source = output

	parser := builder.IncludesFinderWithRegExp{Source: &ctx.Source}
	err := parser.Run(ctx)
	NoError(t, err)

	require.Equal(t, "SPI.h", ctx.IncludeJustFound)
}
func TestIncludesFinderWithRegExpEmptyOutput(t *testing.T) {
	context := make(map[string]interface{})

	output := ""

	context["source"] = output

	parser := builder.IncludesFinderWithRegExp{ContextField: "source"}
	err := parser.Run(context)
	NoError(t, err)

	require.NotNil(t, context[constants.CTX_INCLUDES])
	includes := context[constants.CTX_INCLUDES].([]string)
	require.Equal(t, 0, len(includes))
}
func TestIncludesFinderWithRegExp(t *testing.T) {
	ctx := &types.Context{}

	output := "/some/path/sketch.ino:1:17: fatal error: SPI.h: No such file or directory\n" +
		"#include <SPI.h>\n" +
		"^\n" +
		"compilation terminated."
	ctx.Source = output

	parser := builder.IncludesFinderWithRegExp{Source: &ctx.Source}
	err := parser.Run(ctx)
	NoError(t, err)

	includes := ctx.Includes
	require.Equal(t, 1, len(includes))
	require.Equal(t, "SPI.h", includes[0])
}
func TestIncludesFinderWithRegExp(t *testing.T) {
	context := make(map[string]interface{})

	output := "/some/path/sketch.ino:1:17: fatal error: SPI.h: No such file or directory\n" +
		"#include <SPI.h>\n" +
		"^\n" +
		"compilation terminated."
	context["source"] = output

	parser := builder.IncludesFinderWithRegExp{ContextField: "source"}
	err := parser.Run(context)
	NoError(t, err)

	require.NotNil(t, context[constants.CTX_INCLUDES])
	includes := context[constants.CTX_INCLUDES].([]string)
	require.Equal(t, 1, len(includes))
	require.Equal(t, "SPI.h", includes[0])
}
func TestIncludesFinderWithRegExp(t *testing.T) {
	DownloadCoresAndToolsAndLibraries(t)

	context := make(map[string]interface{})

	buildPath := SetupBuildPath(t, context)
	defer os.RemoveAll(buildPath)

	context[constants.CTX_HARDWARE_FOLDERS] = []string{filepath.Join("..", "hardware"), "hardware", "downloaded_hardware"}
	context[constants.CTX_TOOLS_FOLDERS] = []string{"downloaded_tools"}
	context[constants.CTX_FQBN] = "arduino:avr:leonardo"
	context[constants.CTX_SKETCH_LOCATION] = filepath.Join("sketch2", "SketchWithIfDef.ino")
	context[constants.CTX_BUILD_PROPERTIES_RUNTIME_IDE_VERSION] = "10600"
	context[constants.CTX_VERBOSE] = false

	commands := []types.Command{
		&builder.SetupHumanLoggerIfMissing{},

		&builder.ContainerSetupHardwareToolsLibsSketchAndProps{},

		&builder.ContainerMergeCopySketchFiles{},

		&builder.CoanRunner{},
	}

	for _, command := range commands {
		err := command.Run(context)
		NoError(t, err)
	}

	includesFinder := builder.IncludesFinderWithRegExp{}
	err := includesFinder.Run(context)
	NoError(t, err)

	require.NotNil(t, context[constants.CTX_INCLUDES])
	includes := context[constants.CTX_INCLUDES].([]string)
	require.Equal(t, 2, len(includes))
	require.Equal(t, "empty_1.h", includes[0])
	require.Equal(t, "empty_2.h", includes[1])
}