aboutsummaryrefslogtreecommitdiff
path: root/pkg/lang/vm
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/vm')
-rw-r--r--pkg/lang/vm/vm_test.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/pkg/lang/vm/vm_test.go b/pkg/lang/vm/vm_test.go
new file mode 100644
index 0000000..3622e0b
--- /dev/null
+++ b/pkg/lang/vm/vm_test.go
@@ -0,0 +1,86 @@
+package vm_test
+
+import (
+ "jinx/pkg/lang/vm"
+ "jinx/pkg/lang/vm/code"
+ "jinx/pkg/lang/vm/text"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestFibonacci(t *testing.T) {
+ src := `
+ # Array stored in local 0
+ push_array
+
+ push_int 1
+ get_local 0
+ temp_arr_push
+
+ push_int 1
+ get_local 0
+ temp_arr_push
+
+ @fib_loop:
+
+ push_int 1
+
+ get_local 0
+ temp_arr_len
+
+ # Index of the last element stored in local 1
+ sub
+
+ # This is the last element
+ get_local 1
+ get_local 0
+ # Store the last element in local 2
+ index
+
+ push_int 1
+ get_local 1
+ # Index of the second last element stored in local 2
+ sub
+
+ get_local 0
+ # Store the second last element in local 3
+ index
+
+ add
+ get_local 0
+ temp_arr_push
+
+ # Drop local 1, which was the length of the array, which we no longer need
+ drop
+
+ push_int 10
+
+ get_local 0
+ temp_arr_len
+
+ # Jump if the array is larger than 10.
+ lte
+ jt @fib_loop
+ `
+
+ bc := compile(t, src)
+
+ vm := vm.New(&bc)
+ err := vm.Run()
+ require.NoError(t, err)
+
+ res, err := vm.GetResult()
+ require.NoError(t, err)
+
+ require.Equal(t, "[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]", res)
+}
+
+func compile(t *testing.T, src string) code.Code {
+ comp := text.NewCompiler(strings.NewReader(src))
+ bc, err := comp.Compile()
+ require.NoErrorf(t, err, "compilation from text format failed: %s", err)
+
+ return bc
+}