diff options
| author | Mel <einebeere@gmail.com> | 2022-05-20 00:39:42 +0200 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2022-05-20 00:39:42 +0200 |
| commit | abebfa047e3ef9bc8fb06d73d0d39d393e51c92c (patch) | |
| tree | 566ec9f6140b083b3b62affaa0d73d080b98531d /pkg/lang/vm | |
| parent | 360f092fe693f66219891581417026a3cffd2709 (diff) | |
| download | jinx-abebfa047e3ef9bc8fb06d73d0d39d393e51c92c.tar.zst jinx-abebfa047e3ef9bc8fb06d73d0d39d393e51c92c.zip | |
Add Fib test for VM
Diffstat (limited to 'pkg/lang/vm')
| -rw-r--r-- | pkg/lang/vm/vm_test.go | 86 |
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 +} |
