Compare commits

...

2 Commits

Author SHA1 Message Date
Patrick Aldis
e462724482 add evaluation tests 2026-01-15 16:01:15 +00:00
Patrick Aldis
b603d9edf9 rename parseLiteral to parseTerm 2026-01-15 15:54:16 +00:00
2 changed files with 14 additions and 3 deletions

View File

@ -55,15 +55,15 @@ eval (UnaryExpr unaryOp a) = lookUpUnaryOp unaryOp (eval a)
parseExpr :: Parser Expr parseExpr :: Parser Expr
parseExpr = parseExpr =
makeExprParser makeExprParser
parseLiteral parseTerm
[ [InfixL (char '/' $> BinaryExpr Divide)] [ [InfixL (char '/' $> BinaryExpr Divide)]
, [InfixL (char '*' $> BinaryExpr Multiply)] , [InfixL (char '*' $> BinaryExpr Multiply)]
, [InfixL (char '+' $> BinaryExpr Add)] , [InfixL (char '+' $> BinaryExpr Add)]
, [InfixL (char '-' $> BinaryExpr Subtract)] , [InfixL (char '-' $> BinaryExpr Subtract)]
] ]
parseLiteral :: Parser Expr parseTerm :: Parser Expr
parseLiteral = parseTerm =
choice choice
[ Literal <$> decimal [ Literal <$> decimal
, between (char '(') (char ')') parseExpr , between (char '(') (char ')') parseExpr

View File

@ -18,6 +18,11 @@ checkParse :: String -> Expr -> Expectation
checkParse text expectedExpr = checkParse text expectedExpr =
parse parseExpr "" text `shouldBe` Right expectedExpr parse parseExpr "" text `shouldBe` Right expectedExpr
checkEval :: String -> Int -> Expectation
checkEval text expectedVal =
fmap eval (parse parseExpr "" text) `shouldBe` Right expectedVal
spec :: Spec spec :: Spec
spec = do spec = do
describe "evaluate expressions" $ do describe "evaluate expressions" $ do
@ -39,5 +44,11 @@ spec = do
checkParse "2+3*5" (BinaryExpr Add (Literal 2) (BinaryExpr Multiply (Literal 3) (Literal 5))) checkParse "2+3*5" (BinaryExpr Add (Literal 2) (BinaryExpr Multiply (Literal 3) (Literal 5)))
checkParse "(2+3)*5" (BinaryExpr Multiply (BinaryExpr Add (Literal 2) (Literal 3)) (Literal 5) ) checkParse "(2+3)*5" (BinaryExpr Multiply (BinaryExpr Add (Literal 2) (Literal 3)) (Literal 5) )
checkParse "((2+3))*5" (BinaryExpr Multiply (BinaryExpr Add (Literal 2) (Literal 3)) (Literal 5) ) checkParse "((2+3))*5" (BinaryExpr Multiply (BinaryExpr Add (Literal 2) (Literal 3)) (Literal 5) )
it "can evaluate expressions correctly" $ do
checkEval "2" 2
checkEval "3*4/2" 6
checkEval "2+3*6" 20
checkEval "1-2+3" (-4)