module Gyehoek.Test.Stack.VM (root) where import Test.Tasty (TestTree, testGroup) import Test.Tasty.HUnit import Gyehoek.Stack.Syntax import Gyehoek.Stack.VM qualified as Sut import Data.List (List) import Control.Lens import Data.Generics.Labels root :: IO TestTree root = pure . testGroup "stack machine" $ [ lit_int , arith ] evalsTo :: List Val -> List Block -> Assertion evalsTo rs bs = Sut.eval (MkProgram bs) @?= rs lit_int = testCase "lit int" do evalsTo [ValLit (LitInt 3)] [ MkBlock "main" [] [ PopCont "ktail" , CallReg "ktail" [ValLit (LitInt 3)] ]] arith = testCase "arith" do evalsTo [ValLit (LitInt 12)] [ MkBlock "main" [] [ PopCont "ktail" , Prim "x1" (PrimAdd (ValLit $ LitInt 3) (ValLit $ LitInt 4)) , CallReg "ktail" [ValReg "x1"] ]]