46 lines
1.5 KiB
Haskell
46 lines
1.5 KiB
Haskell
module APL.Check_Tests (tests) where
|
|
|
|
import APL.AST (Exp (..))
|
|
import APL.Check (checkExp)
|
|
import Test.Tasty (TestTree, testGroup)
|
|
import Test.Tasty.HUnit (assertFailure, testCase, (@?=))
|
|
|
|
-- Assert that the provided expression should pass the type checker.
|
|
testPos :: Exp -> TestTree
|
|
testPos e =
|
|
testCase (show e) $
|
|
checkExp e @?= Nothing
|
|
|
|
-- Assert that the provided expression should fail the type checker.
|
|
testNeg :: Exp -> TestTree
|
|
testNeg e =
|
|
testCase (show e) $
|
|
case checkExp e of
|
|
Nothing -> assertFailure "expected error"
|
|
Just _ -> pure ()
|
|
|
|
tests :: TestTree
|
|
tests =
|
|
testGroup
|
|
"Checking"
|
|
[
|
|
testPos (CstBool True),
|
|
testNeg (Var "x"),
|
|
testPos (Let "x" (CstInt 3) (CstInt 5)),
|
|
testPos (Let "x" (CstInt 3) (Var "x")),
|
|
testNeg (Let "x" (Var "y") (Var "x")),
|
|
testNeg (Let "x" (CstInt 3) (Var "y")),
|
|
testPos (Add (Sub (CstInt 9) (CstInt 6)) (CstInt 11)),
|
|
testPos (Mul (Div (CstInt 9) (CstInt 3)) (CstInt 1)),
|
|
testNeg (Add (Add (CstInt 1) (Var "x")) (CstInt 1)),
|
|
testPos (If (CstInt 2) (CstInt 2) (CstInt 2)),
|
|
testNeg (If (Var "x") (CstInt 2) (CstInt 2)),
|
|
testNeg (If (CstInt 2) (Var "x") (CstInt 2)),
|
|
testNeg (If (CstInt 2) (CstInt 2) (Var "x")),
|
|
testPos (Lambda "x" (CstInt 5)),
|
|
testPos (Lambda "x" (Var "x")),
|
|
testNeg (Lambda "x" (Var "y")),
|
|
testPos (Apply (Lambda "x" (Var "x")) (CstInt 5)),
|
|
testNeg (Apply (Lambda "x" (Var "x")) (Var "x"))
|
|
]
|