tasty-quickcheck-laws-0.0.1: src/Test/Tasty/QuickCheck/Laws/Eq.hs
{- |
Module : Test.Tasty.QuickCheck.Laws.Eq
Description : Prefab tasty trees of quickcheck properties for the Eq laws
Copyright : 2018, Automattic, Inc.
License : GPL-3
Maintainer : Nathan Bloomfield (nbloomf@gmail.com)
Stability : experimental
Portability : POSIX
-}
module Test.Tasty.QuickCheck.Laws.Eq (
testEqLaws
-- * Eq Laws
, testEqLawReflexive
, testEqLawSymmetric
, testEqLawTransitive
) where
import Data.Proxy
( Proxy(..) )
import Data.Typeable
( Typeable, typeRep )
import Test.Tasty
( TestTree, testGroup )
import Test.Tasty.QuickCheck
( testProperty, Property, Arbitrary(..) )
import Test.Tasty.QuickCheck.Laws.Class
-- | Constructs a @TestTree@ checking that the @Eq@ class laws hold for @a@.
testEqLaws
:: (Eq a, Show a, Arbitrary a, Typeable a)
=> Proxy a
-> TestTree
testEqLaws pa =
let label = "Eq Laws for " ++ (show $ typeRep pa) in
testGroup label
[ testEqLawReflexive pa
, testEqLawSymmetric pa
, testEqLawTransitive pa
]
-- | @a == a@
testEqLawReflexive
:: (Eq a, Show a, Arbitrary a)
=> Proxy a
-> TestTree
testEqLawReflexive pa =
testProperty "a == a" $
eqLawReflexive pa
eqLawReflexive
:: (Eq a)
=> Proxy a
-> a -> Bool
eqLawReflexive _ a =
a == a
-- | @(a == b) == (b == a)@
testEqLawSymmetric
:: (Eq a, Show a, Arbitrary a)
=> Proxy a
-> TestTree
testEqLawSymmetric pa =
testProperty "(a == b) == (b == a)" $
eqLawSymmetric pa
eqLawSymmetric
:: (Eq a)
=> Proxy a
-> a -> a -> Bool
eqLawSymmetric _ a b =
(a == b) == (b == a)
-- | @if (a == b) && (b == c) then (a == c)@
testEqLawTransitive
:: (Eq a, Show a, Arbitrary a)
=> Proxy a
-> TestTree
testEqLawTransitive pa =
testProperty "if (a == b) && (b == c) then (a == c)" $
eqLawTransitive pa
eqLawTransitive
:: (Eq a)
=> Proxy a
-> a -> a -> a -> Bool
eqLawTransitive _ a b c =
if (a == b) && (b == c) then a == c else True