module Minilang.Lambda.ParserSpec where import Data.Text (Text, pack) import Minilang.Lambda.Parser (AST (..), initialChars, parse, restChars) import Test.Hspec (Spec, parallel, shouldBe) import Test.Hspec.QuickCheck (prop) import Test.QuickCheck (Arbitrary (..), elements, listOf) spec :: Spec spec = parallel $ do prop "parses an identifier as a variable" $ \(Identifier ident) -> parse ident `shouldBe` Right (Sym ident) prop "parses a lambda-expression as an abstraction" $ \(Identifier ident) (Identifier body) -> parse ("(lam (" <> ident <> ") " <> body <> ")") `shouldBe` Right (Abs ident (Sym body)) newtype Identifier = Identifier Text deriving (Eq, Show) instance Arbitrary Identifier where arbitrary = Identifier . pack <$> ((:) <$> elements initialChars <*> listOf (elements restChars))