package imports

import (
	"go/build"
	"os"
	"testing"

	"golang.org/x/tools/internal/gocommand"
	"golang.org/x/tools/internal/testenv"
)

func TestMain(m *testing.M) {
	testenv.ExitIfSmallMachine()
	os.Exit(m.Run())
}

// TestNilOpts tests that process does not crash with nil opts.
func TestNilOpts(t *testing.T) {
	var testOpts = []struct {
		name string
		opt  *Options
	}{
		{
			name: "nil",
			opt:  nil,
		},
		{
			name: "nil env",
			opt:  &Options{Comments: true, TabIndent: true, TabWidth: 8},
		},
		{
			name: "default",
			opt: &Options{
				Env: &ProcessEnv{
					GOPATH:      build.Default.GOPATH,
					GOROOT:      build.Default.GOROOT,
					GocmdRunner: &gocommand.Runner{},
				},
				Comments:  true,
				TabIndent: true,
				TabWidth:  8,
			},
		},
	}

	input := `package p

func _() {
	fmt.Println()
}
`
	want := `package p

import "fmt"

func _() {
	fmt.Println()
}
`
	for _, test := range testOpts {
		// Test Process
		got, err := Process("", []byte(input), test.opt)
		if err != nil {
			t.Errorf("%s: %s", test.name, err.Error())
		}
		if string(got) != want {
			t.Errorf("%s: Process: Got:\n%s\nWant:\n%s\n", test.name, string(got), want)
		}

		// Test FixImports and ApplyFixes
		fixes, err := FixImports("", []byte(input), test.opt)
		if err != nil {
			t.Errorf("%s: %s", test.name, err.Error())
		}

		got, err = ApplyFixes(fixes, "", []byte(input), test.opt, 0)
		if err != nil {
			t.Errorf("%s: %s", test.name, err.Error())
		}
		if string(got) != want {
			t.Errorf("%s: ApplyFix: Got:\n%s\nWant:\n%s\n", test.name, string(got), want)
		}
	}
}
