quickspec-2.2: src/QuickSpec/Internal/Testing.hs
-- A type of test case generators.
{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE FunctionalDependencies, DefaultSignatures, GADTs, FlexibleInstances, UndecidableInstances, TypeOperators, DeriveFunctor #-}
module QuickSpec.Internal.Testing where
import QuickSpec.Internal.Prop
import Control.Monad.Trans.Class
import Control.Monad.Trans.State.Strict
import Control.Monad.Trans.Reader
data TestResult testcase =
TestPassed
| TestFailed testcase
| Untestable
deriving (Functor, Eq)
testResult :: TestResult testcase -> TestResult ()
testResult = fmap (const ())
testAnd :: TestResult testcase -> TestResult testcase -> TestResult testcase
TestPassed `testAnd` x = x
x `testAnd` _ = x
testImplies :: TestResult testcase -> TestResult testcase -> TestResult testcase
TestPassed `testImplies` x = x
TestFailed _ `testImplies` _ = TestPassed
Untestable `testImplies` _ = Untestable
class Monad m => MonadTester testcase term m | m -> testcase term where
test :: Prop term -> m (TestResult testcase)
retest :: testcase -> Prop term -> m (TestResult testcase)
default test :: (MonadTrans t, MonadTester testcase term m', m ~ t m') => Prop term -> m (TestResult testcase)
test = lift . test
default retest :: (MonadTrans t, MonadTester testcase term m', m ~ t m') => testcase -> Prop term -> m (TestResult testcase)
retest tc = lift . retest tc
instance MonadTester testcase term m => MonadTester testcase term (StateT s m)
instance MonadTester testcase term m => MonadTester testcase term (ReaderT r m)