Add more unit tests for Virtual Machine

This commit is contained in:
2021-11-10 20:19:15 +01:00
parent 107e3fa865
commit bae874a97d

View File

@@ -612,3 +612,46 @@ spec = do
let expected = Left "Attempt to pop from empty stack: tried to pop 1 elements, got 0"
actual <- run input
actual `shouldBe` expected
describe "call" $ do
it "pushes return address and previous frame pointer to the stack" $ do
let input = " nop \n\
\ nop \n\
\ call &fun \n\
\ nop \n\
\ halt \n\
\ fun: halt "
-- ┌────┬─ fp points to the beginning of active stack frame
-- 1 0 │
-- │ │
let expected = done [4, -1] 6 0
-- ├───┤
-- │ │
-- │ └─ previous fp
-- └───── return address (points to the next instruction after call)
actual <- run input
actual `shouldBe` expected
it "pushes stack frames in correct order for multiple calls" $ do
let input = " nop \n\
\ call &f \n\
\ halt \n\
\ f: nop \n\
\ push 1 \n\
\ nop \n\
\ call &g \n\
\ halt \n\
\ g: nop \n\
\ call &h \n\
\ h: halt "
-- ┌──────────────────────┬─ fp points to the beginning of active stack frame
-- 6 5 4 3 2 1 0 │
-- │ │
let expected = done [14, 3, 10, 0, 1, 3, -1] 14 5
-- ├──┤ ├──┤ │ ├───┤
-- │ │ │ │ │ │ │
-- │ │ │ │ │ └───┴─ call &f
-- │ │ │ │ └──────── push 1
-- │ │ └──┴─────────── call &g
-- └──┴────────────────── call &h
actual <- run input
actual `shouldBe` expected