pyrites/haskell-experiments/test/Test/ArithmeticParserSpec.hs

31 lines
1.1 KiB
Haskell
Raw Normal View History

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# HLINT ignore "Use const" #-}
{-# HLINT ignore "Unused LANGUAGE pragma" #-}
{-# HLINT ignore "Avoid lambda" #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
{-# LANGUAGE TypeApplications #-}
module Test.ArithmeticParserSpec where
import Test.Hspec
import ArithmeticParser
spec :: Spec
spec = do
describe "evaluate expressions" $ do
it "with basic arithmetic on literals" $ do
parseExpr "42" `shouldBe` Right (ENumber 42)
parseExpr "-7 + 3" `shouldBe` Right ( EAdd (ENumber (-7)) (ENumber 3))
parseExpr "2 * (3 + 4)" `shouldBe` Right ( EMul (ENumber 2) (EAdd (ENumber 3) (ENumber 4)))
parseExpr "10 - 2 * 3" `shouldBe` Right (ESub (ENumber 10) (EMul (ENumber 2) (ENumber 3)))
parseExpr "(8 / 2) + 1" `shouldBe` Right (EAdd (EDiv (ENumber 8) (ENumber 2)) (ENumber 1))
parseExpr "2 + 3 * (10 - 4)" `shouldBe` Right (EAdd (ENumber 2) (EMul (ENumber 3) (ESub (ENumber 10) (ENumber 4))))