diff options
Diffstat (limited to 'codegen/codegen_test.go')
| -rw-r--r-- | codegen/codegen_test.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/codegen/codegen_test.go b/codegen/codegen_test.go new file mode 100644 index 0000000..d2f8033 --- /dev/null +++ b/codegen/codegen_test.go @@ -0,0 +1,51 @@ +package codegen + +import ( + "fmt" + "log" + "testing" + + "github.com/gnolang/parscan/lang/golang" + "github.com/gnolang/parscan/parser" + "github.com/gnolang/parscan/vm1" +) + +func TestCodeGen(t *testing.T) { + log.SetFlags(log.Lshortfile) + for _, test := range tests { + test := test + t.Run("", func(t *testing.T) { + c := New() + c.AddSym(fmt.Println, "println") + n := &parser.Node{} + var err error + if n.Child, err = golang.GoParser.Parse(test.src); err != nil { + t.Error(err) + } + errStr := "" + if err = c.CodeGen(n); err != nil { + errStr = err.Error() + } + if errStr != test.err { + t.Errorf("got error %#v, want error %#v", errStr, test.err) + } + t.Log("data:", c.Data) + t.Log("code:", vm1.Disassemble(c.Code)) + }) + } +} + +var tests = []struct { + src, asm, sym, err string +}{{ // #00 + src: "1+2", + asm: "Push 1\nPush 2\nAdd\n", +}, { // #01 + src: `println("Hello")`, + asm: "Dup 0\nDup 1\nCallX 1\n", +}, { // #02 + src: `a := 2; println(a)`, + asm: "Push 2\nAssign 1\nDup 0\nDup 1\nCallX 1", +}, { // #03 + src: `a := 2; if a < 3 {println(a)}; println("bye")`, +}} |
