packages feed

rebound-0.1.0.0: test/Examples/PureSystemF.hs

module Examples.PureSystemF where

import Data.Fin (f0, f1)
import PureSystemF
import Rebound (LocalName (..))
import Rebound.Bind.Local (bind)
import Test.Tasty
import Test.Tasty.HUnit

pureTC t = runTC emptyEnv $ inferType t

bbNat = TAll $ bind (LocalName "X") $ TArr (TArr (Var f0) (Var f0)) (TArr (Var f0) (Var f0))

all :: TestTree
all =
  testGroup
    "SystemF"
    [ testGroup
        "Diadic"
        -- TODO: add test cases
        [],
      testGroup
        "Pure"
        [ testCase "Pretty-print t0" $ show t0 @?= "ΛX. λx. x",
          testCase "Pretty-print t1" $ show t1 @?= "ΛX. λf. λx. f [X] x",
          testCase "Pretty-print t2" $ show t2 @?= "λX. λx. x",
          testCase "Infer t0" $
            pureTC t0
              @?= Right (TAll $ bind (LocalName "X") (TArr (Var f0) (Var f0))),
          testCase "Infer t1" $
            pureTC t1
              @?= Right
                ( TAll $
                    bind
                      (LocalName "X")
                      ( TArr
                          (TAll $ bind (LocalName "Y") (TArr (Var f0) (Var f0)))
                          (TArr (Var f0) (Var f0))
                      )
                ),
          testCase "Infer t2" $ pureTC t2 @?= Left "Term variable occurs in type",
          testCase "Infer Boehm-Berarducci Nat 0" $ pureTC bbn0 @?= Right bbNat,
          testCase "Infer Boehm-Berarducci Nat 1" $ pureTC bbn1 @?= Right bbNat,
          testCase "Infer Boehm-Berarducci Nat 2" $ pureTC bbn2 @?= Right bbNat
        ]
    ]