github.com/brownsys/tracing-framework-go@v0.0.0-20161210174012-0542a62412fe/cmd/rewrite/rewrite_test.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "go/ast" 6 "go/format" 7 "go/parser" 8 "go/token" 9 "go/types" 10 "testing" 11 12 "golang.org/x/tools/go/loader" 13 ) 14 15 func TestGos(t *testing.T) { 16 src := ` 17 package main 18 19 func one(a int) {} 20 21 func two(a, b int) {} 22 23 func three(a, b, c int) {} 24 25 func variadic(a ...int) {} 26 27 func blank(_ int) {} 28 29 func nested(a int) { 30 func(a int) {}(a) 31 } 32 33 func main() { 34 go one(0) 35 36 go two(0, 1) 37 38 go three(0, 1, 2) 39 40 go variadic() 41 42 go variadic(0) 43 44 go variadic(0, 1) 45 46 go variadic([]int{1, 2, 3}...) 47 48 go blank(0) 49 50 go nested(0) 51 } 52 ` 53 54 expect := `package main 55 56 import "github.com/brownsys/tracing-framework-go/local" 57 58 func one(a int) {} 59 60 func two(a, b int) {} 61 62 func three(a, b, c int) {} 63 64 func variadic(a ...int) {} 65 66 func blank(_ int) {} 67 68 func nested(a int) { 69 func(a int) {}(a) 70 } 71 72 func main() { 73 go func(__f1 func(), __f2 func(a int), arg0 int) { 74 __f1() 75 __f2(arg0) 76 }(local.GetSpawnCallback(), one, 0) 77 go func(__f1 func(), __f2 func(a int, b int), arg0 int, arg1 int) { 78 __f1() 79 __f2(arg0, arg1) 80 }(local.GetSpawnCallback(), two, 0, 1) 81 go func(__f1 func(), __f2 func(a int, b int, c int), arg0 int, arg1 int, arg2 int) { 82 __f1() 83 __f2(arg0, arg1, arg2) 84 }(local.GetSpawnCallback(), three, 0, 1, 85 2) 86 go func(__f1 func(), __f2 func(a ...int), arg0 ...int) { 87 __f1() 88 __f2(arg0...) 89 }(local. 90 GetSpawnCallback(), variadic, 91 ) 92 go func(__f1 func(), __f2 func(a ...int), arg0 ...int) { 93 __f1() 94 __f2(arg0...) 95 }(local. 96 GetSpawnCallback(), variadic, 97 98 0) 99 go func(__f1 func(), __f2 func(a ...int), arg0 ...int) { 100 __f1() 101 __f2(arg0...) 102 }(local. 103 GetSpawnCallback(), variadic, 104 105 0, 1) 106 go func(__f1 func(), __f2 func(a ...int), arg0 ...int) { 107 __f1() 108 __f2(arg0...) 109 }(local. 110 GetSpawnCallback(), variadic, 111 112 []int{1, 2, 3}..., 113 ) 114 go func(__f1 func(), __f2 func(_ int), arg0 int) { 115 __f1() 116 __f2(arg0) 117 }(local.GetSpawnCallback(), blank, 0) 118 go func(__f1 func(), __f2 func(a int), arg0 int) { 119 __f1() 120 __f2(arg0) 121 }(local.GetSpawnCallback(), nested, 0) 122 123 } 124 ` 125 126 new := testHelper(t, src, rewriteGos) 127 if new != expect { 128 var idx int 129 for i, c := range []byte(new) { 130 if c != expect[i] { 131 idx = i 132 break 133 } 134 } 135 t.Errorf("unexpected output (see source for expected output) at character %v:\n%v", idx, new) 136 } 137 } 138 139 type rewriter func(fset *token.FileSet, info types.Info, qual types.Qualifier, f *ast.File) (bool, error) 140 141 func testHelper(t *testing.T, src string, r rewriter) string { 142 c := loader.Config{ 143 Fset: token.NewFileSet(), 144 ParserMode: parser.ParseComments | parser.DeclarationErrors, 145 AllowErrors: true, 146 } 147 148 f, err := c.ParseFile("test.go", src) 149 if err != nil { 150 t.Fatalf("unexpected error: %v", err) 151 } 152 c.CreateFromFiles("main", f) 153 p, err := c.Load() 154 if err != nil { 155 t.Fatalf("unexpected error: %v", err) 156 } 157 pi := p.Package("main") 158 159 _, err = r(c.Fset, pi.Info, qualifierForFile(pi.Pkg, f), f) 160 if err != nil { 161 t.Fatalf("unexpected error: %v", err) 162 } 163 164 var buf bytes.Buffer 165 err = format.Node(&buf, c.Fset, f) 166 if err != nil { 167 t.Fatalf("unexpected error: %v", err) 168 } 169 b, err := format.Source(buf.Bytes()) 170 if err != nil { 171 t.Fatalf("unexpected error: %v", err) 172 } 173 return string(b) 174 }