lazy-lambda-calculus: d634e87dc3c547664fd7b4b10492bd9c93e7ca1a

     1: {-# Language FlexibleInstances #-}
     2: {-# Language MultiParamTypeClasses #-}
     3: {-# Language FlexibleContexts #-}
     4: {-# Language ExistentialQuantification #-}
     5: {-# Language DeriveDataTypeable #-}
     6: 
     7: module Data.Language.LC.Self.Test where
     8: 
     9: import Control.Monad.Partial
    10: import Data.Nat
    11: import Data.Data
    12: import Data.Language.LC
    13: import Data.Language.LC.Test
    14: import Data.Language.LC.Self
    15: import Data.Map
    16: import Data.Maybe
    17: import Data.Typeable
    18: import Data.Test
    19: import Test.LazySmallCheck2012 hiding (Nat, Term, Const)
    20: import Test.LazySmallCheck2012.Core hiding (Term, C, mkTest)
    21: 
    22: import Debug.Trace
    23: 
    24: newtype Wrap a = W a deriving (Eq, Show, Data, Typeable)
    25: 
    26: instance Serial a => Serial (Wrap a) where
    27:   series = cons1 W
    28: 
    29: instance (Encodable a, Show a) => Encodable (Wrap a) where
    30:   mse (W x) = Lam (0 :@ mse x)
    31:   unmse x = eval' (0 :@ 1) [cast' x,
    32:                             Now (F (fmap (valMap W) . (>>= unmse)))]
    33: {-
    34: foo :: (Val a -> Partial (Val a)) -> Val (Wrap a) -> Partial (Val (Wrap a))
    35: foo m f = eval' (0 :@ 1) [Now f, Now (F (>>= bar m))]
    36: 
    37: bar :: (Val a -> Partial (Val a))
    38: bar = Now
    39: -}
    40: encodeDecode :: Encodable a => a -> Partial (Val a)
    41: encodeDecode = decode . mse
    42: 
    43: encodeDecodeIn n x = force n (encodeDecode x) == Just (C x)
    44: 
    45: mkTest :: (Serial a, Eq a, Encodable a) => (a -> Nat) -> Test
    46: mkTest f = Test $ \x -> encodeDecodeIn (f x) x
    47: 
    48: selfTestMap :: Map String Test
    49: selfTestMap = fromList [
    50: 
    51:                 -- Finite enumerations
    52:                 ("()",   mkTest (const 2 :: ()   -> Nat)),
    53: 
    54:                 ("Bool", mkTest (const 3 :: Bool -> Nat)),
    55: 
    56:                 -- Unbounded enumerations
    57:                 ("Nat",  mkTest (3+)),
    58: 
    59:                 -- Finite wrappers
    60:                 ("Wrap ()", mkTest (const 3 :: Wrap () -> Nat))
    61: 
    62:                 --("Partial ()", mkTest (((2+) . laterCount) :: Partial () -> Nat))
    63: 
    64:               ]
    65: 
    66: decodeNat n x = closed x ==> evalN n (mse (S Z) :@ Const Z :@ x) /= Just (C (S Z))
    67: 
    68: 
    69: 
    70: selfTest  = testRunner  selfTestMap
    71: selfTests = testsRunner selfTestMap

Generated by git2html.