summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/test
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul/haskell/test')
-rw-r--r--lambda-calcul/haskell/test/Minilang/IOSpec.hs4
-rw-r--r--lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs24
-rw-r--r--lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs3
3 files changed, 23 insertions, 8 deletions
diff --git a/lambda-calcul/haskell/test/Minilang/IOSpec.hs b/lambda-calcul/haskell/test/Minilang/IOSpec.hs
index c4ae13e..14d279d 100644
--- a/lambda-calcul/haskell/test/Minilang/IOSpec.hs
+++ b/lambda-calcul/haskell/test/Minilang/IOSpec.hs
@@ -16,7 +16,7 @@ spec = parallel $
it "evaluates a simple MiniLang 'program' and dumps result" $ \fileName -> do
let outputFileName = fileName <> ".out"
program =
- [ "((lam (x) x) y)"
+ [ "((lam (x y) x) z t)"
]
writeFile fileName (unlines program)
@@ -27,7 +27,7 @@ spec = parallel $
out <- readFile outputFileName
- out `shouldBe` "Var \"y\"\n"
+ out `shouldBe` "Var \"z\"\n"
withTempFile :: (String -> IO ()) -> IO ()
withTempFile =
diff --git a/lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs b/lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs
index df933a4..11cf394 100644
--- a/lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs
+++ b/lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs
@@ -7,9 +7,16 @@ import Test.Hspec (Spec, describe, it, shouldBe)
spec :: Spec
spec = do
- let fix = Lam "x" (App (Var "x") (Var "x"))
+ let fix =
+ Lam
+ "f"
+ ( App
+ (Lam "x" (App (Var "f") (App (Var "x") (Var "x"))))
+ (Lam "x" (App (Var "f") (App (Var "x") (Var "x"))))
+ )
let omega = App fix fix
let term = App (App (Lam "x" (Lam "y" (Var "y"))) omega) (Var "z")
+ let fst' = Lam "x" (Lam "y" (Var "x"))
describe "call-by-value eval" $ do
it "evaluates 'x' as itself" $ do
@@ -18,12 +25,16 @@ spec = do
it "evaluates '((λ x. x) y)' as 'y'" $ do
let term = App (Lam "x" (Var "x")) (Var "y")
eval term [] `shouldBe` Var "y"
- it "evaluates '((λ x y. y) y z t)' as '(z t)'" $ do
+ it "evaluates '((λ x y. y) z t y)' as '(t y)'" $ do
let snd' = Lam "x" (Lam "y" (Var "y"))
- let term = App (App (App snd' (Var "y")) (Var "z")) (Var "t")
- eval term [] `shouldBe` App (Var "z") (Var "t")
+ let term = App (App (App snd' (Var "z")) (Var "t")) (Var "y")
+ eval term [] `shouldBe` App (Var "t") (Var "y")
+ it "evaluates '((λ x y. x) z t)' as 'z'" $ do
+ let term = App (App fst' (Var "z")) (Var "t")
+ eval term [] `shouldBe` Var "z"
it "diverges on evaluating argument bound to ω" $
- shouldDiverge $ eval term []
+ shouldDiverge $
+ eval term []
describe "call-by-need eval" $ do
it "evaluates 'x' as itself" $ do
@@ -31,7 +42,8 @@ spec = do
it "evaluates '(λ x y . y) ⊥ z' as 'z'" $ do
evalNeed term [] `shouldBe` Var "z"
it "diverges on evaluating ω" $
- shouldDiverge $ evalNeed omega []
+ shouldDiverge $
+ evalNeed omega []
shouldDiverge :: Term -> IO ()
shouldDiverge t =
diff --git a/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs b/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs
index d4c90bd..5d3e8ab 100644
--- a/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs
+++ b/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs
@@ -13,6 +13,9 @@ import Test.Hspec (Spec, parallel, shouldBe)
import Test.Hspec.QuickCheck (prop)
import Test.QuickCheck (Arbitrary (..), Gen, NonEmptyList (..), counterexample, elements, forAll, forAllShrink, listOf, oneof, resize, sized, (===), (==>))
+-- ((f x) y) --> (f x y)
+-- (lam (x) (lam (y) y)) --> (lam (x y) y)
+
spec :: Spec
spec = parallel $ do
prop "parses an identifier as a variable" $ \(Identifier ident) ->