github.com/goplus/gossa@v0.3.25/repl_test.go (about)

     1  package gossa_test
     2  
     3  import (
     4  	"fmt"
     5  	"go/token"
     6  	"testing"
     7  
     8  	"github.com/goplus/gossa"
     9  )
    10  
    11  func TestReplExpr(t *testing.T) {
    12  	ctx := gossa.NewContext(0)
    13  	repl := gossa.NewRepl(ctx)
    14  	list := []string{
    15  		`a := 1`,
    16  		`b := 2`,
    17  		`a+b`,
    18  	}
    19  	result := []string{
    20  		`[1]`,
    21  		`[2]`,
    22  		`[3]`,
    23  	}
    24  	for i, expr := range list {
    25  		_, v, err := repl.Eval(expr)
    26  		if err != nil {
    27  			t.Fatal(err)
    28  		}
    29  		if fmt.Sprint(v) != result[i] {
    30  			t.Fatalf("expr:%v dump:%v src:%v", expr, v, repl.Source())
    31  		}
    32  	}
    33  }
    34  
    35  func TestReplImports(t *testing.T) {
    36  	ctx := gossa.NewContext(0)
    37  	repl := gossa.NewRepl(ctx)
    38  	list := []string{
    39  		`a := 1`,
    40  		`b := 2`,
    41  		`import "fmt"`,
    42  		`c := fmt.Sprintf("%v-%v",a,b)`,
    43  		`c`,
    44  	}
    45  	result := []string{
    46  		`[1]`,
    47  		`[2]`,
    48  		`[]`,
    49  		`[1-2]`,
    50  		`[1-2]`,
    51  	}
    52  	for i, expr := range list {
    53  		_, v, err := repl.Eval(expr)
    54  		if err != nil {
    55  			t.Fatal(err)
    56  		}
    57  		if fmt.Sprint(v) != result[i] {
    58  			t.Fatalf("expr:%v dump:%v src:%v", expr, v, repl.Source())
    59  		}
    60  	}
    61  }
    62  
    63  func TestReplClosure(t *testing.T) {
    64  	ctx := gossa.NewContext(0)
    65  	repl := gossa.NewRepl(ctx)
    66  	list := []string{
    67  		`a := 1`,
    68  		`b := 2`,
    69  		`fn := func() int { return a }`,
    70  		`d := fn()+b`,
    71  		`d`,
    72  	}
    73  	result := []string{
    74  		`[1]`,
    75  		`[2]`,
    76  		`-`,
    77  		`[3]`,
    78  		`[3]`,
    79  	}
    80  	for i, expr := range list {
    81  		_, v, err := repl.Eval(expr)
    82  		if err != nil {
    83  			t.Fatal(err)
    84  		}
    85  		if result[i] == "-" {
    86  			continue
    87  		}
    88  		if fmt.Sprint(v) != result[i] {
    89  			t.Fatalf("expr:%v dump:%v src:%v", expr, v, repl.Source())
    90  		}
    91  	}
    92  }
    93  
    94  func TestReplVar(t *testing.T) {
    95  	ctx := gossa.NewContext(0)
    96  	repl := gossa.NewRepl(ctx)
    97  	list := []string{
    98  		`a := 1`,
    99  		`b := 2`,
   100  		`var c = 100`,
   101  		`fn := func() int { return a+c }`,
   102  		`d := fn()+b`,
   103  		`d`,
   104  		`c`,
   105  	}
   106  	result := []string{
   107  		`[1]`,
   108  		`[2]`,
   109  		`-`,
   110  		`-`,
   111  		`[103]`,
   112  		`[103]`,
   113  		`[100]`,
   114  	}
   115  	for i, expr := range list {
   116  		_, v, err := repl.Eval(expr)
   117  		if err != nil {
   118  			t.Fatal(err)
   119  		}
   120  		if result[i] == "-" {
   121  			continue
   122  		}
   123  		if fmt.Sprint(v) != result[i] {
   124  			t.Fatalf("expr:%v dump:%v src:%v", expr, v, repl.Source())
   125  		}
   126  	}
   127  }
   128  
   129  func TestReplType(t *testing.T) {
   130  	ctx := gossa.NewContext(0)
   131  	repl := gossa.NewRepl(ctx)
   132  	list := []string{
   133  		`type T struct {
   134  	X int
   135  	Y int
   136  }`,
   137  		`v1 := &T{10,20}`,
   138  		`import "fmt"`,
   139  		`r1 := fmt.Sprint(v1)`,
   140  		`func (t *T) String() string {
   141  	return fmt.Sprintf("%v-%v",t.X,t.Y)
   142  }`,
   143  		`v2 := &T{10,20}`,
   144  		`r2 := fmt.Sprint(v2)`,
   145  	}
   146  	result := []string{
   147  		`-`,
   148  		`[&{10 20}]`,
   149  		`-`,
   150  		`[&{10 20}]`,
   151  		`-`,
   152  		`[10-20]`,
   153  		`[10-20]`,
   154  	}
   155  	for i, expr := range list {
   156  		_, v, err := repl.Eval(expr)
   157  		if err != nil {
   158  			t.Fatal(err)
   159  		}
   160  		if result[i] == "-" {
   161  			continue
   162  		}
   163  		if fmt.Sprint(v) != result[i] {
   164  			t.Fatalf("expr:%v dump:%v src:%v", expr, v, repl.Source())
   165  		}
   166  	}
   167  }
   168  
   169  func TestReplFunc(t *testing.T) {
   170  	ctx := gossa.NewContext(0)
   171  	repl := gossa.NewRepl(ctx)
   172  	list := []string{
   173  		`a := "hello"`,
   174  		`import "fmt"`,
   175  		`a`,
   176  		`fmt.Println(a)`,
   177  		`s := fmt.Sprint(a)`,
   178  		`fmt.Println(s)`,
   179  	}
   180  	result := []string{
   181  		`[hello]`,
   182  		`-`,
   183  		`[hello]`,
   184  		`[6 <nil>]`,
   185  		`[hello]`,
   186  		`[6 <nil>]`,
   187  	}
   188  	for i, expr := range list {
   189  		_, v, err := repl.Eval(expr)
   190  		if err != nil {
   191  			t.Fatal(err)
   192  		}
   193  		if result[i] == "-" {
   194  			continue
   195  		}
   196  		if fmt.Sprint(v) != result[i] {
   197  			t.Fatalf("expr:%v dump:%v src:%v", expr, v, repl.Source())
   198  		}
   199  	}
   200  }
   201  
   202  func TestReplTok(t *testing.T) {
   203  	ctx := gossa.NewContext(0)
   204  	repl := gossa.NewRepl(ctx)
   205  	list := []string{
   206  		`a := "hello"`,
   207  		`import "fmt"`,
   208  		`var c int`,
   209  		`const d = 100`,
   210  		`func test(v int) {}`,
   211  		`fmt.Println(a)`,
   212  		`type T int`,
   213  	}
   214  	toks := []token.Token{
   215  		token.IDENT,
   216  		token.IMPORT,
   217  		token.VAR,
   218  		token.CONST,
   219  		token.FUNC,
   220  		token.IDENT,
   221  		token.TYPE,
   222  	}
   223  	for i, expr := range list {
   224  		tok, _, err := repl.Eval(expr)
   225  		if err != nil {
   226  			t.Fatal(err)
   227  		}
   228  		if tok != toks[i] {
   229  			t.Fatalf("expr:%v token:%v", expr, tok)
   230  		}
   231  	}
   232  }
   233  
   234  func TestReplInit(t *testing.T) {
   235  	ctx := gossa.NewContext(0)
   236  	repl := gossa.NewRepl(ctx)
   237  	list := []string{
   238  		`var i int = 10`,
   239  		`var j int = 20`,
   240  		`func init() { i++ }`,
   241  		`func init() { j++ }`,
   242  		`var c int`,
   243  		`i`,
   244  		`j`,
   245  	}
   246  	result := []string{
   247  		`-`,
   248  		`-`,
   249  		`-`,
   250  		`-`,
   251  		`-`,
   252  		`[11]`,
   253  		`[21]`,
   254  	}
   255  	for i, expr := range list {
   256  		_, v, err := repl.Eval(expr)
   257  		if err != nil {
   258  			t.Fatal(err)
   259  		}
   260  		if result[i] == "-" {
   261  			continue
   262  		}
   263  		if fmt.Sprint(v) != result[i] {
   264  			t.Fatalf("expr:%v dump:%v src:%v", expr, v, repl.Source())
   265  		}
   266  	}
   267  }