diff options
author | Juan J. Martinez <jjm@usebox.net> | 2022-08-15 21:57:48 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2022-08-15 21:57:48 +0100 |
commit | b167fe5295b8e54ed962b59118ce71d3e0cc73fd (patch) | |
tree | 6e49906ac59bf63afc35e96ab54c04eb562f5e3c /test | |
parent | de2acb78940df97bd337bb3e8e366c75739390bc (diff) | |
download | micro-lang-hs-b167fe5295b8e54ed962b59118ce71d3e0cc73fd.tar.gz micro-lang-hs-b167fe5295b8e54ed962b59118ce71d3e0cc73fd.zip |
Some tests for the AST
Diffstat (limited to 'test')
-rw-r--r-- | test/Language.hs | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/test/Language.hs b/test/Language.hs index 9479380..ea387d8 100644 --- a/test/Language.hs +++ b/test/Language.hs @@ -1,11 +1,60 @@ module Language where +import qualified Ast as A import Compiler import Lexer (scan) import Parser (parse) import Test.HUnit +import Text.Parsec (runParser) +import Text.Parsec.Pos (newPos) + +assertAst :: String -> String -> [A.Expr] -> Assertion +assertAst tcase input expected = do + r <- return $ runParser (scan parse) () "test" input + case r of + Left e -> assertFailure $ show e + Right ast -> assertEqual tcase ast expected testCase = TestCase $ do - assertEqual "placeholder" True True + assertAst "parse module" "module main" [A.Module "main" $ newPos "test" 1 1] + assertAst + "parse a function" + "module main\n\ + \def fn() { }" + [ A.Module "main" $ newPos "test" 1 1, + A.Func "fn" [] Nothing [] False False $ newPos "test" 2 1 + ] + assertAst + "parse a function with parameters" + "module main\n\ + \def fn(a: u8) { }" + [ A.Module "main" $ newPos "test" 1 1, + A.Func "fn" [("a", A.Type "u8", newPos "test" 2 8)] Nothing [] False False $ newPos "test" 2 1 + ] + assertAst + "parse a function with return value" + "module main\n\ + \def fn(): u8 { }" + [ A.Module "main" $ newPos "test" 1 1, + A.Func "fn" [] (Just $ A.Type "u8") [] False False $ newPos "test" 2 1 + ] + assertAst + "parse a function call" + "module main\n\ + \def fn() { }\n\ + \fn();" + [ A.Module "main" $ newPos "test" 1 1, + A.Func "fn" [] Nothing [] False False $ newPos "test" 2 1, + A.Call (A.Var "fn" $ newPos "test" 3 1) [] $ newPos "test" 3 1 + ] + assertAst + "parse a function call with arguments" + "module main\n\ + \def fn(a: u8) { }\n\ + \fn(10);" + [ A.Module "main" $ newPos "test" 1 1, + A.Func "fn" [("a", A.Type "u8", newPos "test" 2 8)] Nothing [] False False $ newPos "test" 2 1, + A.Call (A.Var "fn" $ newPos "test" 3 1) [A.Num 10 $ newPos "test" 3 4] $ newPos "test" 3 1 + ] language = [testCase] |