| OLD | NEW |
| (Empty) |
| 1 package bind | |
| 2 | |
| 3 import ( | |
| 4 "bytes" | |
| 5 "flag" | |
| 6 "go/ast" | |
| 7 "go/parser" | |
| 8 "go/token" | |
| 9 "io/ioutil" | |
| 10 "os" | |
| 11 "os/exec" | |
| 12 "path/filepath" | |
| 13 "runtime" | |
| 14 "strings" | |
| 15 "testing" | |
| 16 | |
| 17 _ "golang.org/x/tools/go/gcimporter" | |
| 18 "golang.org/x/tools/go/types" | |
| 19 ) | |
| 20 | |
| 21 var updateFlag = flag.Bool("update", false, "Update the golden files.") | |
| 22 | |
| 23 var tests = []string{ | |
| 24 "testdata/basictypes.go", | |
| 25 "testdata/structs.go", | |
| 26 "testdata/interfaces.go", | |
| 27 } | |
| 28 | |
| 29 var fset = token.NewFileSet() | |
| 30 | |
| 31 func typeCheck(t *testing.T, filename string) *types.Package { | |
| 32 f, err := parser.ParseFile(fset, filename, nil, parser.AllErrors) | |
| 33 if err != nil { | |
| 34 t.Fatalf("%s: %v", filename, err) | |
| 35 } | |
| 36 | |
| 37 pkgName := filepath.Base(filename) | |
| 38 pkgName = strings.TrimSuffix(pkgName, ".go") | |
| 39 | |
| 40 // typecheck and collect typechecker errors | |
| 41 var conf types.Config | |
| 42 conf.Error = func(err error) { | |
| 43 t.Error(err) | |
| 44 } | |
| 45 pkg, err := conf.Check(pkgName, fset, []*ast.File{f}, nil) | |
| 46 if err != nil { | |
| 47 t.Fatal(err) | |
| 48 } | |
| 49 return pkg | |
| 50 } | |
| 51 | |
| 52 // diff runs the command "diff a b" and returns its output | |
| 53 func diff(a, b string) string { | |
| 54 var buf bytes.Buffer | |
| 55 var cmd *exec.Cmd | |
| 56 switch runtime.GOOS { | |
| 57 case "plan9": | |
| 58 cmd = exec.Command("/bin/diff", "-c", a, b) | |
| 59 default: | |
| 60 cmd = exec.Command("/usr/bin/diff", "-u", a, b) | |
| 61 } | |
| 62 cmd.Stdout = &buf | |
| 63 cmd.Stderr = &buf | |
| 64 cmd.Run() | |
| 65 return buf.String() | |
| 66 } | |
| 67 | |
| 68 func writeTempFile(t *testing.T, name string, contents []byte) string { | |
| 69 f, err := ioutil.TempFile("", name) | |
| 70 if err != nil { | |
| 71 t.Fatal(err) | |
| 72 } | |
| 73 if _, err := f.Write(contents); err != nil { | |
| 74 t.Fatal(err) | |
| 75 } | |
| 76 if err := f.Close(); err != nil { | |
| 77 t.Fatal(err) | |
| 78 } | |
| 79 return f.Name() | |
| 80 } | |
| 81 | |
| 82 func TestGenJava(t *testing.T) { | |
| 83 for _, filename := range tests { | |
| 84 var buf bytes.Buffer | |
| 85 pkg := typeCheck(t, filename) | |
| 86 if err := GenJava(&buf, fset, pkg); err != nil { | |
| 87 t.Errorf("%s: %v", filename, err) | |
| 88 continue | |
| 89 } | |
| 90 out := writeTempFile(t, "java", buf.Bytes()) | |
| 91 defer os.Remove(out) | |
| 92 golden := filename[:len(filename)-len(".go")] + ".java.golden" | |
| 93 if diffstr := diff(golden, out); diffstr != "" { | |
| 94 t.Errorf("%s: does not match Java golden:\n%s", filename
, diffstr) | |
| 95 | |
| 96 if *updateFlag { | |
| 97 t.Logf("Updating %s...", golden) | |
| 98 if err := exec.Command("/bin/cp", out, golden).R
un(); err != nil { | |
| 99 t.Errorf("Update failed: %s", err) | |
| 100 } | |
| 101 } | |
| 102 | |
| 103 } | |
| 104 } | |
| 105 } | |
| 106 | |
| 107 func TestGenGo(t *testing.T) { | |
| 108 for _, filename := range tests { | |
| 109 var buf bytes.Buffer | |
| 110 pkg := typeCheck(t, filename) | |
| 111 if err := GenGo(&buf, fset, pkg); err != nil { | |
| 112 t.Errorf("%s: %v", filename, err) | |
| 113 continue | |
| 114 } | |
| 115 out := writeTempFile(t, "go", buf.Bytes()) | |
| 116 defer os.Remove(out) | |
| 117 golden := filename + ".golden" | |
| 118 if diffstr := diff(golden, out); diffstr != "" { | |
| 119 t.Errorf("%s: does not match Java golden:\n%s", filename
, diffstr) | |
| 120 | |
| 121 if *updateFlag { | |
| 122 t.Logf("Updating %s...", golden) | |
| 123 if err := exec.Command("/bin/cp", out, golden).R
un(); err != nil { | |
| 124 t.Errorf("Update failed: %s", err) | |
| 125 } | |
| 126 } | |
| 127 } | |
| 128 } | |
| 129 } | |
| OLD | NEW |