diff options
Diffstat (limited to 'base_workspace/tools/go/generate_test_main.go')
-rw-r--r-- | base_workspace/tools/go/generate_test_main.go | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/base_workspace/tools/go/generate_test_main.go b/base_workspace/tools/go/generate_test_main.go new file mode 100644 index 0000000000..6316802dde --- /dev/null +++ b/base_workspace/tools/go/generate_test_main.go @@ -0,0 +1,91 @@ +// Bare bones Go testing support for Bazel. + +package main + +import ( + "flag" + "go/ast" + "go/parser" + "go/token" + "log" + "os" + "strings" + "text/template" +) + +// Cases holds template data. +type Cases struct { + Package string + Names []string +} + +func main() { + pkg := flag.String("package", "", "package from which to import test methods.") + out := flag.String("output", "", "output file to write. Defaults to stdout.") + flag.Parse() + + if *pkg == "" { + log.Fatal("must set --package.") + } + + outFile := os.Stdout + if *out != "" { + var err error + outFile, err = os.Create(*out) + if err != nil { + log.Fatalf("os.Create(%q): %v", *out, err) + } + defer outFile.Close() + } + + cases := Cases{ + Package: *pkg, + } + testFileSet := token.NewFileSet() + for _, f := range flag.Args() { + parse, err := parser.ParseFile(testFileSet, f, nil, parser.ParseComments) + if err != nil { + log.Fatalf("ParseFile(%q): %v", f, err) + } + + for _, d := range parse.Decls { + fn, ok := d.(*ast.FuncDecl) + if !ok { + continue + } + if fn.Recv != nil { + continue + } + if !strings.HasPrefix(fn.Name.Name, "Test") { + continue + } + cases.Names = append(cases.Names, fn.Name.Name) + } + } + + tpl := template.Must(template.New("source").Parse(` +package main +import ( + "testing" + + undertest "{{.Package}}" +) + +func everything(pat, str string) (bool, error) { + return true, nil +} + +var tests = []testing.InternalTest{ +{{range .Names}} + {"{{.}}", undertest.{{.}} }, +{{end}} +} + +func main() { + testing.Main(everything, tests, nil, nil) +} +`)) + if err := tpl.Execute(outFile, &cases); err != nil { + log.Fatalf("template.Execute(%v): %v", cases, err) + } +} |