github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/tools/refactor/eg/eg_test.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build go1.5 6 7 // No testdata on Android. 8 9 // +build !android 10 11 package eg_test 12 13 import ( 14 "bytes" 15 "flag" 16 exact "go/constant" 17 "go/parser" 18 "go/token" 19 "go/types" 20 "os" 21 "os/exec" 22 "path/filepath" 23 "runtime" 24 "strings" 25 "testing" 26 27 "golang.org/x/tools/go/loader" 28 "golang.org/x/tools/refactor/eg" 29 ) 30 31 // TODO(adonovan): more tests: 32 // - of command-line tool 33 // - of all parts of syntax 34 // - of applying a template to a package it imports: 35 // the replacement syntax should use unqualified names for its objects. 36 37 var ( 38 updateFlag = flag.Bool("update", false, "update the golden files") 39 verboseFlag = flag.Bool("verbose", false, "show matcher information") 40 ) 41 42 func Test(t *testing.T) { 43 switch runtime.GOOS { 44 case "windows": 45 t.Skipf("skipping test on %q (no /usr/bin/diff)", runtime.GOOS) 46 } 47 48 conf := loader.Config{ 49 Fset: token.NewFileSet(), 50 ParserMode: parser.ParseComments, 51 } 52 53 // Each entry is a single-file package. 54 // (Multi-file packages aren't interesting for this test.) 55 // Order matters: each non-template package is processed using 56 // the preceding template package. 57 for _, filename := range []string{ 58 "testdata/A.template", 59 "testdata/A1.go", 60 "testdata/A2.go", 61 62 "testdata/B.template", 63 "testdata/B1.go", 64 65 "testdata/C.template", 66 "testdata/C1.go", 67 68 "testdata/D.template", 69 "testdata/D1.go", 70 71 "testdata/E.template", 72 "testdata/E1.go", 73 74 "testdata/F.template", 75 "testdata/F1.go", 76 77 "testdata/G.template", 78 "testdata/G1.go", 79 80 "testdata/H.template", 81 "testdata/H1.go", 82 83 "testdata/bad_type.template", 84 "testdata/no_before.template", 85 "testdata/no_after_return.template", 86 "testdata/type_mismatch.template", 87 "testdata/expr_type_mismatch.template", 88 } { 89 pkgname := strings.TrimSuffix(filepath.Base(filename), ".go") 90 conf.CreateFromFilenames(pkgname, filename) 91 } 92 iprog, err := conf.Load() 93 if err != nil { 94 t.Fatal(err) 95 } 96 97 var xform *eg.Transformer 98 for _, info := range iprog.Created { 99 file := info.Files[0] 100 filename := iprog.Fset.File(file.Pos()).Name() // foo.go 101 102 if strings.HasSuffix(filename, "template") { 103 // a new template 104 shouldFail, _ := info.Pkg.Scope().Lookup("shouldFail").(*types.Const) 105 xform, err = eg.NewTransformer(iprog.Fset, info.Pkg, file, &info.Info, *verboseFlag) 106 if err != nil { 107 if shouldFail == nil { 108 t.Errorf("NewTransformer(%s): %s", filename, err) 109 } else if want := exact.StringVal(shouldFail.Val()); !strings.Contains(err.Error(), want) { 110 t.Errorf("NewTransformer(%s): got error %q, want error %q", filename, err, want) 111 } 112 } else if shouldFail != nil { 113 t.Errorf("NewTransformer(%s) succeeded unexpectedly; want error %q", 114 filename, shouldFail.Val()) 115 } 116 continue 117 } 118 119 if xform == nil { 120 t.Errorf("%s: no previous template", filename) 121 continue 122 } 123 124 // apply previous template to this package 125 n := xform.Transform(&info.Info, info.Pkg, file) 126 if n == 0 { 127 t.Errorf("%s: no matches", filename) 128 continue 129 } 130 131 got := filename + "t" // foo.got 132 golden := filename + "lden" // foo.golden 133 134 // Write actual output to foo.got. 135 if err := eg.WriteAST(iprog.Fset, got, file); err != nil { 136 t.Error(err) 137 } 138 defer os.Remove(got) 139 140 // Compare foo.got with foo.golden. 141 var cmd *exec.Cmd 142 switch runtime.GOOS { 143 case "plan9": 144 cmd = exec.Command("/bin/diff", "-c", golden, got) 145 default: 146 cmd = exec.Command("/usr/bin/diff", "-u", golden, got) 147 } 148 buf := new(bytes.Buffer) 149 cmd.Stdout = buf 150 cmd.Stderr = os.Stderr 151 if err := cmd.Run(); err != nil { 152 t.Errorf("eg tests for %s failed: %s.\n%s\n", filename, err, buf) 153 154 if *updateFlag { 155 t.Logf("Updating %s...", golden) 156 if err := exec.Command("/bin/cp", got, golden).Run(); err != nil { 157 t.Errorf("Update failed: %s", err) 158 } 159 } 160 } 161 } 162 }