summaryrefslogtreecommitdiff
path: root/vm/vm_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vm/vm_test.go')
-rw-r--r--vm/vm_test.go104
1 files changed, 94 insertions, 10 deletions
diff --git a/vm/vm_test.go b/vm/vm_test.go
index 8fa8e71..43333ad 100644
--- a/vm/vm_test.go
+++ b/vm/vm_test.go
@@ -3,6 +3,7 @@ package vm
import (
"fmt"
"log"
+ "reflect"
"testing"
)
@@ -61,7 +62,90 @@ var tests = []struct {
{0, Exit},
},
start: 0, end: 1, mem: "[3]",
-}, { // #01 -- Calling a function defined outside the VM.
+}, { // #01 -- A simple subtraction.
+ code: [][]int64{
+ {0, Push, 2},
+ {0, Push, 3},
+ {0, Sub},
+ {0, Exit},
+ },
+ start: 0, end: 1, mem: "[1]",
+}, { // #02 -- A simple multiplication.
+ code: [][]int64{
+ {0, Push, 3},
+ {0, Push, 2},
+ {0, Mul},
+ {0, Exit},
+ },
+ start: 0, end: 1, mem: "[6]",
+}, { // #03 -- lower.
+ code: [][]int64{
+ {0, Push, 3},
+ {0, Push, 2},
+ {0, Lower},
+ {0, Exit},
+ },
+ start: 0, end: 1, mem: "[true]",
+}, { // #04 -- greater.
+ code: [][]int64{
+ {0, Push, 2},
+ {0, Push, 3},
+ {0, Greater},
+ {0, Exit},
+ },
+ start: 0, end: 1, mem: "[true]",
+}, { // #05 -- equal.
+ code: [][]int64{
+ {0, Push, 2},
+ {0, Push, 3},
+ {0, Equal},
+ {0, Exit},
+ },
+ start: 0, end: 1, mem: "[false]",
+}, { // #06 -- equalSet.
+ code: [][]int64{
+ {0, Push, 2},
+ {0, Push, 3},
+ {0, EqualSet},
+ {0, Exit},
+ },
+ start: 0, end: 2, mem: "[2 false]",
+}, { // #07 -- equalSet.
+ code: [][]int64{
+ {0, Push, 3},
+ {0, Push, 3},
+ {0, EqualSet},
+ {0, Exit},
+ },
+ start: 0, end: 1, mem: "[true]",
+}, { // #08 not.
+ code: [][]int64{
+ {0, Push, 3},
+ {0, Push, 3},
+ {0, Equal},
+ {0, Not},
+ {0, Exit},
+ },
+ start: 0, end: 1, mem: "[false]",
+}, { // #09 pop.
+ code: [][]int64{
+ {0, Push, 3},
+ {0, Push, 2},
+ {0, Pop, 1},
+ {0, Exit},
+ },
+ start: 0, end: 1, mem: "[3]",
+}, { // #10 -- Assign a variable.
+ sym: []Value{{Type: TypeOf(0), Data: reflect.ValueOf(0)}},
+ code: [][]int64{
+ {0, Grow, 1},
+ {0, New, 2, 0},
+ {0, Push, 2},
+ {0, Assign, 1},
+ {0, Exit},
+ },
+ start: 1, end: 2, mem: "[2]",
+}, { // #11 -- Calling a function defined outside the VM.
sym: []Value{ValueOf(fmt.Println), ValueOf("Hello")},
code: [][]int64{
{0, Dup, 0},
@@ -69,7 +153,7 @@ var tests = []struct {
{0, Exit},
},
start: 1, end: 3, mem: "[6 <nil>]",
-}, { // #02 -- Defining and calling a function in VM.
+}, { // #12 -- Defining and calling a function in VM.
code: [][]int64{
{0, Jump, 3}, // 0
{0, Push, 3}, // 1
@@ -79,7 +163,7 @@ var tests = []struct {
{0, Exit}, // 5
},
start: 0, end: 1, mem: "[3]",
-}, { // #03 -- Defining and calling a function in VM.
+}, { // #13 -- Defining and calling a function in VM.
code: [][]int64{
{0, Jump, 3}, // 0
{0, Push, 3}, // 1
@@ -90,7 +174,7 @@ var tests = []struct {
{0, Exit}, // 6
},
start: 0, end: 1, mem: "[3]",
-}, { // #04 -- Defining and calling a function in VM.
+}, { // #14 -- Defining and calling a function in VM.
code: [][]int64{
{0, Jump, 5}, // 0
{0, Push, 3}, // 1
@@ -103,20 +187,20 @@ var tests = []struct {
{0, Exit}, // 8
},
start: 0, end: 1, mem: "[3]",
-}, { // #05 -- Fibonacci numbers, hand written. Showcase recursivity.
+}, { // #15 -- Fibonacci numbers, hand written. Showcase recursivity.
code: [][]int64{
{0, Jump, 19}, // 0
{0, Push, 2}, // 2 [2]
{0, Fdup, -2}, // 1 [2 i]
{0, Lower}, // 3 [true/false]
{0, JumpTrue, 13}, // 4 [], goto 17
- {0, Push, 2}, // 6 [i 2]
- {0, Fdup, -2}, // 5 [i]
+ {0, Push, 2}, // 5 [i 2]
+ {0, Fdup, -2}, // 6 [i]
{0, Sub}, // 7 [(i-2)]
{0, Push, 1}, // 8
{0, Call}, // 9 [fib(i-2)]
- {0, Push, 1}, // 11 [(i-2) i 1]
- {0, Fdup, -2}, // 10 [fib(i-2) i]
+ {0, Push, 1}, // 10 [(i-2) i 1]
+ {0, Fdup, -2}, // 11 [fib(i-2) i]
{0, Sub}, // 12 [(i-2) (i-1)]
{0, Push, 1}, // 13
{0, Call}, // 14 [fib(i-2) fib(i-1)]
@@ -130,7 +214,7 @@ var tests = []struct {
{0, Exit}, // 22
},
start: 0, end: 1, mem: "[8]",
-}, { // #06 -- Fibonacci with some immediate instructions.
+}, { // #16 -- Fibonacci with some immediate instructions.
code: [][]int64{
{0, Jump, 14}, // 0
{0, Fdup, -2}, // 1 [i]