summaryrefslogtreecommitdiff
path: root/parser/dump_test.go
diff options
context:
space:
mode:
authorAntonio Navarro Perez <antnavper@gmail.com>2024-03-20 11:15:48 +0100
committerAntonio Navarro Perez <antnavper@gmail.com>2024-03-20 11:15:48 +0100
commit649ae829220d6ddd8758d24c3bc2ea7d43e788d6 (patch)
treeca5bccce3a8ac04a96fc795b06bc40d08384286d /parser/dump_test.go
parent5da3a651ba08859ccc1cdf1094603411696c8df2 (diff)
feat: Add simple Dump creation and recovery.
Memory Dump functionality that can restore the previous VM state. It dumps *global* variables, the only ones defining the program state. The dump depends on the program itself, and on the index system, which right now is defined by the variable order. Signed-off-by: Antonio Navarro Perez <antnavper@gmail.com>
Diffstat (limited to 'parser/dump_test.go')
-rw-r--r--parser/dump_test.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/parser/dump_test.go b/parser/dump_test.go
new file mode 100644
index 0000000..db86c48
--- /dev/null
+++ b/parser/dump_test.go
@@ -0,0 +1,48 @@
+package parser_test
+
+import (
+ "testing"
+
+ "github.com/mvertes/parscan/parser"
+)
+
+func TestDump(t *testing.T) {
+ initProgram := "var a int = 2+1; a"
+ interp := parser.NewInterpreter(GoScanner)
+ r, e := interp.Eval(initProgram)
+ t.Log(r, e)
+ if e != nil {
+ t.Fatal(e)
+ }
+
+ r, e = interp.Eval("a = 100")
+ t.Log(r, e)
+ if e != nil {
+ t.Fatal(e)
+ }
+
+ d := interp.Dump()
+ t.Log(d)
+
+ interp = parser.NewInterpreter(GoScanner)
+ r, e = interp.Eval(initProgram)
+ t.Log(r, e)
+ if e != nil {
+ t.Fatal(e)
+ }
+
+ e = interp.ApplyDump(d)
+ if e != nil {
+ t.Fatal(e)
+ }
+
+ r, e = interp.Eval("a = a + 1;a")
+ t.Log(r, e)
+ if e != nil {
+ t.Fatal(e)
+ }
+
+ if r.Interface() != int(101) {
+ t.Fatalf("unexpected result: %v", r)
+ }
+}