2024-05-02 20:33:35 +00:00
module TestParser ( tests ) where
import Test.HUnit
import Parser.Lexer
import Parser.JavaParser
2024-05-03 13:47:41 +00:00
import Ast
2024-05-02 20:33:35 +00:00
2024-05-03 13:47:41 +00:00
testSingleEmptyClass = TestCase $
assertEqual " expect single empty class hello " [ Class " Hello " [] [] ] $
parse [ CLASS , IDENTIFIER " Hello " , LBRACKET , RBRACKET ]
testTwoEmptyClasses = TestCase $
assertEqual " expect two empty classes " [ Class " Class1 " [] [] , Class " Class2 " [] [] ] $
parse [ CLASS , IDENTIFIER " Class1 " , LBRACKET , RBRACKET , CLASS , IDENTIFIER " Class2 " , LBRACKET , RBRACKET ]
2024-05-03 15:47:59 +00:00
testBooleanField = TestCase $
assertEqual " expect class with boolean field " [ Class " WithBool " [] [ VariableDeclaration " boolean " " value " Nothing ] ] $
parse [ CLASS , IDENTIFIER " WithBool " , LBRACKET , BOOLEAN , IDENTIFIER " value " , SEMICOLON , RBRACKET ]
testIntField = TestCase $
assertEqual " expect class with int field " [ Class " WithInt " [] [ VariableDeclaration " int " " value " Nothing ] ] $
parse [ CLASS , IDENTIFIER " WithInt " , LBRACKET , INT , IDENTIFIER " value " , SEMICOLON , RBRACKET ]
2024-05-06 08:16:57 +00:00
testCustomTypeField = TestCase $
assertEqual " expect class with foo field " [ Class " WithFoo " [] [ VariableDeclaration " Foo " " value " Nothing ] ] $
parse [ CLASS , IDENTIFIER " WithFoo " , LBRACKET , IDENTIFIER " Foo " , IDENTIFIER " value " , SEMICOLON , RBRACKET ]
2024-05-06 08:33:37 +00:00
testMultipleDeclarationSameLine = TestCase $
assertEqual " expect class with two int fields " [ Class " TwoInts " [] [ VariableDeclaration " int " " num1 " Nothing , VariableDeclaration " int " " num2 " Nothing ] ] $
parse [ CLASS , IDENTIFIER " TwoInts " , LBRACKET , INT , IDENTIFIER " num1 " , COMMA , IDENTIFIER " num2 " , SEMICOLON , RBRACKET ]
testMultipleDeclarations = TestCase $
assertEqual " expect class with int and char field " [ Class " Multiple " [] [ VariableDeclaration " int " " value " Nothing , VariableDeclaration " char " " letter " Nothing ] ] $
parse [ CLASS , IDENTIFIER " Multiple " , LBRACKET , INT , IDENTIFIER " value " , SEMICOLON , CHAR , IDENTIFIER " letter " , SEMICOLON , RBRACKET ]
2024-05-06 08:09:50 +00:00
testWithModifier = TestCase $
assertEqual " expect class with int field " [ Class " WithInt " [] [ VariableDeclaration " int " " value " Nothing ] ] $
parse [ ABSTRACT , CLASS , IDENTIFIER " WithInt " , LBRACKET , PUBLIC , INT , IDENTIFIER " value " , SEMICOLON , RBRACKET ]
2024-05-06 21:51:33 +00:00
testEmptyMethod = TestCase $
2024-05-06 21:34:03 +00:00
assertEqual " expect class with method " [ Class " WithMethod " [ MethodDeclaration " int " " foo " [] ( Block [] ) ] [] ] $
parse [ CLASS , IDENTIFIER " WithMethod " , LBRACKET , INT , IDENTIFIER " foo " , LBRACE , RBRACE , SEMICOLON , RBRACKET ]
2024-05-06 21:51:33 +00:00
testEmptyPrivateMethod = TestCase $
assertEqual " expect class with method " [ Class " WithMethod " [ MethodDeclaration " int " " foo " [] ( Block [] ) ] [] ] $
parse [ CLASS , IDENTIFIER " WithMethod " , LBRACKET , PRIVATE , INT , IDENTIFIER " foo " , LBRACE , RBRACE , LBRACKET , RBRACKET , RBRACKET ]
testEmptyVoidMethod = TestCase $
assertEqual " expect class with method " [ Class " WithMethod " [ MethodDeclaration " void " " foo " [] ( Block [] ) ] [] ] $
parse [ CLASS , IDENTIFIER " WithMethod " , LBRACKET , VOID , IDENTIFIER " foo " , LBRACE , RBRACE , LBRACKET , RBRACKET , RBRACKET ]
2024-05-07 13:03:04 +00:00
testEmptyMethodWithParam = TestCase $
assertEqual " expect class with method with param " [ Class " WithParam " [ MethodDeclaration " void " " foo " [ ParameterDeclaration " int " " param " ] ( Block [] ) ] [] ] $
parse [ CLASS , IDENTIFIER " WithParam " , LBRACKET , VOID , IDENTIFIER " foo " , LBRACE , INT , IDENTIFIER " param " , RBRACE , SEMICOLON , RBRACKET ]
testEmptyMethodWithParams = TestCase $
assertEqual " expect class with multiple params " [ Class " WithParams " [ MethodDeclaration " void " " foo " [ ParameterDeclaration " int " " p1 " , ParameterDeclaration " Custom " " p2 " ] ( Block [] ) ] [] ] $
parse [ CLASS , IDENTIFIER " WithParams " , LBRACKET , VOID , IDENTIFIER " foo " , LBRACE , INT , IDENTIFIER " p1 " , COMMA , IDENTIFIER " Custom " , IDENTIFIER " p2 " , RBRACE , SEMICOLON , RBRACKET ]
testClassWithMethodAndField = TestCase $
assertEqual " expect class with method and field " [ Class " WithMethodAndField " [ MethodDeclaration " void " " foo " [] ( Block [] ) , MethodDeclaration " int " " bar " [] ( Block [] ) ] [ VariableDeclaration " int " " value " Nothing ] ] $
parse [ CLASS , IDENTIFIER " WithMethodAndField " , LBRACKET , VOID , IDENTIFIER " foo " , LBRACE , RBRACE , LBRACKET , RBRACKET , INT , IDENTIFIER " value " , SEMICOLON , INT , IDENTIFIER " bar " , LBRACE , RBRACE , SEMICOLON , RBRACKET ]
2024-05-07 22:02:38 +00:00
testClassWithConstructor = TestCase $
2024-05-14 10:33:42 +00:00
assertEqual " expect class with constructor " [ Class " WithConstructor " [ MethodDeclaration " void " " <init> " [] ( Block [] ) ] [] ] $
2024-05-07 22:02:38 +00:00
parse [ CLASS , IDENTIFIER " WithConstructor " , LBRACKET , IDENTIFIER " WithConstructor " , LBRACE , RBRACE , LBRACKET , RBRACKET , RBRACKET ]
2024-05-02 20:33:35 +00:00
2024-05-14 08:16:56 +00:00
testEmptyBlock = TestCase $ assertEqual " expect empty block " [ Block [] ] $ parseStatement [ LBRACKET , RBRACKET ]
2024-05-08 08:20:55 +00:00
testBlockWithLocalVarDecl = TestCase $
2024-05-14 08:16:56 +00:00
assertEqual " expect block with local var delcaration " [ Block [ LocalVariableDeclaration $ VariableDeclaration " int " " localvar " Nothing ] ] $
parseStatement [ LBRACKET , INT , IDENTIFIER " localvar " , SEMICOLON , RBRACKET ]
2024-05-08 08:30:50 +00:00
testBlockWithMultipleLocalVarDecls = TestCase $
2024-05-14 08:16:56 +00:00
assertEqual " expect block with multiple local var declarations " [ Block [ LocalVariableDeclaration $ VariableDeclaration " int " " var1 " Nothing , LocalVariableDeclaration $ VariableDeclaration " boolean " " var2 " Nothing ] ] $
parseStatement [ LBRACKET , INT , IDENTIFIER " var1 " , SEMICOLON , BOOLEAN , IDENTIFIER " var2 " , SEMICOLON , RBRACKET ]
2024-05-08 08:37:40 +00:00
testNestedBlocks = TestCase $
2024-05-14 08:16:56 +00:00
assertEqual " expect block with block inside " [ Block [ Block [] ] ] $
parseStatement [ LBRACKET , LBRACKET , RBRACKET , RBRACKET ]
2024-05-08 09:05:02 +00:00
testBlockWithEmptyStatement = TestCase $
2024-05-14 08:16:56 +00:00
assertEqual " expect empty block " [ Block [] ] $
parseStatement [ LBRACKET , SEMICOLON , SEMICOLON , RBRACKET ]
2024-05-08 08:20:55 +00:00
2024-05-08 11:16:00 +00:00
testExpressionIntLiteral = TestCase $
assertEqual " expect IntLiteral " ( IntegerLiteral 3 ) $
parseExpression [ INTEGERLITERAL 3 ]
testFieldWithInitialization = TestCase $
assertEqual " expect Class with initialized field " [ Class " WithInitField " [] [ VariableDeclaration " int " " number " $ Just $ IntegerLiteral 3 ] ] $
parse [ CLASS , IDENTIFIER " WithInitField " , LBRACKET , INT , IDENTIFIER " number " , ASSIGN , INTEGERLITERAL 3 , SEMICOLON , RBRACKET ]
2024-05-08 11:29:10 +00:00
testLocalBoolWithInitialization = TestCase $
2024-05-14 08:16:56 +00:00
assertEqual " expect block with with initialized local var " [ Block [ LocalVariableDeclaration $ VariableDeclaration " boolean " " b " $ Just $ BooleanLiteral False ] ] $
parseStatement [ LBRACKET , BOOLEAN , IDENTIFIER " b " , ASSIGN , BOOLLITERAL False , SEMICOLON , RBRACKET ]
2024-05-08 11:29:10 +00:00
testFieldNullWithInitialization = TestCase $
assertEqual " expect Class with initialized field " [ Class " WithInitField " [] [ VariableDeclaration " Object " " bar " $ Just NullLiteral ] ] $
parse [ CLASS , IDENTIFIER " WithInitField " , LBRACKET , IDENTIFIER " Object " , IDENTIFIER " bar " , ASSIGN , NULLLITERAL , SEMICOLON , RBRACKET ]
2024-05-08 13:52:44 +00:00
testReturnVoid = TestCase $
2024-05-14 08:16:56 +00:00
assertEqual " expect block with return nothing " [ Block [ Return Nothing ] ] $
parseStatement [ LBRACKET , RETURN , SEMICOLON , RBRACKET ]
2024-05-08 11:16:00 +00:00
2024-05-08 14:59:10 +00:00
testExpressionNot = TestCase $
assertEqual " expect expression not " ( UnaryOperation Not ( Reference " boar " ) ) $
parseExpression [ NOT , IDENTIFIER " boar " ]
testExpressionMinus = TestCase $
assertEqual " expect expression minus " ( UnaryOperation Minus ( Reference " boo " ) ) $
parseExpression [ MINUS , IDENTIFIER " boo " ]
2024-05-08 20:57:21 +00:00
testExpressionMultiplication = TestCase $
assertEqual " expect multiplication " ( BinaryOperation Multiplication ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , TIMES , INTEGERLITERAL 3 ]
testExpressionDivision = TestCase $
assertEqual " expect division " ( BinaryOperation Division ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , DIV , INTEGERLITERAL 3 ]
testExpressionModulo = TestCase $
assertEqual " expect modulo operation " ( BinaryOperation Modulo ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , MODULO , INTEGERLITERAL 3 ]
testExpressionAddition = TestCase $
assertEqual " expect addition " ( BinaryOperation Addition ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , PLUS , INTEGERLITERAL 3 ]
testExpressionSubtraction = TestCase $
assertEqual " expect subtraction " ( BinaryOperation Subtraction ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , MINUS , INTEGERLITERAL 3 ]
testExpressionLessThan = TestCase $
assertEqual " expect comparision less than " ( BinaryOperation CompareLessThan ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , LESS , INTEGERLITERAL 3 ]
testExpressionGreaterThan = TestCase $
assertEqual " expect comparision greater than " ( BinaryOperation CompareGreaterThan ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , GREATER , INTEGERLITERAL 3 ]
testExpressionLessThanEqual = TestCase $
assertEqual " expect comparision less than or equal " ( BinaryOperation CompareLessOrEqual ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , LESSEQUAL , INTEGERLITERAL 3 ]
testExpressionGreaterThanOrEqual = TestCase $
assertEqual " expect comparision greater than or equal " ( BinaryOperation CompareGreaterOrEqual ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , GREATEREQUAL , INTEGERLITERAL 3 ]
testExpressionEqual = TestCase $
assertEqual " expect comparison equal " ( BinaryOperation CompareEqual ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , EQUAL , INTEGERLITERAL 3 ]
testExpressionNotEqual = TestCase $
assertEqual " expect comparison equal " ( BinaryOperation CompareNotEqual ( Reference " bar " ) ( IntegerLiteral 3 ) ) $
parseExpression [ IDENTIFIER " bar " , NOTEQUAL , INTEGERLITERAL 3 ]
2024-05-08 22:09:08 +00:00
testExpressionAnd = TestCase $
assertEqual " expect and expression " ( BinaryOperation And ( Reference " bar " ) ( Reference " baz " ) ) $
parseExpression [ IDENTIFIER " bar " , AND , IDENTIFIER " baz " ]
testExpressionXor = TestCase $
assertEqual " expect xor expression " ( BinaryOperation BitwiseXor ( Reference " bar " ) ( Reference " baz " ) ) $
parseExpression [ IDENTIFIER " bar " , XOR , IDENTIFIER " baz " ]
testExpressionOr = TestCase $
assertEqual " expect or expression " ( BinaryOperation Or ( Reference " bar " ) ( Reference " baz " ) ) $
parseExpression [ IDENTIFIER " bar " , OR , IDENTIFIER " baz " ]
2024-05-14 09:34:57 +00:00
testExpressionPostIncrement = TestCase $
assertEqual " expect PostIncrement " ( UnaryOperation PostIncrement ( Reference " a " ) ) $
parseExpression [ IDENTIFIER " a " , INCREMENT ]
testExpressionPostDecrement = TestCase $
assertEqual " expect PostDecrement " ( UnaryOperation PostDecrement ( Reference " a " ) ) $
parseExpression [ IDENTIFIER " a " , DECREMENT ]
testExpressionPreIncrement = TestCase $
assertEqual " expect PreIncrement " ( UnaryOperation PreIncrement ( Reference " a " ) ) $
parseExpression [ INCREMENT , IDENTIFIER " a " ]
testExpressionPreDecrement = TestCase $
assertEqual " expect PreIncrement " ( UnaryOperation PreDecrement ( Reference " a " ) ) $
parseExpression [ DECREMENT , IDENTIFIER " a " ]
2024-05-14 21:14:43 +00:00
testExpressionAssign = TestCase $
2024-05-14 21:35:56 +00:00
assertEqual " expect assign 5 to a " ( StatementExpressionExpression ( Assignment ( Reference " a " ) ( IntegerLiteral 5 ) ) ) $
2024-05-14 21:14:43 +00:00
parseExpression [ IDENTIFIER " a " , ASSIGN , INTEGERLITERAL 5 ]
2024-05-14 21:35:56 +00:00
testExpressionTimesEqual = TestCase $
assertEqual " expect assign and multiplication " ( StatementExpressionExpression ( Assignment ( Reference " a " ) ( BinaryOperation Multiplication ( Reference " a " ) ( IntegerLiteral 5 ) ) ) ) $
parseExpression [ IDENTIFIER " a " , TIMESEQUAL , INTEGERLITERAL 5 ]
testExpressionDivideEqual = TestCase $
assertEqual " expect assign and division " ( StatementExpressionExpression ( Assignment ( Reference " a " ) ( BinaryOperation Division ( Reference " a " ) ( IntegerLiteral 5 ) ) ) ) $
parseExpression [ IDENTIFIER " a " , DIVEQUAL , INTEGERLITERAL 5 ]
testExpressionPlusEqual = TestCase $
assertEqual " expect assign and addition " ( StatementExpressionExpression ( Assignment ( Reference " a " ) ( BinaryOperation Addition ( Reference " a " ) ( IntegerLiteral 5 ) ) ) ) $
parseExpression [ IDENTIFIER " a " , PLUSEQUAL , INTEGERLITERAL 5 ]
testExpressionMinusEqual = TestCase $
assertEqual " expect assign and subtraction " ( StatementExpressionExpression ( Assignment ( Reference " a " ) ( BinaryOperation Subtraction ( Reference " a " ) ( IntegerLiteral 5 ) ) ) ) $
parseExpression [ IDENTIFIER " a " , MINUSEQUAL , INTEGERLITERAL 5 ]
2024-05-08 20:57:21 +00:00
2024-05-14 11:57:01 +00:00
testStatementIfThen = TestCase $
assertEqual " expect empty ifthen " [ If ( Reference " a " ) ( Block [ Block [] ] ) Nothing ] $
parseStatement [ IF , LBRACE , IDENTIFIER " a " , RBRACE , LBRACKET , RBRACKET ]
testStatementIfThenElse = TestCase $
assertEqual " expect empty ifthen " [ If ( Reference " a " ) ( Block [ Block [] ] ) ( Just ( Block [ Block [] ] ) ) ] $
parseStatement [ IF , LBRACE , IDENTIFIER " a " , RBRACE , LBRACKET , RBRACKET , ELSE , LBRACKET , RBRACKET ]
2024-05-14 14:48:45 +00:00
testStatementWhile = TestCase $
assertEqual " expect while " [ While ( Reference " a " ) ( Block [ Block [] ] ) ] $
parseStatement [ WHILE , LBRACE , IDENTIFIER " a " , RBRACE , LBRACKET , RBRACKET ]
2024-05-14 11:57:01 +00:00
2024-05-08 14:59:10 +00:00
2024-05-02 20:33:35 +00:00
tests = TestList [
2024-05-03 13:47:41 +00:00
testSingleEmptyClass ,
2024-05-03 15:47:59 +00:00
testTwoEmptyClasses ,
testBooleanField ,
2024-05-06 08:16:57 +00:00
testIntField ,
2024-05-06 08:33:37 +00:00
testCustomTypeField ,
2024-05-06 08:09:50 +00:00
testMultipleDeclarations ,
2024-05-06 21:34:03 +00:00
testWithModifier ,
2024-05-06 21:51:33 +00:00
testEmptyMethod ,
testEmptyPrivateMethod ,
2024-05-07 13:03:04 +00:00
testEmptyVoidMethod ,
testEmptyMethodWithParam ,
testEmptyMethodWithParams ,
2024-05-07 22:02:38 +00:00
testClassWithMethodAndField ,
2024-05-08 08:20:55 +00:00
testClassWithConstructor ,
testEmptyBlock ,
2024-05-08 08:30:50 +00:00
testBlockWithLocalVarDecl ,
2024-05-08 08:37:40 +00:00
testBlockWithMultipleLocalVarDecls ,
2024-05-08 09:05:02 +00:00
testNestedBlocks ,
2024-05-08 11:16:00 +00:00
testBlockWithEmptyStatement ,
testExpressionIntLiteral ,
2024-05-08 11:29:10 +00:00
testFieldWithInitialization ,
testLocalBoolWithInitialization ,
2024-05-08 13:52:44 +00:00
testFieldNullWithInitialization ,
2024-05-08 14:59:10 +00:00
testReturnVoid ,
testExpressionNot ,
2024-05-08 20:57:21 +00:00
testExpressionMinus ,
testExpressionLessThan ,
testExpressionGreaterThan ,
testExpressionLessThanEqual ,
testExpressionGreaterThanOrEqual ,
testExpressionEqual ,
2024-05-08 22:09:08 +00:00
testExpressionNotEqual ,
testExpressionAnd ,
testExpressionXor ,
2024-05-14 09:34:57 +00:00
testExpressionOr ,
testExpressionPostIncrement ,
testExpressionPostDecrement ,
testExpressionPreIncrement ,
2024-05-14 11:57:01 +00:00
testExpressionPreDecrement ,
2024-05-14 21:14:43 +00:00
testExpressionAssign ,
2024-05-14 21:35:56 +00:00
testExpressionTimesEqual ,
testExpressionTimesEqual ,
testExpressionDivideEqual ,
testExpressionPlusEqual ,
testExpressionMinusEqual ,
2024-05-14 11:57:01 +00:00
testStatementIfThen ,
2024-05-14 14:48:45 +00:00
testStatementIfThenElse ,
testStatementWhile
2024-05-02 20:33:35 +00:00
]