{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Test.Validity.Operations.Identity
( leftIdentityOnElemWithEquality
, leftIdentityOnGenWithEquality
, leftIdentityOnGen
, leftIdentityOnValid
, leftIdentity
, leftIdentityOnArbitrary
, rightIdentityOnElemWithEquality
, rightIdentityOnGenWithEquality
, rightIdentityOnGen
, rightIdentityOnValid
, rightIdentity
, rightIdentityOnArbitrary
, identityOnGen
, identityOnValid
, identity
, identityOnArbitrary
) where
import Data.GenValidity
import Test.QuickCheck
leftIdentityOnElemWithEquality ::
(b -> a -> a)
-> (a -> a -> Bool)
-> b
-> a
-> Bool
leftIdentityOnElemWithEquality op eq b a = (b `op` a) `eq` a
leftIdentityOnGenWithEquality ::
Show a
=> (b -> a -> a)
-> (a -> a -> Bool)
-> b
-> Gen a
-> (a -> [a])
-> Property
leftIdentityOnGenWithEquality op eq b gen s =
forAllShrink gen s $ leftIdentityOnElemWithEquality op eq b
leftIdentityOnGen ::
(Show a, Eq a)
=> (b -> a -> a)
-> b
-> Gen a
-> (a -> [a])
-> Property
leftIdentityOnGen op = leftIdentityOnGenWithEquality op (==)
leftIdentityOnValid ::
(Show a, Eq a, GenValid a) => (b -> a -> a) -> b -> Property
leftIdentityOnValid op b = leftIdentityOnGen op b genValid shrinkValid
leftIdentity :: (Show a, Eq a, GenUnchecked a) => (b -> a -> a) -> b -> Property
leftIdentity op b = leftIdentityOnGen op b genUnchecked shrinkUnchecked
leftIdentityOnArbitrary ::
(Show a, Eq a, Arbitrary a) => (b -> a -> a) -> b -> Property
leftIdentityOnArbitrary op b = leftIdentityOnGen op b arbitrary shrink
rightIdentityOnElemWithEquality ::
(a -> b -> a)
-> (a -> a -> Bool)
-> b
-> a
-> Bool
rightIdentityOnElemWithEquality op eq b a = (a `op` b) `eq` a
rightIdentityOnGenWithEquality ::
Show a
=> (a -> b -> a)
-> (a -> a -> Bool)
-> b
-> Gen a
-> (a -> [a])
-> Property
rightIdentityOnGenWithEquality op eq b gen s =
forAllShrink gen s $ rightIdentityOnElemWithEquality op eq b
rightIdentityOnGen ::
(Show a, Eq a)
=> (a -> b -> a)
-> b
-> Gen a
-> (a -> [a])
-> Property
rightIdentityOnGen op = rightIdentityOnGenWithEquality op (==)
rightIdentityOnValid ::
(Show a, Eq a, GenValid a) => (a -> b -> a) -> b -> Property
rightIdentityOnValid op b = rightIdentityOnGen op b genValid shrinkValid
rightIdentity ::
(Show a, Eq a, GenUnchecked a) => (a -> b -> a) -> b -> Property
rightIdentity op b = rightIdentityOnGen op b genUnchecked shrinkUnchecked
rightIdentityOnArbitrary ::
(Show a, Eq a, Arbitrary a) => (a -> b -> a) -> b -> Property
rightIdentityOnArbitrary op b = rightIdentityOnGen op b arbitrary shrink
identityOnGen ::
(Show a, Eq a) => (a -> a -> a) -> a -> Gen a -> (a -> [a]) -> Property
identityOnGen op e gen s =
leftIdentityOnGen op e gen s .&&. rightIdentityOnGen op e gen s
identityOnValid :: (Show a, Eq a, GenValid a) => (a -> a -> a) -> a -> Property
identityOnValid op a = identityOnGen op a genValid shrinkValid
identity :: (Show a, Eq a, GenUnchecked a) => (a -> a -> a) -> a -> Property
identity op e = identityOnGen op e genUnchecked shrinkUnchecked
identityOnArbitrary ::
(Show a, Eq a, Arbitrary a) => (a -> a -> a) -> a -> Property
identityOnArbitrary op a = identityOnGen op a arbitrary shrink