From b167fe5295b8e54ed962b59118ce71d3e0cc73fd Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Mon, 15 Aug 2022 21:57:48 +0100 Subject: Some tests for the AST --- test/Language.hs | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'test/Language.hs') 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] -- cgit v1.2.3