tg.wantNotStale("p1", "", "./testgo list claims p1 is stale after building with old release")
}
-func testLocalRun(tg *testgoData, exepath, local, match string) {
- tg.t.Helper()
- out, err := exec.Command(exepath).Output()
- if err != nil {
- tg.t.Fatalf("error running %v: %v", exepath, err)
- }
- if !regexp.MustCompile(match).Match(out) {
- tg.t.Log(string(out))
- tg.t.Errorf("testdata/%s/easy.go did not generate expected output", local)
- }
-}
-
-func testLocalEasy(tg *testgoData, local string) {
- tg.t.Helper()
- exepath := "./easy" + exeSuffix
- tg.creatingTemp(exepath)
- tg.run("build", "-o", exepath, filepath.Join("testdata", local, "easy.go"))
- testLocalRun(tg, exepath, local, `(?m)^easysub\.Hello`)
-}
-
-func testLocalEasySub(tg *testgoData, local string) {
- tg.t.Helper()
- exepath := "./easysub" + exeSuffix
- tg.creatingTemp(exepath)
- tg.run("build", "-o", exepath, filepath.Join("testdata", local, "easysub", "main.go"))
- testLocalRun(tg, exepath, local, `(?m)^easysub\.Hello`)
-}
-
-func testLocalHard(tg *testgoData, local string) {
- tg.t.Helper()
- exepath := "./hard" + exeSuffix
- tg.creatingTemp(exepath)
- tg.run("build", "-o", exepath, filepath.Join("testdata", local, "hard.go"))
- testLocalRun(tg, exepath, local, `(?m)^sub\.Hello`)
-}
-
-func testLocalInstall(tg *testgoData, local string) {
- tg.t.Helper()
- tg.runFail("install", filepath.Join("testdata", local, "easy.go"))
-}
-
-func TestLocalImportsEasy(t *testing.T) {
- tg := testgo(t)
- defer tg.cleanup()
- testLocalEasy(tg, "local")
-}
-
-func TestLocalImportsEasySub(t *testing.T) {
- tg := testgo(t)
- defer tg.cleanup()
- testLocalEasySub(tg, "local")
-}
-
-func TestLocalImportsHard(t *testing.T) {
- tg := testgo(t)
- defer tg.cleanup()
- testLocalHard(tg, "local")
-}
-
-func TestLocalImportsGoInstallShouldFail(t *testing.T) {
- tg := testgo(t)
- defer tg.cleanup()
- testLocalInstall(tg, "local")
-}
-
-const badDirName = `#$%:, &()*;<=>?\^{}`
-
-func copyBad(tg *testgoData) {
- tg.t.Helper()
- if runtime.GOOS == "windows" {
- tg.t.Skipf("skipping test because %q is an invalid directory name", badDirName)
- }
-
- tg.must(filepath.Walk("testdata/local",
- func(path string, info os.FileInfo, err error) error {
- if err != nil {
- return err
- }
- if info.IsDir() {
- return nil
- }
- var data []byte
- data, err = ioutil.ReadFile(path)
- if err != nil {
- return err
- }
- newpath := strings.Replace(path, "local", badDirName, 1)
- tg.tempFile(newpath, string(data))
- return nil
- }))
- tg.cd(tg.path("."))
-}
-
-func TestBadImportsEasy(t *testing.T) {
- tg := testgo(t)
- defer tg.cleanup()
- // TODO: tg.parallel()
- copyBad(tg)
- testLocalEasy(tg, badDirName)
-}
-
-func TestBadImportsEasySub(t *testing.T) {
- tg := testgo(t)
- defer tg.cleanup()
- copyBad(tg)
- testLocalEasySub(tg, badDirName)
-}
-
-func TestBadImportsHard(t *testing.T) {
- tg := testgo(t)
- defer tg.cleanup()
- copyBad(tg)
- testLocalHard(tg, badDirName)
-}
-
-func TestBadImportsGoInstallShouldFail(t *testing.T) {
- tg := testgo(t)
- defer tg.cleanup()
- copyBad(tg)
- testLocalInstall(tg, badDirName)
-}
-
func TestInternalPackagesInGOROOTAreRespected(t *testing.T) {
skipIfGccgo(t, "gccgo does not have GOROOT")
tg := testgo(t)
--- /dev/null
+env GO111MODULE=off # Relative imports only work in GOPATH mode.
+
+[short] skip
+
+# Imports should be resolved relative to the source file.
+go build testdata/local/easy.go
+exec ./easy$GOEXE
+stdout '^easysub\.Hello'
+
+# Ignored files should be able to import the package built from
+# non-ignored files in the same directory.
+go build -o easysub$GOEXE testdata/local/easysub/main.go
+exec ./easysub$GOEXE
+stdout '^easysub\.Hello'
+
+# Files in relative-imported packages should be able to
+# use relative imports themselves.
+go build testdata/local/hard.go
+exec ./hard$GOEXE
+stdout '^sub\.Hello'
+
+# Explicit source files listed on the command line should not install without
+# GOBIN set, since individual source files aren't part of the containing GOPATH.
+! go install testdata/local/easy.go
+stderr '^go install: no install location for \.go files listed on command line \(GOBIN not set\)$'
+
+[windows] stop # Windows does not allow the ridiculous directory name we're about to use.
+
+env BAD_DIR_NAME='#$%:, &()*;<=>?\^{}'
+
+mkdir -p testdata/$BAD_DIR_NAME/easysub
+mkdir -p testdata/$BAD_DIR_NAME/sub/sub
+
+cp testdata/local/easy.go testdata/$BAD_DIR_NAME/easy.go
+cp testdata/local/easysub/easysub.go testdata/$BAD_DIR_NAME/easysub/easysub.go
+cp testdata/local/easysub/main.go testdata/$BAD_DIR_NAME/easysub/main.go
+cp testdata/local/hard.go testdata/$BAD_DIR_NAME/hard.go
+cp testdata/local/sub/sub.go testdata/$BAD_DIR_NAME/sub/sub.go
+cp testdata/local/sub/sub/subsub.go testdata/$BAD_DIR_NAME/sub/sub/subsub.go
+
+# Imports should be resolved relative to the source file.
+go build testdata/$BAD_DIR_NAME/easy.go
+exec ./easy$GOEXE
+stdout '^easysub\.Hello'
+
+# Ignored files should be able to import the package built from
+# non-ignored files in the same directory.
+go build -o easysub$GOEXE testdata/$BAD_DIR_NAME/easysub/main.go
+exec ./easysub$GOEXE
+stdout '^easysub\.Hello'
+
+# Files in relative-imported packages should be able to
+# use relative imports themselves.
+go build testdata/$BAD_DIR_NAME/hard.go
+exec ./hard$GOEXE
+stdout '^sub\.Hello'
+
+# Explicit source files listed on the command line should not install without
+# GOBIN set, since individual source files aren't part of the containing GOPATH.
+! go install testdata/$BAD_DIR_NAME/easy.go
+stderr '^go install: no install location for \.go files listed on command line \(GOBIN not set\)$'
+
+-- testdata/local/easy.go --
+package main
+
+import "./easysub"
+
+func main() {
+ easysub.Hello()
+}
+-- testdata/local/easysub/easysub.go --
+package easysub
+
+import "fmt"
+
+func Hello() {
+ fmt.Println("easysub.Hello")
+}
+-- testdata/local/easysub/main.go --
+// +build ignore
+
+package main
+
+import "."
+
+func main() {
+ easysub.Hello()
+}
+-- testdata/local/hard.go --
+package main
+
+import "./sub"
+
+func main() {
+ sub.Hello()
+}
+-- testdata/local/sub/sub.go --
+package sub
+
+import (
+ "fmt"
+
+ subsub "./sub"
+)
+
+func Hello() {
+ fmt.Println("sub.Hello")
+ subsub.Hello()
+}
+-- testdata/local/sub/sub/subsub.go --
+package subsub
+
+import "fmt"
+
+func Hello() {
+ fmt.Println("subsub.Hello")
+}