tests are running now

This commit is contained in:
sebastian 2023-03-27 20:33:11 +02:00
parent 506d8733d9
commit ad2bd645d9
2 changed files with 101 additions and 95 deletions

View file

@ -1,8 +1,8 @@
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# HLINT ignore "Use camelCase" #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PatternSynonyms #-}
module TestTypeCheckerBidir (testTypeCheckerBidir) where
@ -14,8 +14,7 @@ import Grammar.Par (myLexer, pProgram)
import Renamer.Renamer (rename)
import TypeChecker.RemoveTEVar (RemoveTEVar (rmTEVar))
import TypeChecker.TypeCheckerBidir (typecheck)
import qualified TypeChecker.TypeCheckerIr as T
import TypeChecker.TypeCheckerIr qualified as T
testTypeCheckerBidir = describe "Bidirectional type checker test" $ do
tc_id
@ -30,45 +29,57 @@ testTypeCheckerBidir = describe "Bidirectional type checker test" $ do
tc_mono_case
tc_pol_case
tc_id = specify "Basic identity function polymorphism" $ run
tc_id =
specify "Basic identity function polymorphism" $
run
[ "id : forall a. a -> a;"
, "id x = x;"
, "main = id 4;"
] `shouldSatisfy` ok
]
`shouldSatisfy` ok
tc_double = specify "Addition inference" $ run
["double x = x + x;"] `shouldSatisfy` ok
tc_double =
specify "Addition inference" $
run
["double x = x + x;"]
`shouldSatisfy` ok
tc_add_lam =
specify "Addition lambda inference" $
run
["four = (\\x. x + x) 2;"]
`shouldSatisfy` ok
tc_add_lam = specify "Addition lambda inference" $ run
["four = (\\x. x + x) 2;"] `shouldSatisfy` ok
tc_const = specify "Basic polymorphism with multiple type variables" $ run
tc_const =
specify "Basic polymorphism with multiple type variables" $
run
[ "const : forall a. forall b. a -> b -> a;"
, "const x y = x;"
, "main = const 'a' 65;"
] `shouldSatisfy` ok
]
`shouldSatisfy` ok
tc_simple_rank2 = specify "Simple rank two polymorphism" $ run
tc_simple_rank2 =
specify "Simple rank two polymorphism" $
run
[ "id : forall a. a -> a;"
, "id x = x;"
, "f : forall a. a -> (forall b. b -> b) -> a;"
, "f x g = g x;"
, "main = f 4 id;"
] `shouldSatisfy` ok
]
`shouldSatisfy` ok
tc_rank2 = specify "Rank two polymorphism is ok" $ run
tc_rank2 =
specify "Rank two polymorphism is ok" $
run
[ "const : forall a. forall b. a -> b -> a;"
, "const x y = x;"
, "rank2 : forall a. forall b. a -> (forall c. c -> Int) -> b -> Int;"
, "rank2 x f y = f x + f y;"
, "main = rank2 3 (\\x. const 5 x : forall a. a -> Int) 'h';"
] `shouldSatisfy` ok
]
`shouldSatisfy` ok
tc_identity = describe "(∀b. b → b) should only accept the identity function" $ do
specify "identityᵢₙₜ is rejected" $ run (fs ++ id_int) `shouldNotSatisfy` ok
@ -77,10 +88,8 @@ tc_identity = describe "(∀b. b → b) should only accept the identity function
fs =
[ "f : forall a. a -> (forall b. b -> b) -> a;"
, "f x g = g x;"
, "id : forall a. a -> a;"
, "id x = x;"
, "id_int : Int -> Int;"
, "id_int x = x;"
]
@ -101,7 +110,6 @@ tc_pair = describe "Pair. Type variables in Pair a b typechecked" $ do
[ "data forall a. forall b. Pair (a b) where {"
, " Pair : a -> b -> Pair (a b)"
, "};"
, "main : Pair (Int Char);"
]
wrong = ["main = Pair 'a' 65;"]
@ -121,17 +129,16 @@ tc_tree = describe "Tree. Recursive data type" $ do
correct = ["tree = Node 1 (Node 2 (Leaf 4) (Leaf 5)) (Leaf 3);"]
tc_mono_case = describe "Monomorphic pattern matching" $ do
specify "First wrong case expression rejected"
$ run wrong1 `shouldNotSatisfy` ok
specify "Second wrong case expression rejected"
$ run wrong2 `shouldNotSatisfy` ok
specify "Third wrong case expression rejected"
$ run wrong3 `shouldNotSatisfy` ok
specify "First correct case expression accepted"
$ run correct1 `shouldSatisfy` ok
specify "Second correct case expression accepted"
$ run correct2 `shouldSatisfy` ok
specify "First wrong case expression rejected" $
run wrong1 `shouldNotSatisfy` ok
specify "Second wrong case expression rejected" $
run wrong2 `shouldNotSatisfy` ok
specify "Third wrong case expression rejected" $
run wrong3 `shouldNotSatisfy` ok
specify "First correct case expression accepted" $
run correct1 `shouldSatisfy` ok
specify "Second correct case expression accepted" $
run correct2 `shouldSatisfy` ok
where
wrong1 =
[ "simple : Int -> Int;"
@ -170,16 +177,16 @@ tc_mono_case = describe "Monomorphic pattern matching" $ do
]
tc_pol_case = describe "Polymophic pattern matching" $ do
specify "First wrong case expression rejected"
$ run (fs ++ wrong1) `shouldNotSatisfy` ok
specify "Second wrong case expression rejected"
$ run (fs ++ wrong2) `shouldNotSatisfy` ok
specify "Third wrong case expression rejected"
$ run (fs ++ wrong3) `shouldNotSatisfy` ok
specify "First correct case expression accepted"
$ run (fs ++ correct1) `shouldSatisfy` ok
specify "Second correct case expression accepted"
$ run (fs ++ correct2) `shouldSatisfy` ok
specify "First wrong case expression rejected" $
run (fs ++ wrong1) `shouldNotSatisfy` ok
specify "Second wrong case expression rejected" $
run (fs ++ wrong2) `shouldNotSatisfy` ok
specify "Third wrong case expression rejected" $
run (fs ++ wrong3) `shouldNotSatisfy` ok
specify "First correct case expression accepted" $
run (fs ++ correct1) `shouldSatisfy` ok
specify "Second correct case expression accepted" $
run (fs ++ correct2) `shouldSatisfy` ok
where
fs =
[ "data forall a. List (a) where {"

View file

@ -7,16 +7,15 @@ import Control.Monad ((<=<))
import DoStrings qualified as D
import Grammar.Par (myLexer, pProgram)
import Test.Hspec
import Prelude (Bool (..), Either (..), IO, mapM_, not, ($), (.))
import Prelude (Bool (..), Either (..), IO, foldl1, mapM_, not, ($), (.), (>>))
-- import Test.QuickCheck
import TypeChecker.TypeChecker (typecheck)
import TypeChecker.TypeCheckerHm (typecheck)
main :: IO ()
main = do
mapM_ hspec goods
mapM_ hspec bads
mapM_ hspec bes
testTypeCheckerHm = describe "Hindley-Milner type checker test" $ do
foldl1 (>>) goods
foldl1 (>>) bads
foldl1 (>>) bes
goods =
[ testSatisfy