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  }