about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-05-20 00:39:42 +0200
committerMel <einebeere@gmail.com>2022-05-20 00:39:42 +0200
commitabebfa047e3ef9bc8fb06d73d0d39d393e51c92c (patch)
tree566ec9f6140b083b3b62affaa0d73d080b98531d
parent360f092fe693f66219891581417026a3cffd2709 (diff)
downloadjinx-abebfa047e3ef9bc8fb06d73d0d39d393e51c92c.tar.zst
jinx-abebfa047e3ef9bc8fb06d73d0d39d393e51c92c.zip
Add Fib test for 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
+}