aboutsummaryrefslogtreecommitdiffhomepage
path: root/base_workspace/tools/go/generate_test_main.go
diff options
context:
space:
mode:
Diffstat (limited to 'base_workspace/tools/go/generate_test_main.go')
-rw-r--r--base_workspace/tools/go/generate_test_main.go91
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)
+ }
+}