github.com/c-darwin/mobile@v0.0.0-20160313183840-ff625c46f7c9/bind/bind_test.go (about) 1 package bind 2 3 import ( 4 "bytes" 5 "flag" 6 "go/ast" 7 "go/parser" 8 "go/token" 9 "go/types" 10 "io/ioutil" 11 "log" 12 "os" 13 "os/exec" 14 "path/filepath" 15 "runtime" 16 "strings" 17 "testing" 18 ) 19 20 func init() { 21 log.SetFlags(log.Lshortfile) 22 } 23 24 var updateFlag = flag.Bool("update", false, "Update the golden files.") 25 26 var tests = []string{ 27 "testdata/basictypes.go", 28 "testdata/structs.go", 29 "testdata/interfaces.go", 30 "testdata/issue10788.go", 31 "testdata/issue12328.go", 32 "testdata/try.go", 33 } 34 35 var fset = token.NewFileSet() 36 37 func typeCheck(t *testing.T, filename string) *types.Package { 38 f, err := parser.ParseFile(fset, filename, nil, parser.AllErrors) 39 if err != nil { 40 t.Fatalf("%s: %v", filename, err) 41 } 42 43 pkgName := filepath.Base(filename) 44 pkgName = strings.TrimSuffix(pkgName, ".go") 45 46 // typecheck and collect typechecker errors 47 var conf types.Config 48 conf.Error = func(err error) { 49 t.Error(err) 50 } 51 pkg, err := conf.Check(pkgName, fset, []*ast.File{f}, nil) 52 if err != nil { 53 t.Fatal(err) 54 } 55 return pkg 56 } 57 58 // diff runs the command "diff a b" and returns its output 59 func diff(a, b string) string { 60 var buf bytes.Buffer 61 var cmd *exec.Cmd 62 switch runtime.GOOS { 63 case "plan9": 64 cmd = exec.Command("/bin/diff", "-c", a, b) 65 default: 66 cmd = exec.Command("/usr/bin/diff", "-u", a, b) 67 } 68 cmd.Stdout = &buf 69 cmd.Stderr = &buf 70 cmd.Run() 71 return buf.String() 72 } 73 74 func writeTempFile(t *testing.T, name string, contents []byte) string { 75 f, err := ioutil.TempFile("", name) 76 if err != nil { 77 t.Fatal(err) 78 } 79 if _, err := f.Write(contents); err != nil { 80 t.Fatal(err) 81 } 82 if err := f.Close(); err != nil { 83 t.Fatal(err) 84 } 85 return f.Name() 86 } 87 88 func TestGenObjc(t *testing.T) { 89 var suffixes = map[bool]string{ 90 true: ".objc.h.golden", 91 false: ".objc.m.golden", 92 } 93 94 for _, filename := range tests { 95 pkg := typeCheck(t, filename) 96 97 for isHeader, suffix := range suffixes { 98 var buf bytes.Buffer 99 if err := GenObjc(&buf, fset, pkg, isHeader); err != nil { 100 t.Errorf("%s: %v", filename, err) 101 continue 102 } 103 out := writeTempFile(t, "generated"+suffix, buf.Bytes()) 104 defer os.Remove(out) 105 golden := filename[:len(filename)-len(".go")] + suffix 106 if diffstr := diff(golden, out); diffstr != "" { 107 t.Errorf("%s: does not match Objective-C golden:\n%s", filename, diffstr) 108 if *updateFlag { 109 t.Logf("Updating %s...", golden) 110 err := exec.Command("/bin/cp", out, golden).Run() 111 if err != nil { 112 t.Errorf("Update failed: %s", err) 113 } 114 } 115 } 116 } 117 } 118 } 119 120 func TestGenJava(t *testing.T) { 121 for _, filename := range tests { 122 var buf bytes.Buffer 123 pkg := typeCheck(t, filename) 124 if err := GenJava(&buf, fset, pkg); err != nil { 125 t.Errorf("%s: %v", filename, err) 126 continue 127 } 128 out := writeTempFile(t, "java", buf.Bytes()) 129 defer os.Remove(out) 130 golden := filename[:len(filename)-len(".go")] + ".java.golden" 131 if diffstr := diff(golden, out); diffstr != "" { 132 t.Errorf("%s: does not match Java golden:\n%s", filename, diffstr) 133 134 if *updateFlag { 135 t.Logf("Updating %s...", golden) 136 if err := exec.Command("/bin/cp", out, golden).Run(); err != nil { 137 t.Errorf("Update failed: %s", err) 138 } 139 } 140 141 } 142 } 143 } 144 145 func TestGenGo(t *testing.T) { 146 for _, filename := range tests { 147 var buf bytes.Buffer 148 pkg := typeCheck(t, filename) 149 if err := GenGo(&buf, fset, pkg); err != nil { 150 t.Errorf("%s: %v", filename, err) 151 continue 152 } 153 out := writeTempFile(t, "go", buf.Bytes()) 154 defer os.Remove(out) 155 golden := filename + ".golden" 156 if diffstr := diff(golden, out); diffstr != "" { 157 t.Errorf("%s: does not match Java golden:\n%s", filename, diffstr) 158 159 if *updateFlag { 160 t.Logf("Updating %s...", golden) 161 if err := exec.Command("/bin/cp", out, golden).Run(); err != nil { 162 t.Errorf("Update failed: %s", err) 163 } 164 } 165 } 166 } 167 }