module ParserSpec (spec) where import Parser (Expr (Abstraction, Application, Variable), parse) import Test.Hspec spec :: Spec spec = do describe "Parser" $ do it "can parse variable" $ (parse "x") `shouldBe` Right (Variable "x") it "can parse identity abstraction" $ (parse "λx.x") `shouldBe` Right (Abstraction ("x", Variable "x")) it "can parse mockingbird of identity" $ (parse "(λx.x x) (λx.x)") -- (λx.x) (λx.x) -> (λx.x) `shouldBe` Right ( Application ( Abstraction ( "x", Application ( Variable "x", Variable "x" ) ), Abstraction ("x", Variable "x") ) ) it "it can parse successor" $ (parse "λn.λf.λx.f (n f x)") `shouldBe` Right ( Abstraction ( "n", Abstraction ( "f", Abstraction ( "x", Application ( Variable "f", Application ( Application ( Variable "n", Variable "f" ), Variable "x" ) ) ) ) ) )