aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2022-09-26 11:15:48 +0300
committerJan Tuomi <jans.tuomi@gmail.com>2022-12-05 14:21:53 +0200
commit158b202ba113914a8aa1fc7a8a410d98bfb18f5b (patch)
treee4fda8c15395c16e2116bb33d4f9d317af1ec282 /test
parent98d3f41cd8cebf1c1e26c29f01140d0543ee5853 (diff)
Improve tests
Diffstat (limited to 'test')
-rw-r--r--test/Spec.hs44
-rw-r--r--test/TestUtils.hs20
2 files changed, 43 insertions, 21 deletions
diff --git a/test/Spec.hs b/test/Spec.hs
index db28f39..9011aba 100644
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -2,28 +2,40 @@
import Test.HUnit
import Control.Monad.Except
import qualified Data.Map as M
+import Builtins
import Tokenizer ( tokenize )
import Parser ( parse )
import Evaluator ( evaluate )
-import Builtins
-import TestUtils
import Utils
+import TestUtils
+
+tokenizeTests = TestLabel "tokenize" $ TestList $ map TestCase [
+ do got <- expectSuccessL $ tokenize "(+ 1 (- 10 5))"
+ let expected = ["(", "+", "1", "(", "-", "10", "5", ")", ")"]
+ assertEqual "" got expected
+ ]
+
+parseTests = TestLabel "parse" $ TestList $ map TestCase [
+ do got <- expectSuccessL $ parse ["(", "+", "1", "2", ")"]
+ let expected = [ASTFunctionCall [ASTSymbol "+", ASTInteger 1, ASTInteger 2]]
+ assertEqual "" got expected,
+ do got <- expectErrorL $ parse ["(", "+", "1", "2"]
+ let expected = "unbalanced function call"
+ assertEqual "" got expected
+ ]
+
+evaluateTests = TestLabel "evaluate" $ TestList $ map TestCase [
+ do let env = M.fromList [("+", builtinAdd2)] :: Env
+ (gotEnv, gotAST) <- expectSuccessL $ evaluate env (ASTFunctionCall [ASTSymbol "+", ASTInteger 1, ASTInteger 2])
+ let expectedAST = ASTInteger 3
+ assertEqual "" gotAST expectedAST
+ assertEqual "" (M.keys gotEnv) (M.keys env)
+ ]
tests = [
- "tokenize1" ~:
- do got <- runL $ tokenize "(+ 1 (- 10 5))"
- let expected = ["(", "+", "1", "(", "-", "10", "5", ")", ")"]
- assertEqual "" got expected,
- "parse1" ~:
- do got <- runL $ parse ["(", "+", "1", "2", ")"]
- let expected = [ASTFunctionCall [ASTSymbol "+", ASTInteger 1, ASTInteger 2]]
- assertEqual "" got expected,
- "evaluate1" ~:
- do let env = M.fromList [("+", builtinAdd2)] :: Env
- (gotEnv, gotAST) <- runL $ evaluate env (ASTFunctionCall [ASTSymbol "+", ASTInteger 1, ASTInteger 2])
- let expectedAST = ASTInteger 3
- assertEqual "" gotAST expectedAST
- assertEqual "" (M.keys gotEnv) (M.keys env)
+ tokenizeTests,
+ parseTests,
+ evaluateTests
]
main :: IO ()
diff --git a/test/TestUtils.hs b/test/TestUtils.hs
index bcb147c..676df1d 100644
--- a/test/TestUtils.hs
+++ b/test/TestUtils.hs
@@ -12,9 +12,19 @@ initialConfig = Config {
configShowHelp = False
}
-runL :: LContext a -> IO a
-runL lc = do res <- runExceptT $ runReaderT lc initialConfig
- case res of
- Left (LException err) -> error err
- Right val -> return val
+testRunL :: LContext a -> IO (Either LException a)
+testRunL lc = runExceptT $ runReaderT lc initialConfig
+expectSuccessL :: LContext a -> IO a
+expectSuccessL lc =
+ do res <- testRunL lc
+ case res of
+ Left (LException err) -> error $ "unexpected error: " ++ err
+ Right val -> return val
+
+expectErrorL :: Show a => LContext a -> IO String
+expectErrorL lc =
+ do res <- testRunL lc
+ case res of
+ Left (LException err) -> return err
+ Right val -> error $ "unexpected success: " ++ show val