packages feed

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)