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 }