{-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-} {-# Language CPP #-} module Test.Fin ( finTests , genFin ) where import Numeric.Natural (Natural) import Hedgehog import qualified Hedgehog.Gen as HG import Hedgehog.Range (linear) import Test.Tasty (TestTree, testGroup) import Test.Tasty.HUnit (assertBool, testCase) import Data.Parameterized.NatRepr import Data.Parameterized.Fin import Data.Parameterized.Some (Some(Some)) #if __GLASGOW_HASKELL__ >= 806 import qualified Hedgehog.Classes as HC #endif genFin :: (0 <= n, Monad m) => NatRepr n -> GenT m (Fin n) genFin n = do x0 <- HG.integral (linear 0 ((natValue n) - 1 :: Natural)) Some x <- return (mkNatRepr x0) return $ case testLeq (incNat x) n of Just LeqProof -> mkFin x Nothing -> error "Impossible" finTests :: IO TestTree finTests = testGroup "Fin" <$> return [ testCase "minBound <= maxBound (1)" $ assertBool "minBound <= maxBound (1)" ((minBound :: Fin 1) <= (minBound :: Fin 1)) , testCase "minBound <= maxBound (2)" $ assertBool "minBound <= maxBound (2)" ((minBound :: Fin 2) <= (minBound :: Fin 2)) #if __GLASGOW_HASKELL__ >= 806 , testCase "Eq-Fin-laws-1" $ assertBool "Eq-Fin-laws-1" =<< HC.lawsCheck (HC.eqLaws (genFin (knownNat @1))) , testCase "Ord-Fin-laws-1" $ assertBool "Ord-Fin-laws-1" =<< HC.lawsCheck (HC.ordLaws (genFin (knownNat @1))) , testCase "Eq-Fin-laws-10" $ assertBool "Eq-Fin-laws-10" =<< HC.lawsCheck (HC.eqLaws (genFin (knownNat @10))) , testCase "Ord-Fin-laws-10" $ assertBool "Ord-Fin-laws-10" =<< HC.lawsCheck (HC.ordLaws (genFin (knownNat @10))) #endif ]