quickcheck-higherorder-0.1.0.0: src/Test/QuickCheck/HigherOrder/Internal/Testable/Class.hs
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Test.QuickCheck.HigherOrder.Internal.Testable.Class where
import Test.QuickCheck
import Test.QuickCheck.HigherOrder.Internal.Constructible
-- * An alternative Testable
-- | Types that represent testable properties.
--
-- This is a clone of the 'Testable' class with an improved function instance.
class Testable' prop where
property' :: prop -> Property
-- * Helpers
-- | Equivalent to 'property'' specialized to functions:
-- convert a function to a 'Property'.
forAll_
:: forall a prop
. (Constructible a, Testable' prop)
=> (a -> prop) -> Property
forAll_ f =
forAllShrinkShow
(arbitrary @(Repr a))
(shrink @(Repr a))
(show @(Repr a))
(property' . f . fromRepr)
-- | A 'Property' is the canonical type of testable properties.
--
-- > property' @Property = property @Property = id
instance Testable' Property where
property' = id
instance Testable' Bool where
property' = property
-- | A generator represents a universally quantified property.
instance Testable' a => Testable' (Gen a) where
property' = property . fmap property'
-- | A function represents a universally quantified property.
instance (Constructible a, Testable' b) => Testable' (a -> b) where
property' = forAll_