lamb/test/ParserSpec.hs
2026-05-15 02:02:57 -05:00

47 lines
1.4 KiB
Haskell

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")
)
)
)
)
)