1 {-# LANGUAGE FlexibleContexts #-}
3 {-# LANGUAGE NoMonomorphismRestriction #-}
4 {-# LANGUAGE Rank2Types #-}
5 {-# LANGUAGE ScopedTypeVariables #-}
6 {-# LANGUAGE TypeOperators #-}
7 {-# OPTIONS_GHC -fno-warn-missing-signatures #-}
8 module Expr.Maybe.Test where
11 import Test.Tasty.HUnit
13 import qualified Control.Arrow as Arrow
14 import qualified Control.Monad as Monad
15 import Data.Functor.Identity
16 import Data.Proxy (Proxy(..))
17 import Data.Text (Text)
18 import Data.Type.Equality ((:~:)(Refl))
19 import Prelude hiding (maybe, not)
21 import Language.Symantic.Repr
22 import Language.Symantic.Expr
23 import Language.Symantic.Type
28 e1 = maybe (bool True) (val not) (just $ bool True)
31 type Ex lam = Expr_Root
33 .|. Expr_Lambda_Val lam
37 ex_from = root_expr_from (Proxy::Proxy (Ex lam)) (Proxy::Proxy lam)
42 Left err -> Left err @?= snd `Arrow.left` expected
43 Right (Exists_Type_and_Repr ty (Forall_Repr r)) ->
45 Left (_, err) -> Right ("…"::String) @?= Left err
46 Right (ty_expected::Type_Root_of_Expr (Ex Identity) h, _::h, _::Text) ->
47 (Monad.>>= (@?= (\(_::Proxy h, err) -> err) `Arrow.left` expected)) $
48 case ty `eq_type` ty_expected of
49 Nothing -> Monad.return $ Left $
50 error_expr (Proxy::Proxy (Ex Identity)) $
51 Error_Expr_Type_mismatch ast
53 (Exists_Type ty_expected)
55 let h = runIdentity $ host_from_expr r
61 -- , (text_from_expr :: Repr_Text Identity h -> Text) r
65 tests = testGroup "Maybe"
66 [ AST "just" [AST "bool" [AST "True" []]] ==> Right
67 ( type_maybe type_bool
73 , AST "bool" [AST "True" []]
74 , AST "var" [AST "x" []]
77 ( type_maybe type_bool
79 , "just (let x0 = True in x0)" )
81 [ AST "bool" [AST "True" []]
85 , AST "not" [AST "var" [AST "x" []]]
93 , "maybe True (\\x0 -> !x0) nothing" )
95 [ AST "bool" [AST "False" []]
99 , AST "not" [AST "var" [AST "x" []]]
102 [ AST "bool" [AST "True" []]
107 , "maybe False (\\x0 -> !x0) (just True)" )