module FreeC.Frontend.Haskell.SimplifierTests ( testSimplifier ) where
import Control.Monad ( (>=>) )
import Test.Hspec
import FreeC.Frontend.Haskell.Parser
import FreeC.Frontend.Haskell.Simplifier
import FreeC.IR.SrcSpan
import qualified FreeC.IR.Syntax as IR
import FreeC.Monad.Class.Testable
import FreeC.Test.Expectations
import FreeC.Test.Parser
parseAndSimplifyExpr :: String -> Simplifier IR.Expr
parseAndSimplifyExpr = (parseHaskell . mkSrcFile "<test-input>")
>=> simplifyExpr
shouldSimplifyExpr :: String -> String -> Simplifier Expectation
shouldSimplifyExpr input expectedOutput = do
output <- parseAndSimplifyExpr input
expectedOutput' <- parseTestExpr expectedOutput
return (output `shouldBeSimilarTo` expectedOutput')
testSimplifier :: Spec
testSimplifier = describe "FreeC.Frontend.Haskell.Simplifier" $ do
testSimplifyExpr
testSimplifyExpr :: Spec
testSimplifyExpr = context "simplifyExpr" $ do
it
"simplifies single-variable-pattern case expressions to lambda abstractions"
$ shouldSucceedWith
$ do
"case e of { x -> e' }" `shouldSimplifyExpr` "(\\x -> e') e"