1 {-# LANGUAGE ConstraintKinds #-}
 
   2 {-# LANGUAGE FlexibleContexts #-}
 
   3 {-# LANGUAGE OverloadedStrings #-}
 
   4 {-# LANGUAGE Rank2Types #-}
 
   5 {-# LANGUAGE ScopedTypeVariables #-}
 
   6 {-# LANGUAGE TypeOperators #-}
 
   8 module Repr.Host.Test where
 
  10 -- import Data.Function (($))
 
  11 -- import Data.Functor.Identity (Identity)
 
  13 import Test.Tasty.HUnit
 
  15 import Data.Functor.Identity
 
  16 import Data.Text (Text)
 
  17 import qualified Data.Text as Text
 
  18 import Prelude hiding (and, not, or, Monad(..))
 
  20 import Language.Symantic.Repr
 
  21 import Language.Symantic.Expr
 
  22 import qualified Expr.Lambda.Test as Lambda.Test
 
  23 import qualified Expr.Bool.Test as Bool.Test
 
  24 import qualified Expr.Maybe.Test as Maybe.Test
 
  25 import qualified Expr.If.Test as If.Test
 
  26 import qualified Expr.List.Test as List.Test
 
  27 import qualified Expr.Functor.Test as Functor.Test
 
  28 import qualified Expr.Applicative.Test as Applicative.Test
 
  31 tests = testGroup "Host" $
 
  33         let (==>) (expr::forall repr. Sym_of_Expr (Expr_Root (  Expr_Lambda_App Identity
 
  34                                                             .|. Expr_Lambda_Val Identity
 
  36                                                             )) repr => repr h) expected =
 
  37                 testCase (Text.unpack $ (text_from_expr :: Repr_Text Identity _h -> Text) $ expr) $
 
  38                 -- (>>= (@?= expected)) $
 
  39                 (\(Identity a) -> (a @?= expected)) $
 
  40                 host_from_expr expr in
 
  41          [ Bool.Test.e1 ==> False
 
  42          , Bool.Test.e2 ==> True
 
  43          , Bool.Test.e3 ==> True
 
  44          , Bool.Test.e4 ==> True
 
  46  , testGroup "Lambda" $
 
  47         let (==>) (expr::forall repr. Sym_of_Expr (Expr_Root (  Expr_Lambda_App Identity
 
  48                                                             .|. Expr_Lambda_Val Identity
 
  50                                                             )) repr => repr h) expected =
 
  51                 testCase (Text.unpack $ (text_from_expr :: Repr_Text Identity _h -> Text) $ expr) $
 
  52                 (\(Identity a) -> (a @?= expected)) $
 
  53                 host_from_expr expr in
 
  54          [ (Lambda.Test.e1 `app` bool True  `app` bool True)  ==> False
 
  55          , (Lambda.Test.e1 `app` bool True  `app` bool False) ==> True
 
  56          , (Lambda.Test.e1 `app` bool False `app` bool True)  ==> True
 
  57          , (Lambda.Test.e1 `app` bool False `app` bool False) ==> False
 
  59          , (Lambda.Test.e2 `app` bool True  `app` bool True)  ==> False
 
  60          , (Lambda.Test.e2 `app` bool True  `app` bool False) ==> True
 
  61          , (Lambda.Test.e2 `app` bool False `app` bool True)  ==> True
 
  62          , (Lambda.Test.e2 `app` bool False `app` bool False) ==> False
 
  64          , Lambda.Test.e3 ==> True
 
  65          , Lambda.Test.e4 ==> True
 
  67          , (Lambda.Test.e5 `app` bool True  `app` bool True)  ==> True
 
  68          , (Lambda.Test.e5 `app` bool True  `app` bool False) ==> False
 
  69          , (Lambda.Test.e5 `app` bool False `app` bool True)  ==> False
 
  70          , (Lambda.Test.e5 `app` bool False `app` bool False) ==> False
 
  72          , Lambda.Test.e6 ==> False
 
  73          , (Lambda.Test.e7 `app` val id) ==> True
 
  74          , (Lambda.Test.e7 `app` val not) ==> False
 
  77         let (==>) (expr::forall repr. Sym_of_Expr (Expr_Root (  Expr_Lambda_App Identity
 
  78                                                             .|. Expr_Lambda_Val Identity
 
  79                                                             .|. Expr_Maybe Identity
 
  80                                                             .|. Expr_Bool )) repr => repr h) expected =
 
  81                 testCase (Text.unpack $ (text_from_expr :: Repr_Text Identity _h -> Text) $ expr) $
 
  82                 (\(Identity a) -> (a @?= expected)) $
 
  83                 host_from_expr expr in
 
  84          [ Maybe.Test.e1 ==> False
 
  87         let (==>) (expr::forall repr. Sym_of_Expr (Expr_Root (  Expr_Lambda_App Identity
 
  88                                                             .|. Expr_Lambda_Val Identity
 
  90                                                             .|. Expr_Bool )) repr => repr h) expected =
 
  91                 testCase (Text.unpack $ (text_from_expr :: Repr_Text Identity _h -> Text) $ expr) $
 
  92                 (\(Identity a) -> (a @?= expected)) $
 
  93                 host_from_expr expr in
 
  94          [ If.Test.e1 ==> False
 
  97         let (==>) (expr::forall repr. Sym_of_Expr (Expr_Root (  Expr_Lambda_App Identity
 
  98                                                             .|. Expr_Lambda_Val Identity
 
  99                                                             .|. Expr_List Identity
 
 103                                                             .|. Expr_Eq )) repr => repr h) expected =
 
 104                 testCase (Text.unpack $ (text_from_expr :: Repr_Text Identity _h -> Text) $ expr) $
 
 105                 (\(Identity a) -> (a @?= expected)) $
 
 106                 host_from_expr expr in
 
 107          [ List.Test.e1 ==> [2::Int,4]
 
 109  , testGroup "Functor" $
 
 110         let (==>) (expr::forall repr. Sym_of_Expr (Expr_Root (  Expr_Lambda_App Identity
 
 111                                                             .|. Expr_Lambda_Val Identity
 
 112                                                             .|. Expr_List Identity
 
 113                                                             .|. Expr_Functor Identity
 
 117                                                             .|. Expr_Eq )) repr => repr h) expected =
 
 118                 testCase (Text.unpack $ (text_from_expr :: Repr_Text Identity _h -> Text) $ expr) $
 
 119                 (\(Identity a) -> (a @?= expected)) $
 
 120                 host_from_expr expr in
 
 121          [ Functor.Test.e1 ==> [2::Int,3,4]
 
 123  , testGroup "Applicative" $
 
 124         let (==>) (expr::forall repr. Sym_of_Expr (Expr_Root (  Expr_Lambda_App Identity
 
 125                                                             .|. Expr_Lambda_Val Identity
 
 126                                                             .|. Expr_List Identity
 
 127                                                             .|. Expr_Functor Identity
 
 128                                                             .|. Expr_Applicative Identity
 
 129                                                             .|. Expr_Maybe Identity
 
 133                                                             .|. Expr_Eq )) repr => repr h) expected =
 
 134                 testCase (Text.unpack $ (text_from_expr :: Repr_Text Identity _h -> Text) $ expr) $
 
 135                 (\(Identity a) -> (a @?= expected)) $
 
 136                 host_from_expr expr in
 
 137          [ Applicative.Test.e1 ==> Just (3::Int)