2019-12-11 18:29:28 -08:00
import Data.Char ( isAlpha )
2019-12-11 19:21:54 -08:00
import qualified Data.Text as T
2019-12-11 18:29:28 -08:00
import Generic.Random ( genericArbitraryRec , uniform )
import LambdaCalculus.Expression
import LambdaCalculus.Parser
import Test.QuickCheck
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
2019-12-11 19:21:54 -08:00
import TextShow ( showt )
2019-12-11 18:29:28 -08:00
instance Arbitrary Expression where
arbitrary = genericArbitraryRec uniform
2019-12-11 19:21:54 -08:00
instance Arbitrary T . Text where
arbitrary = T . pack <$> listOf1 ( elements $ [ 'A' .. 'Z' ] ++ [ 'a' .. 'z' ] )
2019-12-11 18:29:28 -08:00
dfi :: Expression
dfi = Application d ( Application f i )
where d = Abstraction " x " $ Application ( Variable " x " ) ( Variable " x " )
f = Abstraction " f " $ Application ( Variable " f " ) ( Application ( Variable " f " ) ( Variable " y " ) )
i = Abstraction " x " $ Variable " x "
ttttt :: Expression
ttttt = Application ( Application ( Application f t ) ( Abstraction " x " ( Variable " x " ) ) ) ( Variable " y " )
where t = Abstraction " f " $ Abstraction " x " $
Application ( Variable " f " ) ( Application ( Variable " f " ) ( Variable " x " ) )
f = Abstraction " T " $ Abstraction " f " $ Abstraction " x " $
Application ( Application
( Application ( Variable " T " )
( Application ( Variable " T " )
( Application ( Variable " T " )
( Application ( Variable " T " )
( Variable " T " ) ) ) ) )
( Variable " f " ) )
( Variable " x " )
prop_parseExpression_inverse :: Expression -> Bool
2019-12-11 19:21:54 -08:00
prop_parseExpression_inverse expr = Right expr == parseExpression ( showt expr )
2019-12-11 18:29:28 -08:00
main :: IO ()
main = defaultMain $
testGroup " Tests "
[ testGroup " Evaluator tests "
[ testCase " DFI " $ eagerEval dfi @?= Application ( Variable " y " ) ( Variable " y " )
, testCase " ttttt " $ eagerEval ttttt @?= Variable " y "
]
, testGroup " Parser tests "
[ testGroup " Unit tests "
[ testCase " identity " $ parseExpression " ^x.x " @?= Right ( Abstraction " x " $ Variable " x " )
, testCase " application shorthand " $ parseExpression " a b c d " @?= Right ( Application ( Application ( Application ( Variable " a " ) ( Variable " b " ) ) ( Variable " c " ) ) ( Variable " d " ) )
, testCase " ttttt " $ parseExpression " (^T f x.(T (T (T (T T)))) f x) (^f x.f (f x)) (^x.x) y "
@?= Right ttttt
]
, testProperty " parseExpression is the left inverse of show " prop_parseExpression_inverse
]
]