1
0
mirror of https://github.com/golang/go synced 2024-11-11 19:41:36 -07:00

[dev.regabi] go/types: port check_test.go ergonomics from dev.typeparams

On the dev.typeparams and dev.go2go branches, check_test.go has been
updated to automatically discover test data. This is convenient, so port
it to dev.regabi.

Change-Id: I5da9a9a5139c35a2693e64364eb9928ece1cd7c6
Reviewed-on: https://go-review.googlesource.com/c/go/+/289713
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Rob Findley 2021-02-04 11:06:15 -05:00 committed by Robert Findley
parent afd67f3334
commit bc451b5770
9 changed files with 45 additions and 76 deletions

View File

@ -27,12 +27,14 @@ package types_test
import (
"flag"
"fmt"
"go/ast"
"go/importer"
"go/parser"
"go/scanner"
"go/token"
"internal/testenv"
"io/ioutil"
"os"
"path/filepath"
"regexp"
@ -48,54 +50,6 @@ var (
testFiles = flag.String("files", "", "space-separated list of test files")
)
// The test filenames do not end in .go so that they are invisible
// to gofmt since they contain comments that must not change their
// positions relative to surrounding tokens.
// Each tests entry is list of files belonging to the same package.
var tests = [][]string{
{"testdata/errors.src"},
{"testdata/importdecl0a.src", "testdata/importdecl0b.src"},
{"testdata/importdecl1a.src", "testdata/importdecl1b.src"},
{"testdata/importC.src"}, // special handling in checkFiles
{"testdata/cycles.src"},
{"testdata/cycles1.src"},
{"testdata/cycles2.src"},
{"testdata/cycles3.src"},
{"testdata/cycles4.src"},
{"testdata/cycles5.src"},
{"testdata/init0.src"},
{"testdata/init1.src"},
{"testdata/init2.src"},
{"testdata/decls0.src"},
{"testdata/decls1.src"},
{"testdata/decls2a.src", "testdata/decls2b.src"},
{"testdata/decls3.src"},
{"testdata/decls4.src"},
{"testdata/decls5.src"},
{"testdata/const0.src"},
{"testdata/const1.src"},
{"testdata/constdecl.src"},
{"testdata/vardecl.src"},
{"testdata/expr0.src"},
{"testdata/expr1.src"},
{"testdata/expr2.src"},
{"testdata/expr3.src"},
{"testdata/methodsets.src"},
{"testdata/shifts.src"},
{"testdata/builtins.src"},
{"testdata/conversions.src"},
{"testdata/conversions2.src"},
{"testdata/stmt0.src"},
{"testdata/stmt1.src"},
{"testdata/gotos.src"},
{"testdata/labels.src"},
{"testdata/literals.src"},
{"testdata/issues.src"},
{"testdata/blank.src"},
{"testdata/issue25008b.src", "testdata/issue25008a.src"}, // order (b before a) is crucial!
}
var fset = token.NewFileSet()
// Positioned errors are of the form filename:line:column: message .
@ -236,9 +190,13 @@ func eliminate(t *testing.T, errmap map[string][]string, errlist []error) {
}
}
func checkFiles(t *testing.T, testfiles []string) {
func checkFiles(t *testing.T, sources []string) {
if len(sources) == 0 {
t.Fatal("no source files")
}
// parse files and collect parser errors
files, errlist := parseFiles(t, testfiles)
files, errlist := parseFiles(t, sources)
pkgName := "<no package>"
if len(files) > 0 {
@ -254,10 +212,13 @@ func checkFiles(t *testing.T, testfiles []string) {
// typecheck and collect typechecker errors
var conf Config
// special case for importC.src
if len(testfiles) == 1 && strings.HasSuffix(testfiles[0], "importC.src") {
if len(sources) == 1 && strings.HasSuffix(sources[0], "importC.src") {
conf.FakeImportC = true
}
// TODO(rFindley) we may need to use the source importer when adding generics
// tests.
conf.Importer = importer.Default()
conf.Error = func(err error) {
if *haltOnError {
@ -306,44 +267,52 @@ func checkFiles(t *testing.T, testfiles []string) {
}
}
// TestCheck is for manual testing of selected input files, provided with -files.
func TestCheck(t *testing.T) {
testenv.MustHaveGoBuild(t)
// Declare builtins for testing.
DefPredeclaredTestFuncs()
// If explicit test files are specified, only check those.
if files := *testFiles; files != "" {
checkFiles(t, strings.Split(files, " "))
if *testFiles == "" {
return
}
// Otherwise, run all the tests.
for _, files := range tests {
checkFiles(t, files)
}
testenv.MustHaveGoBuild(t)
DefPredeclaredTestFuncs()
checkFiles(t, strings.Split(*testFiles, " "))
}
func TestFixedBugs(t *testing.T) { testDir(t, "fixedbugs") }
func TestTestdata(t *testing.T) { DefPredeclaredTestFuncs(); testDir(t, "testdata") }
func TestFixedbugs(t *testing.T) { testDir(t, "fixedbugs") }
func testDir(t *testing.T, dir string) {
testenv.MustHaveGoBuild(t)
dirs, err := os.ReadDir(dir)
fis, err := os.ReadDir(dir)
if err != nil {
t.Fatal(err)
t.Error(err)
return
}
for _, d := range dirs {
testname := filepath.Base(d.Name())
testname = strings.TrimSuffix(testname, filepath.Ext(testname))
t.Run(testname, func(t *testing.T) {
filename := filepath.Join(dir, d.Name())
if d.IsDir() {
t.Errorf("skipped directory %q", filename)
return
for _, fi := range fis {
path := filepath.Join(dir, fi.Name())
// if fi is a directory, its files make up a single package
var files []string
if fi.IsDir() {
fis, err := ioutil.ReadDir(path)
if err != nil {
t.Error(err)
continue
}
checkFiles(t, []string{filename})
files = make([]string, len(fis))
for i, fi := range fis {
// if fi is a directory, checkFiles below will complain
files[i] = filepath.Join(path, fi.Name())
if testing.Verbose() {
fmt.Printf("\t%s\n", files[i])
}
}
} else {
files = []string{path}
}
t.Run(filepath.Base(path), func(t *testing.T) {
checkFiles(t, files)
})
}
}