]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/go/types/check_test.go
[dev.typeparams] all: merge master (46fd547) into dev.typeparams
[gostls13.git] / src / go / types / check_test.go
index f83abf11ce2e22623cb1ff266ec0b2c4a2f6557f..8c8452c9c683d26c478fcef3b6808560c87f978e 100644 (file)
@@ -202,15 +202,13 @@ func asGoVersion(s string) string {
        return ""
 }
 
-func checkFiles(t *testing.T, sizes Sizes, goVersion string, filenames []string, srcs [][]byte, manual bool, imp Importer) {
+func testFiles(t *testing.T, sizes Sizes, filenames []string, srcs [][]byte, manual bool, imp Importer) {
        if len(filenames) == 0 {
                t.Fatal("no source files")
        }
 
-       if strings.HasSuffix(filenames[0], ".go2") && !typeparams.Enabled {
-               t.Skip("type params are not enabled")
-       }
-       if strings.HasSuffix(filenames[0], ".go1") && typeparams.Enabled {
+       if strings.HasSuffix(filenames[0], ".go1") {
+               // TODO(rfindley): re-enable this test by using GoVersion.
                t.Skip("type params are enabled")
        }
 
@@ -228,6 +226,7 @@ func checkFiles(t *testing.T, sizes Sizes, goVersion string, filenames []string,
        }
 
        // if no Go version is given, consider the package name
+       goVersion := *goVersion
        if goVersion == "" {
                goVersion = asGoVersion(pkgName)
        }
@@ -243,7 +242,7 @@ func checkFiles(t *testing.T, sizes Sizes, goVersion string, filenames []string,
        // typecheck and collect typechecker errors
        var conf Config
        conf.Sizes = sizes
-       SetGoVersion(&conf, goVersion)
+       conf.GoVersion = goVersion
 
        // special case for importC.src
        if len(filenames) == 1 {
@@ -303,29 +302,48 @@ func checkFiles(t *testing.T, sizes Sizes, goVersion string, filenames []string,
        }
 }
 
-// TestManual is for manual testing of input files, provided as a list
-// of arguments after the test arguments (and a separating "--"). For
-// instance, to check the files foo.go and bar.go, use:
+// TestManual is for manual testing of a package - either provided
+// as a list of filenames belonging to the package, or a directory
+// name containing the package files - after the test arguments
+// (and a separating "--"). For instance, to test the package made
+// of the files foo.go and bar.go, use:
 //
 //     go test -run Manual -- foo.go bar.go
 //
-// Provide the -verify flag to verify errors against ERROR comments in
-// the input files rather than having a list of errors reported.
-// The accepted Go language version can be controlled with the -lang flag.
+// If no source arguments are provided, the file testdata/manual.go2
+// is used instead.
+// Provide the -verify flag to verify errors against ERROR comments
+// in the input files rather than having a list of errors reported.
+// The accepted Go language version can be controlled with the -lang
+// flag.
 func TestManual(t *testing.T) {
+       testenv.MustHaveGoBuild(t)
+
        filenames := flag.Args()
        if len(filenames) == 0 {
-               return
+               filenames = []string{filepath.FromSlash("testdata/manual.go2")}
        }
-       testenv.MustHaveGoBuild(t)
+
+       info, err := os.Stat(filenames[0])
+       if err != nil {
+               t.Fatalf("TestManual: %v", err)
+       }
+
        DefPredeclaredTestFuncs()
-       testPkg(t, filenames, *goVersion, true)
+       if info.IsDir() {
+               if len(filenames) > 1 {
+                       t.Fatal("TestManual: must have only one directory argument")
+               }
+               testDir(t, filenames[0], true)
+       } else {
+               testPkg(t, filenames, true)
+       }
 }
 
 func TestLongConstants(t *testing.T) {
        format := "package longconst\n\nconst _ = %s\nconst _ = %s // ERROR excessively long constant"
        src := fmt.Sprintf(format, strings.Repeat("1", 9999), strings.Repeat("1", 10001))
-       checkFiles(t, nil, "", []string{"longconst.go"}, [][]byte{[]byte(src)}, false, nil)
+       testFiles(t, nil, []string{"longconst.go"}, [][]byte{[]byte(src)}, false, nil)
 }
 
 // TestIndexRepresentability tests that constant index operands must
@@ -333,32 +351,24 @@ func TestLongConstants(t *testing.T) {
 // represent larger values.
 func TestIndexRepresentability(t *testing.T) {
        const src = "package index\n\nvar s []byte\nvar _ = s[int64 /* ERROR \"int64\\(1\\) << 40 \\(.*\\) overflows int\" */ (1) << 40]"
-       checkFiles(t, &StdSizes{4, 4}, "", []string{"index.go"}, [][]byte{[]byte(src)}, false, nil)
-}
-
-func TestIssue46453(t *testing.T) {
-       if typeparams.Enabled {
-               t.Skip("type params are enabled")
-       }
-       const src = "package p\ntype _ comparable // ERROR \"undeclared name: comparable\""
-       checkFiles(t, nil, "", []string{"issue46453.go"}, [][]byte{[]byte(src)}, false, nil)
+       testFiles(t, &StdSizes{4, 4}, []string{"index.go"}, [][]byte{[]byte(src)}, false, nil)
 }
 
 func TestIssue47243_TypedRHS(t *testing.T) {
        // The RHS of the shift expression below overflows uint on 32bit platforms,
        // but this is OK as it is explicitly typed.
        const src = "package issue47243\n\nvar a uint64; var _ = a << uint64(4294967296)" // uint64(1<<32)
-       checkFiles(t, &StdSizes{4, 4}, "", []string{"p.go"}, [][]byte{[]byte(src)}, false, nil)
+       testFiles(t, &StdSizes{4, 4}, []string{"p.go"}, [][]byte{[]byte(src)}, false, nil)
 }
 
-func TestCheck(t *testing.T)     { DefPredeclaredTestFuncs(); testDir(t, "check") }
-func TestExamples(t *testing.T)  { testDir(t, "examples") }
-func TestFixedbugs(t *testing.T) { testDir(t, "fixedbugs") }
+func TestCheck(t *testing.T)     { DefPredeclaredTestFuncs(); testDirFiles(t, "testdata/check", false) }
+func TestExamples(t *testing.T)  { testDirFiles(t, "testdata/examples", false) }
+func TestFixedbugs(t *testing.T) { testDirFiles(t, "testdata/fixedbugs", false) }
 
-func testDir(t *testing.T, dir string) {
+func testDirFiles(t *testing.T, dir string, manual bool) {
        testenv.MustHaveGoBuild(t)
+       dir = filepath.FromSlash(dir)
 
-       dir = filepath.Join("testdata", dir)
        fis, err := os.ReadDir(dir)
        if err != nil {
                t.Error(err)
@@ -368,28 +378,38 @@ func testDir(t *testing.T, dir string) {
        for _, fi := range fis {
                path := filepath.Join(dir, fi.Name())
 
-               // if fi is a directory, its files make up a single package
-               var filenames []string
+               // If fi is a directory, its files make up a single package.
                if fi.IsDir() {
-                       fis, err := os.ReadDir(path)
-                       if err != nil {
-                               t.Error(err)
-                               continue
-                       }
-                       for _, fi := range fis {
-                               filenames = append(filenames, filepath.Join(path, fi.Name()))
-                       }
+                       testDir(t, path, manual)
                } else {
-                       filenames = []string{path}
+                       t.Run(filepath.Base(path), func(t *testing.T) {
+                               testPkg(t, []string{path}, manual)
+                       })
                }
-               t.Run(filepath.Base(path), func(t *testing.T) {
-                       testPkg(t, filenames, "", false)
-               })
        }
 }
 
+func testDir(t *testing.T, dir string, manual bool) {
+       testenv.MustHaveGoBuild(t)
+
+       fis, err := os.ReadDir(dir)
+       if err != nil {
+               t.Error(err)
+               return
+       }
+
+       var filenames []string
+       for _, fi := range fis {
+               filenames = append(filenames, filepath.Join(dir, fi.Name()))
+       }
+
+       t.Run(filepath.Base(dir), func(t *testing.T) {
+               testPkg(t, filenames, manual)
+       })
+}
+
 // TODO(rFindley) reconcile the different test setup in go/types with types2.
-func testPkg(t *testing.T, filenames []string, goVersion string, manual bool) {
+func testPkg(t *testing.T, filenames []string, manual bool) {
        srcs := make([][]byte, len(filenames))
        for i, filename := range filenames {
                src, err := os.ReadFile(filename)
@@ -398,5 +418,5 @@ func testPkg(t *testing.T, filenames []string, goVersion string, manual bool) {
                }
                srcs[i] = src
        }
-       checkFiles(t, nil, goVersion, filenames, srcs, manual, nil)
+       testFiles(t, nil, filenames, srcs, manual, nil)
 }