Clean up and list SKI conversion fix
This commit is contained in:
46
test/Spec.hs
46
test/Spec.hs
@ -21,8 +21,8 @@ import qualified Data.Set as Set
|
||||
main :: IO ()
|
||||
main = defaultMain tests
|
||||
|
||||
runTricu :: String -> String
|
||||
runTricu s = show $ result (evalTricu Map.empty $ parseTricu s)
|
||||
tricuTestString :: String -> String
|
||||
tricuTestString s = show $ result (evalTricu Map.empty $ parseTricu s)
|
||||
|
||||
tests :: TestTree
|
||||
tests = testGroup "Tricu Tests"
|
||||
@ -266,7 +266,7 @@ simpleEvaluation = testGroup "Evaluation Tests"
|
||||
, testCase "Immutable definitions" $ do
|
||||
let input = "x = t t\nx = t\nx"
|
||||
env = evalTricu Map.empty (parseTricu input)
|
||||
result <- try (evaluate (runTricu input)) :: IO (Either SomeException String)
|
||||
result <- try (evaluate (tricuTestString input)) :: IO (Either SomeException String)
|
||||
case result of
|
||||
Left _ -> return ()
|
||||
Right _ -> assertFailure "Expected evaluation error"
|
||||
@ -283,84 +283,84 @@ lambdas :: TestTree
|
||||
lambdas = testGroup "Lambda Evaluation Tests"
|
||||
[ testCase "Lambda Identity Function" $ do
|
||||
let input = "id = (x : x)\nid t"
|
||||
runTricu input @?= "Leaf"
|
||||
tricuTestString input @?= "Leaf"
|
||||
|
||||
, testCase "Lambda Constant Function (K combinator)" $ do
|
||||
let input = "k = (x y : x)\nk t (t t)"
|
||||
runTricu input @?= "Leaf"
|
||||
tricuTestString input @?= "Leaf"
|
||||
|
||||
, testCase "Lambda Application with Variable" $ do
|
||||
let input = "id = (x : x)\nval = t t\nid val"
|
||||
runTricu input @?= "Stem Leaf"
|
||||
tricuTestString input @?= "Stem Leaf"
|
||||
|
||||
, testCase "Lambda Application with Multiple Arguments" $ do
|
||||
let input = "apply = (f x y : f x y)\nk = (a b : a)\napply k t (t t)"
|
||||
runTricu input @?= "Leaf"
|
||||
tricuTestString input @?= "Leaf"
|
||||
|
||||
, testCase "Nested Lambda Application" $ do
|
||||
let input = "apply = (f x y : f x y)\nid = (x : x)\napply (f x : f x) id t"
|
||||
runTricu input @?= "Leaf"
|
||||
tricuTestString input @?= "Leaf"
|
||||
|
||||
, testCase "Lambda with a complex body" $ do
|
||||
let input = "f = (x : t (t x))\nf t"
|
||||
runTricu input @?= "Stem (Stem Leaf)"
|
||||
tricuTestString input @?= "Stem (Stem Leaf)"
|
||||
|
||||
, testCase "Lambda returning a function" $ do
|
||||
let input = "f = (x : (y : x))\ng = f t\ng (t t)"
|
||||
runTricu input @?= "Leaf"
|
||||
tricuTestString input @?= "Leaf"
|
||||
|
||||
, testCase "Lambda with Shadowing" $ do
|
||||
let input = "f = (x : (x : x))\nf t (t t)"
|
||||
runTricu input @?= "Stem Leaf"
|
||||
tricuTestString input @?= "Stem Leaf"
|
||||
|
||||
, testCase "Lambda returning another lambda" $ do
|
||||
let input = "k = (x : (y : x))\nk_app = k t\nk_app (t t)"
|
||||
runTricu input @?= "Leaf"
|
||||
tricuTestString input @?= "Leaf"
|
||||
|
||||
, testCase "Lambda with free variables" $ do
|
||||
let input = "y = t t\nf = (x : y)\nf t"
|
||||
runTricu input @?= "Stem Leaf"
|
||||
tricuTestString input @?= "Stem Leaf"
|
||||
|
||||
, testCase "SKI Composition" $ do
|
||||
let input = "s = (x y z : x z (y z))\nk = (x y : x)\ni = (x : x)\ncomp = s k i\ncomp t (t t)"
|
||||
runTricu input @?= "Stem (Stem Leaf)"
|
||||
tricuTestString input @?= "Stem (Stem Leaf)"
|
||||
|
||||
, testCase "Lambda with multiple parameters and application" $ do
|
||||
let input = "f = (a b c : t a b c)\nf t (t t) (t t t)"
|
||||
runTricu input @?= "Stem Leaf"
|
||||
tricuTestString input @?= "Stem Leaf"
|
||||
|
||||
, testCase "Lambda with nested application in the body" $ do
|
||||
let input = "f = (x : t (t (t x)))\nf t"
|
||||
runTricu input @?= "Stem (Stem (Stem Leaf))"
|
||||
tricuTestString input @?= "Stem (Stem (Stem Leaf))"
|
||||
|
||||
, testCase "Lambda returning a function and applying it" $ do
|
||||
let input = "f = (x : (y : t x y))\ng = f t\ng (t t)"
|
||||
runTricu input @?= "Fork Leaf (Stem Leaf)"
|
||||
tricuTestString input @?= "Fork Leaf (Stem Leaf)"
|
||||
|
||||
, testCase "Lambda applying a variable" $ do
|
||||
let input = "id = (x : x)\na = t t\nid a"
|
||||
runTricu input @?= "Stem Leaf"
|
||||
tricuTestString input @?= "Stem Leaf"
|
||||
|
||||
, testCase "Nested lambda abstractions in the same expression" $ do
|
||||
let input = "f = (x : (y : x y))\ng = (z : z)\nf g t"
|
||||
runTricu input @?= "Leaf"
|
||||
tricuTestString input @?= "Leaf"
|
||||
|
||||
, testCase "Lambda applied to string literal" $ do
|
||||
let input = "f = (x : x)\nf \"hello\""
|
||||
runTricu input @?= "Fork (Fork Leaf (Fork Leaf (Fork Leaf (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) (Fork (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork Leaf (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) (Fork (Fork Leaf (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) (Fork (Fork Leaf (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) (Fork (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) Leaf))))"
|
||||
tricuTestString input @?= "Fork (Fork Leaf (Fork Leaf (Fork Leaf (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) (Fork (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork Leaf (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) (Fork (Fork Leaf (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) (Fork (Fork Leaf (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) (Fork (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork (Stem Leaf) Leaf))))))) Leaf))))"
|
||||
|
||||
|
||||
, testCase "Lambda applied to integer literal" $ do
|
||||
let input = "f = (x : x)\nf 42"
|
||||
runTricu input @?= "Fork Leaf (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) Leaf)))))"
|
||||
tricuTestString input @?= "Fork Leaf (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) (Fork Leaf (Fork (Stem Leaf) Leaf)))))"
|
||||
|
||||
, testCase "Lambda applied to list literal" $ do
|
||||
let input = "f = (x : x)\nf [t (t t)]"
|
||||
runTricu input @?= "Fork Leaf (Fork (Stem Leaf) Leaf)"
|
||||
tricuTestString input @?= "Fork Leaf (Fork (Stem Leaf) Leaf)"
|
||||
|
||||
, testCase "Lambda containing list literal" $ do
|
||||
let input = "(a : [(a)]) 1"
|
||||
runTricu input @?= "Fork (Fork (Stem Leaf) Leaf) Leaf"
|
||||
tricuTestString input @?= "Fork (Fork (Stem Leaf) Leaf) Leaf"
|
||||
]
|
||||
|
||||
providedLibraries :: TestTree
|
||||
|
Reference in New Issue
Block a user