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  }