package creature import "testing" func runMachineTest(program []int, test *testing.T) (machine *Machine) { machine = &Machine { Program: program } err := machine.Execute(0) if err != nil { test.Log("machine exited with error:", err) test.Fail() } return } func TestPush(test *testing.T) { machine := runMachineTest ([]int { PUSH, 654, }, test) result := machine.Pop() test.Log("popped:", result) if result != 654 { test.Log("result should be", 654) test.Fail() } } func TestArithmetic(test *testing.T) { machine := runMachineTest([]int { PUSH, 2, PUSH, 3, ADD, PUSH, 4, PUSH, 10, SUB, PUSH, 7, PUSH, 2, MUL, PUSH, 3, PUSH, 12, DIV, PUSH, 6, PUSH, 8, MOD, }, test) modResult := machine.Pop() divResult := machine.Pop() mulResult := machine.Pop() subResult := machine.Pop() addResult := machine.Pop() test.Log("add:", addResult) test.Log("sub:", subResult) test.Log("mul:", mulResult) test.Log("div:", divResult) test.Log("mod:", modResult) if addResult != 5 { test.Log("add result should be", 5) test.Fail() } if subResult != 6 { test.Log("sub result should be", 6) test.Fail() } if mulResult != 14 { test.Log("mul result should be", 14) test.Fail() } if divResult != 4 { test.Log("div result should be", 4) test.Fail() } if modResult != 2 { test.Log("mod result should be", 2) test.Fail() } } func TestComparison(test *testing.T) { machine := runMachineTest([]int { PUSH, 6, PUSH, 6, EQ, PUSH, 4, PUSH, 324, GT, PUSH, 324, PUSH, 4, LT, PUSH, 6, PUSH, 54, NEQ, }, test) neqResult := machine.Pop() ltResult := machine.Pop() gtResult := machine.Pop() eqResult := machine.Pop() test.Log("eq:", eqResult) test.Log("gt:", gtResult) test.Log("lt:", ltResult) test.Log("neq:", neqResult) if eqResult != 1 { test.Log("eq result should be", 1) test.Fail() } if gtResult != 1 { test.Log("gt result should be", 1) test.Fail() } if ltResult != 1 { test.Log("lt result should be", 1) test.Fail() } if neqResult != 1 { test.Log("neq result should be", 1) test.Fail() } }