genvalidity-hspec 0.2.0.1 → 0.2.0.3
raw patch · 2 files changed
+538/−18 lines, 2 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Test.Validity: alwaysProducesValid3 :: (Show a, Show b, Show c, Show d, GenValidity a, GenValidity b, GenValidity c, Validity d) => (a -> b -> c -> d) -> Property
+ Test.Validity: antisymmetryOnGensEq :: (Show a, Eq a) => (a -> a -> Bool) -> Gen (a, a) -> Property
+ Test.Validity: antisymmetryOnGensWithEquality :: Show a => (a -> a -> Bool) -> Gen (a, a) -> (a -> a -> Bool) -> Property
+ Test.Validity: antisymmetryOnValid :: (Show a, Eq a, GenValidity a) => (a -> a -> Bool) -> Property
+ Test.Validity: associative :: (Show a, Eq a, GenValidity a) => (a -> a -> a) -> Property
+ Test.Validity: associativeOnGens :: (Show a, Eq a) => (a -> a -> a) -> Gen (a, a, a) -> Property
+ Test.Validity: associativeOnValids :: (Show a, Eq a, GenValidity a) => (a -> a -> a) -> Property
+ Test.Validity: commutative :: (Show a, Eq a, GenValidity a) => (a -> a -> a) -> Property
+ Test.Validity: commutativeOnGens :: (Show a, Eq a) => (a -> a -> a) -> Gen (a, a) -> Property
+ Test.Validity: commutativeOnValids :: (Show a, Eq a, GenValidity a) => (a -> a -> a) -> Property
+ Test.Validity: equivalent :: (Show a, Eq a, GenValidity a, Show b, Eq b) => (a -> b) -> (a -> b) -> Property
+ Test.Validity: equivalent2 :: (Show a, Eq a, GenValidity a, Show b, Eq b, GenValidity b, Show c, Eq c) => (a -> b -> c) -> (a -> b -> c) -> Property
+ Test.Validity: equivalentOnGen :: (Show a, Eq a, Show b, Eq b) => (a -> b) -> (a -> b) -> Gen a -> Property
+ Test.Validity: equivalentOnGens2 :: (Show a, Eq a, Show b, Eq b, Show c, Eq c) => (a -> b -> c) -> (a -> b -> c) -> Gen (a, b) -> Property
+ Test.Validity: equivalentOnValid :: (Show a, Eq a, GenValidity a, Show b, Eq b) => (a -> b) -> (a -> b) -> Property
+ Test.Validity: equivalentOnValids2 :: (Show a, Eq a, GenValidity a, Show b, Eq b, GenValidity b, Show c, Eq c) => (a -> b -> c) -> (a -> b -> c) -> Property
+ Test.Validity: genGeneratesInvalid :: (Show a, Validity a) => Gen a -> Property
+ Test.Validity: genGeneratesValid :: (Show a, Validity a) => Gen a -> Property
+ Test.Validity: identity :: (Show a, Eq a, GenValidity a) => (a -> a -> a) -> a -> Property
+ Test.Validity: identityOnGen :: (Show a, Eq a) => (a -> a -> a) -> a -> Gen a -> Property
+ Test.Validity: identityOnValid :: (Show a, Eq a, GenValidity a) => (a -> a -> a) -> a -> Property
+ Test.Validity: inverseFunctions :: (Show a, Eq a, GenValidity a) => (a -> b) -> (b -> a) -> Property
+ Test.Validity: inverseFunctionsIfFirstSucceeds :: (Show a, Eq a, GenValidity a, CanFail f) => (a -> f b) -> (b -> a) -> Property
+ Test.Validity: inverseFunctionsIfFirstSucceedsOnGen :: (Show a, Eq a, CanFail f) => (a -> f b) -> (b -> a) -> Gen a -> Property
+ Test.Validity: inverseFunctionsIfFirstSucceedsOnValid :: (Show a, Eq a, GenValidity a, CanFail f) => (a -> f b) -> (b -> a) -> Property
+ Test.Validity: inverseFunctionsIfSecondSucceeds :: (Show a, Eq a, GenValidity a, CanFail f) => (a -> b) -> (b -> f a) -> Property
+ Test.Validity: inverseFunctionsIfSecondSucceedsOnGen :: (Show a, Eq a, CanFail f) => (a -> b) -> (b -> f a) -> Gen a -> Property
+ Test.Validity: inverseFunctionsIfSecondSucceedsOnValid :: (Show a, Eq a, GenValidity a, CanFail f) => (a -> b) -> (b -> f a) -> Property
+ Test.Validity: inverseFunctionsIfSucceed :: (Show a, Eq a, GenValidity a, CanFail f, CanFail g) => (a -> f b) -> (b -> g a) -> Property
+ Test.Validity: inverseFunctionsIfSucceedOnGen :: (Show a, Eq a, CanFail f, CanFail g) => (a -> f b) -> (b -> g a) -> Gen a -> Property
+ Test.Validity: inverseFunctionsIfSucceedOnValid :: (Show a, Eq a, GenValidity a, CanFail f, CanFail g) => (a -> f b) -> (b -> g a) -> Property
+ Test.Validity: inverseFunctionsOnGen :: (Show a, Eq a) => (a -> b) -> (b -> a) -> Gen a -> Property
+ Test.Validity: inverseFunctionsOnValid :: (Show a, Eq a, GenValidity a) => (a -> b) -> (b -> a) -> Property
+ Test.Validity: leftIdentity :: (Show a, Eq a, GenValidity a) => (b -> a -> a) -> b -> Property
+ Test.Validity: leftIdentityOnGen :: (Show a, Eq a) => (b -> a -> a) -> b -> Gen a -> Property
+ Test.Validity: leftIdentityOnValid :: (Show a, Eq a, GenValidity a) => (b -> a -> a) -> b -> Property
+ Test.Validity: producesValidsOnArbitrary :: (Show a, Show b, Arbitrary a, Validity b) => (a -> b) -> Property
+ Test.Validity: producesValidsOnGens3 :: (Show a, Show b, Show c, Show d, Validity d) => (a -> b -> c -> d) -> Gen a -> Gen b -> Gen c -> Property
+ Test.Validity: producesValidsOnValids3 :: (Show a, Show b, Show c, Show d, GenValidity a, GenValidity b, GenValidity c, Validity d) => (a -> b -> c -> d) -> Property
+ Test.Validity: reflexivityOnGen :: Show a => (a -> a -> Bool) -> Gen a -> Property
+ Test.Validity: reflexivityOnUnchecked :: (Show a, GenValidity a) => (a -> a -> Bool) -> Property
+ Test.Validity: reflexivityOnValid :: (Show a, GenValidity a) => (a -> a -> Bool) -> Property
+ Test.Validity: rightIdentity :: (Show a, Eq a, GenValidity a) => (a -> b -> a) -> b -> Property
+ Test.Validity: rightIdentityOnGen :: (Show a, Eq a) => (a -> b -> a) -> b -> Gen a -> Property
+ Test.Validity: rightIdentityOnValid :: (Show a, Eq a, GenValidity a) => (a -> b -> a) -> b -> Property
+ Test.Validity: transitiveOnGens :: Show a => (a -> a -> Bool) -> Gen (a, a, a) -> Property
+ Test.Validity: transitiveOnUnchecked :: (Show a, GenValidity a) => (a -> a -> Bool) -> Property
+ Test.Validity: transitiveOnValid :: (Show a, GenValidity a) => (a -> a -> Bool) -> Property
+ Test.Validity: validIfSucceedsOnArbitrary :: (Show a, Show b, Show (f b), Arbitrary a, Validity b, CanFail f) => (a -> f b) -> Property
- Test.Validity: arbitraryGeneratesOnlyValid :: (Show a, Validity a, Arbitrary a) => Proxy a -> Property
+ Test.Validity: arbitraryGeneratesOnlyValid :: forall a. (Show a, Validity a, Arbitrary a) => Proxy a -> Property
- Test.Validity: genValidityInvalidGeneratesInvalid :: (Show a, GenValidity a) => Proxy a -> Property
+ Test.Validity: genValidityInvalidGeneratesInvalid :: forall a. (Show a, GenValidity a) => Proxy a -> Property
- Test.Validity: genValidityValidGeneratesValid :: (Show a, GenValidity a) => Proxy a -> Property
+ Test.Validity: genValidityValidGeneratesValid :: forall a. (Show a, GenValidity a) => Proxy a -> Property
- Test.Validity: shrinkProducesOnlyValids :: (Show a, Validity a, Arbitrary a) => Proxy a -> Property
+ Test.Validity: shrinkProducesOnlyValids :: forall a. (Show a, Validity a, Arbitrary a) => Proxy a -> Property
Files
- genvalidity-hspec.cabal +1/−1
- src/Test/Validity.hs +537/−17
genvalidity-hspec.cabal view
@@ -1,5 +1,5 @@ name: genvalidity-hspec-version: 0.2.0.1+version: 0.2.0.3 synopsis: Standard spec's for GenValidity instances description: Please see README.md homepage: https://github.com/NorfairKing/validity#readme
src/Test/Validity.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ScopedTypeVariables #-} module Test.Validity ( module Data.GenValidity , Proxy(Proxy)@@ -11,7 +12,9 @@ -- * Tests for GenValidity instances , genValiditySpec , genValidityValidGeneratesValid+ , genGeneratesValid , genValidityInvalidGeneratesInvalid+ , genGeneratesInvalid -- * Tests for RelativeValidity instances , relativeValiditySpec@@ -25,11 +28,15 @@ -- * Standard tests involving validity , producesValidsOnGen+ , producesValidsOnArbitrary , alwaysProducesValid , producesValidsOnValids , producesValidsOnGens2 , alwaysProducesValid2 , producesValidsOnValids2+ , producesValidsOnGens3+ , alwaysProducesValid3+ , producesValidsOnValids3 -- * Standard tests involving functions that can fail @@ -39,6 +46,7 @@ , failsOnGen , failsOnInvalidInput , validIfSucceedsOnGen+ , validIfSucceedsOnArbitrary , validIfSucceeds , succeedsOnGens2 , succeedsOnValidInput2@@ -46,6 +54,71 @@ , failsOnInvalidInput2 , validIfSucceedsOnGens2 , validIfSucceeds2++ -- * Standard tests involving equivalence of functions++ , equivalentOnGen+ , equivalentOnValid+ , equivalent+ , equivalentOnGens2+ , equivalentOnValids2+ , equivalent2++ -- * Standard tests involving inverse functions++ , inverseFunctionsOnGen+ , inverseFunctionsOnValid+ , inverseFunctions+ , inverseFunctionsIfFirstSucceedsOnGen+ , inverseFunctionsIfFirstSucceedsOnValid+ , inverseFunctionsIfFirstSucceeds+ , inverseFunctionsIfSecondSucceedsOnGen+ , inverseFunctionsIfSecondSucceedsOnValid+ , inverseFunctionsIfSecondSucceeds+ , inverseFunctionsIfSucceedOnGen+ , inverseFunctionsIfSucceedOnValid+ , inverseFunctionsIfSucceed++ -- * Properties of relations++ -- ** Reflexivity+ , reflexivityOnGen+ , reflexivityOnValid+ , reflexivityOnUnchecked++ -- ** Transitivity+ , transitiveOnGens+ , transitiveOnValid+ , transitiveOnUnchecked++ -- ** Antisymmetry+ , antisymmetryOnGensWithEquality+ , antisymmetryOnGensEq+ , antisymmetryOnValid++ -- * Properties of relations++ -- ** Identity element+ , leftIdentityOnGen+ , leftIdentityOnValid+ , leftIdentity+ , rightIdentityOnGen+ , rightIdentityOnValid+ , rightIdentity+ , identityOnGen+ , identityOnValid+ , identity++ -- ** Associativity+ , associativeOnGens+ , associativeOnValids+ , associative++ -- ** Commutativity+ , commutativeOnGens+ , commutativeOnValids+ , commutative+ ) where import Data.Proxy@@ -84,21 +157,19 @@ -- | @arbitrary@ only generates valid data arbitraryGeneratesOnlyValid- :: (Show a, Validity a, Arbitrary a)+ :: forall a. (Show a, Validity a, Arbitrary a) => Proxy a -> Property-arbitraryGeneratesOnlyValid proxy =- forAll arbitrary $ \a ->- (a `asProxyTypeOf` proxy) `shouldSatisfy` isValid+arbitraryGeneratesOnlyValid _ =+ genGeneratesValid (arbitrary :: Gen a) --- | @shrink@ only produces valid data+-- | @shrink@, applied to valid data only produces valid data shrinkProducesOnlyValids- :: (Show a, Validity a, Arbitrary a)+ :: forall a. (Show a, Validity a, Arbitrary a) => Proxy a -> Property-shrinkProducesOnlyValids proxy =- forAll arbitrary $ \a ->- shrink (a `asProxyTypeOf` proxy) `shouldSatisfy` all isValid+shrinkProducesOnlyValids _ =+ genGeneratesValid (shrink <$> arbitrary :: Gen [a]) -- | A @Spec@ that specifies that @genValid@ only generates valid data and that@@ -127,22 +198,38 @@ -- | @genValid@ only generates valid data genValidityValidGeneratesValid- :: (Show a, GenValidity a)+ :: forall a. (Show a, GenValidity a) => Proxy a -> Property-genValidityValidGeneratesValid proxy =- forAll genValid $ \a ->- (a `asProxyTypeOf` proxy) `shouldSatisfy` isValid+genValidityValidGeneratesValid _ =+ genGeneratesValid (genValid :: Gen a) +-- | The given generator generates only valid data points+genGeneratesValid+ :: (Show a, Validity a)+ => Gen a+ -> Property+genGeneratesValid gen =+ forAll gen (`shouldSatisfy` isValid)++ -- | @genValid@ only generates invalid data genValidityInvalidGeneratesInvalid- :: (Show a, GenValidity a)+ :: forall a. (Show a, GenValidity a) => Proxy a -> Property-genValidityInvalidGeneratesInvalid proxy =- forAll genInvalid $ \a ->- (a `asProxyTypeOf` proxy) `shouldNotSatisfy` isValid+genValidityInvalidGeneratesInvalid _ =+ genGeneratesInvalid (genInvalid :: Gen a) +-- | The given generator generates only invalid data points+genGeneratesInvalid+ :: (Show a, Validity a)+ => Gen a+ -> Property+genGeneratesInvalid gen =+ forAll gen (`shouldNotSatisfy` isValid)++ -- | A @Spec@ that specifies that @isValidFor@ implies @isValid@ -- -- In general it is a good idea to add this spec to your test suite if@@ -300,6 +387,14 @@ = forAll gen $ \a -> func a `shouldSatisfy` isValid -- | The function produces valid output when the input is generated by+-- @arbitrary@+producesValidsOnArbitrary+ :: (Show a, Show b, Arbitrary a, Validity b)+ => (a -> b)+ -> Property+producesValidsOnArbitrary = (`producesValidsOnGen` arbitrary)++-- | The function produces valid output when the input is generated by -- @genUnchecked@ alwaysProducesValid :: (Show a, Show b, GenValidity a, Validity b)@@ -339,6 +434,35 @@ producesValidsOnValids2 func = producesValidsOnGens2 func genValid genValid +producesValidsOnGens3+ :: (Show a, Show b, Show c, Show d, Validity d)+ => (a -> b -> c -> d)+ -> Gen a -> Gen b -> Gen c+ -> Property+producesValidsOnGens3 func gen1 gen2 gen3+ = forAll gen1 $ \a ->+ forAll gen2 $ \b ->+ forAll gen3 $ \c ->+ func a b c `shouldSatisfy` isValid++alwaysProducesValid3+ :: (Show a, Show b, Show c, Show d,+ GenValidity a, GenValidity b, GenValidity c,+ Validity d)+ => (a -> b -> c -> d)+ -> Property+alwaysProducesValid3 func+ = producesValidsOnGens3 func genUnchecked genUnchecked genUnchecked++producesValidsOnValids3+ :: (Show a, Show b, Show c, Show d,+ GenValidity a, GenValidity b, GenValidity c,+ Validity d)+ => (a -> b -> c -> d)+ -> Property+producesValidsOnValids3 func+ = producesValidsOnGens3 func genValid genValid genValid+ -- | The function succeeds if the input is generated by the given generator succeedsOnGen :: (Show a, Show b, Show (f b), CanFail f)@@ -385,6 +509,14 @@ Just res -> res `shouldSatisfy` isValid -- | The function produces output that satisfies @isValid@ if it is given input+-- that is generated by @arbitrary@.+validIfSucceedsOnArbitrary+ :: (Show a, Show b, Show (f b), Arbitrary a, Validity b, CanFail f)+ => (a -> f b)+ -> Property+validIfSucceedsOnArbitrary = (`validIfSucceedsOnGen` arbitrary)++-- | The function produces output that satisfies @isValid@ if it is given input -- that is generated by @genUnchecked@. validIfSucceeds :: (Show a, Show b, Show (f b), GenValidity a, Validity b, CanFail f)@@ -392,6 +524,7 @@ -> Property validIfSucceeds = (`validIfSucceedsOnGen` genUnchecked) + succeedsOnGens2 :: (Show a, Show b, Show c, Show (f c), CanFail f)@@ -403,6 +536,7 @@ forAll genB $ \b -> func a b `shouldNotSatisfy` hasFailed + succeedsOnValidInput2 :: (Show a, Show b, Show c, Show (f c), GenValidity a, GenValidity b,@@ -412,6 +546,7 @@ succeedsOnValidInput2 func = succeedsOnGens2 func genValid genValid + failsOnGens2 :: (Show a, Show b, Show c, Show (f c), CanFail f)@@ -423,6 +558,7 @@ forAll genB $ \b -> func a b `shouldSatisfy` hasFailed + failsOnInvalidInput2 :: (Show a, Show b, Show c, Show (f c), GenValidity a, GenValidity b,@@ -433,6 +569,7 @@ = failsOnGens2 func genInvalid genUnchecked .&&. failsOnGens2 func genUnchecked genInvalid + validIfSucceedsOnGens2 :: (Show a, Show b, Show c, Show (f c), Validity c, CanFail f)@@ -446,6 +583,7 @@ Nothing -> return () -- Can happen Just res -> res `shouldSatisfy` isValid + validIfSucceeds2 :: (Show a, Show b, Show c, Show (f c), GenValidity a, GenValidity b,@@ -454,6 +592,388 @@ -> Property validIfSucceeds2 func = validIfSucceedsOnGens2 func genUnchecked genUnchecked++equivalentOnGen+ :: (Show a, Eq a, Show b, Eq b)+ => (a -> b)+ -> (a -> b)+ -> Gen a+ -> Property+equivalentOnGen f g gen =+ forAll gen $ \a ->+ f a `shouldBe` g a++equivalentOnValid+ :: (Show a, Eq a, GenValidity a, Show b, Eq b)+ => (a -> b)+ -> (a -> b)+ -> Property+equivalentOnValid f g+ = equivalentOnGen f g genValid++equivalent+ :: (Show a, Eq a, GenValidity a, Show b, Eq b)+ => (a -> b)+ -> (a -> b)+ -> Property+equivalent f g+ = equivalentOnGen f g genUnchecked++equivalentOnGens2+ :: (Show a, Eq a,+ Show b, Eq b,+ Show c, Eq c)+ => (a -> b -> c)+ -> (a -> b -> c)+ -> Gen (a, b)+ -> Property+equivalentOnGens2 f g gen =+ forAll gen $ \(a, b) ->+ f a b `shouldBe` g a b++equivalentOnValids2+ :: (Show a, Eq a, GenValidity a,+ Show b, Eq b, GenValidity b,+ Show c, Eq c)+ => (a -> b -> c)+ -> (a -> b -> c)+ -> Property+equivalentOnValids2 f g+ = equivalentOnGens2 f g genValid++equivalent2+ :: (Show a, Eq a, GenValidity a,+ Show b, Eq b, GenValidity b,+ Show c, Eq c)+ => (a -> b -> c)+ -> (a -> b -> c)+ -> Property+equivalent2 f g+ = equivalentOnGens2 f g genUnchecked++inverseFunctionsOnGen+ :: (Show a, Eq a)+ => (a -> b)+ -> (b -> a)+ -> Gen a+ -> Property+inverseFunctionsOnGen f g gen =+ forAll gen $ \a ->+ g (f a) `shouldBe` a+++inverseFunctionsOnValid+ :: (Show a, Eq a, GenValidity a)+ => (a -> b)+ -> (b -> a)+ -> Property+inverseFunctionsOnValid f g+ = inverseFunctionsOnGen f g genValid+++inverseFunctions+ :: (Show a, Eq a, GenValidity a)+ => (a -> b)+ -> (b -> a)+ -> Property+inverseFunctions f g+ = inverseFunctionsOnGen f g genUnchecked+++inverseFunctionsIfFirstSucceedsOnGen+ :: (Show a, Eq a, CanFail f)+ => (a -> f b)+ -> (b -> a)+ -> Gen a+ -> Property+inverseFunctionsIfFirstSucceedsOnGen f g gen =+ forAll gen $ \a ->+ case resultIfSucceeded (f a) of+ Nothing -> return () -- fine+ Just b -> g b `shouldBe` a+++inverseFunctionsIfFirstSucceedsOnValid+ :: (Show a, Eq a, GenValidity a, CanFail f)+ => (a -> f b)+ -> (b -> a)+ -> Property+inverseFunctionsIfFirstSucceedsOnValid f g+ = inverseFunctionsIfFirstSucceedsOnGen f g genValid+++inverseFunctionsIfFirstSucceeds+ :: (Show a, Eq a, GenValidity a, CanFail f)+ => (a -> f b)+ -> (b -> a)+ -> Property+inverseFunctionsIfFirstSucceeds f g+ = inverseFunctionsIfFirstSucceedsOnGen f g genUnchecked+++inverseFunctionsIfSecondSucceedsOnGen+ :: (Show a, Eq a, CanFail f)+ => (a -> b)+ -> (b -> f a)+ -> Gen a+ -> Property+inverseFunctionsIfSecondSucceedsOnGen f g gen =+ forAll gen $ \a ->+ case resultIfSucceeded (g (f a)) of+ Nothing -> return () -- fine+ Just r -> r `shouldBe` a+++inverseFunctionsIfSecondSucceedsOnValid+ :: (Show a, Eq a, GenValidity a, CanFail f)+ => (a -> b)+ -> (b -> f a)+ -> Property+inverseFunctionsIfSecondSucceedsOnValid f g+ = inverseFunctionsIfSecondSucceedsOnGen f g genValid+++inverseFunctionsIfSecondSucceeds+ :: (Show a, Eq a, GenValidity a, CanFail f)+ => (a -> b)+ -> (b -> f a)+ -> Property+inverseFunctionsIfSecondSucceeds f g+ = inverseFunctionsIfSecondSucceedsOnGen f g genUnchecked+++inverseFunctionsIfSucceedOnGen+ :: (Show a, Eq a, CanFail f, CanFail g)+ => (a -> f b)+ -> (b -> g a)+ -> Gen a+ -> Property+inverseFunctionsIfSucceedOnGen f g gen =+ forAll gen $ \a ->+ case do fa <- resultIfSucceeded $ f a+ resultIfSucceeded $ g fa+ of+ Nothing -> return () -- fine+ Just r -> r `shouldBe` a+++inverseFunctionsIfSucceedOnValid+ :: (Show a, Eq a, GenValidity a, CanFail f, CanFail g)+ => (a -> f b)+ -> (b -> g a)+ -> Property+inverseFunctionsIfSucceedOnValid f g+ = inverseFunctionsIfSucceedOnGen f g genValid+++inverseFunctionsIfSucceed+ :: (Show a, Eq a, GenValidity a, CanFail f, CanFail g)+ => (a -> f b)+ -> (b -> g a)+ -> Property+inverseFunctionsIfSucceed f g+ = inverseFunctionsIfSucceedOnGen f g genUnchecked++(===>) :: Bool -> Bool -> Bool+(===>) a b = not a || b++reflexivityOnGen+ :: Show a+ => (a -> a -> Bool)+ -> Gen a+ -> Property+reflexivityOnGen func gen =+ forAll gen $ \a ->+ func a a++reflexivityOnValid+ :: (Show a, GenValidity a)+ => (a -> a -> Bool)+ -> Property+reflexivityOnValid func+ = reflexivityOnGen func genValid++reflexivityOnUnchecked+ :: (Show a, GenValidity a)+ => (a -> a -> Bool)+ -> Property+reflexivityOnUnchecked func+ = reflexivityOnGen func genUnchecked+++transitiveOnGens+ :: Show a+ => (a -> a -> Bool)+ -> Gen (a, a, a)+ -> Property+transitiveOnGens func gen =+ forAll gen $ \(a, b, c) ->+ (func a b && func b c)+ ===> (func a c)++transitiveOnValid+ :: (Show a, GenValidity a)+ => (a -> a -> Bool)+ -> Property+transitiveOnValid func+ = transitiveOnGens func genValid++transitiveOnUnchecked+ :: (Show a, GenValidity a)+ => (a -> a -> Bool)+ -> Property+transitiveOnUnchecked func+ = transitiveOnGens func genUnchecked++antisymmetryOnGensWithEquality+ :: Show a+ => (a -> a -> Bool)+ -> Gen (a, a)+ -> (a -> a -> Bool)+ -> Property+antisymmetryOnGensWithEquality func gen eq =+ forAll gen $ \(a, b) ->+ (func a b && func b a)+ ===> (a `eq` b)++antisymmetryOnGensEq+ :: (Show a, Eq a)+ => (a -> a -> Bool)+ -> Gen (a, a)+ -> Property+antisymmetryOnGensEq func gen+ = antisymmetryOnGensWithEquality func gen (==)++antisymmetryOnValid+ :: (Show a, Eq a, GenValidity a)+ => (a -> a -> Bool)+ -> Property+antisymmetryOnValid func =+ antisymmetryOnGensEq func genValid++leftIdentityOnGen+ :: (Show a, Eq a)+ => (b -> a -> a)+ -> b+ -> Gen a+ -> Property+leftIdentityOnGen op b gen =+ forAll gen $ \a ->+ b `op` a `shouldBe` a++leftIdentityOnValid+ :: (Show a, Eq a, GenValidity a)+ => (b -> a -> a)+ -> b+ -> Property+leftIdentityOnValid op b+ = leftIdentityOnGen op b genValid++leftIdentity+ :: (Show a, Eq a, GenValidity a)+ => (b -> a -> a)+ -> b+ -> Property+leftIdentity op b+ = leftIdentityOnGen op b genUnchecked++rightIdentityOnGen+ :: (Show a, Eq a)+ => (a -> b -> a)+ -> b+ -> Gen a+ -> Property+rightIdentityOnGen op b gen =+ forAll gen $ \a ->+ a `op` b `shouldBe` a++rightIdentityOnValid+ :: (Show a, Eq a, GenValidity a)+ => (a -> b -> a)+ -> b+ -> Property+rightIdentityOnValid op b+ = rightIdentityOnGen op b genValid++rightIdentity+ :: (Show a, Eq a, GenValidity a)+ => (a -> b -> a)+ -> b+ -> Property+rightIdentity op b+ = rightIdentityOnGen op b genUnchecked++identityOnGen+ :: (Show a, Eq a)+ => (a -> a -> a)+ -> a+ -> Gen a+ -> Property+identityOnGen op e gen =+ leftIdentityOnGen op e gen .&&. rightIdentityOnGen op e gen++identityOnValid+ :: (Show a, Eq a, GenValidity a)+ => (a -> a -> a)+ -> a+ -> Property+identityOnValid op a+ = identityOnGen op a genValid++identity+ :: (Show a, Eq a, GenValidity a)+ => (a -> a -> a)+ -> a+ -> Property+identity op e+ = identityOnGen op e genUnchecked++associativeOnGens+ :: (Show a, Eq a)+ => (a -> a -> a)+ -> Gen (a, a, a)+ -> Property+associativeOnGens op gen =+ forAll gen $ \(a, b, c) ->+ ((a `op` b) `op` c) `shouldBe` (a `op` (b `op` c))++associativeOnValids+ :: (Show a, Eq a, GenValidity a)+ => (a -> a -> a)+ -> Property+associativeOnValids op+ = associativeOnGens op genValid++associative+ :: (Show a, Eq a, GenValidity a)+ => (a -> a -> a)+ -> Property+associative op+ = associativeOnGens op genUnchecked++commutativeOnGens+ :: (Show a, Eq a)+ => (a -> a -> a)+ -> Gen (a, a)+ -> Property+commutativeOnGens op gen =+ forAll gen $ \(a, b) ->+ (a `op` b) `shouldBe` (b `op` a)++commutativeOnValids+ :: (Show a, Eq a, GenValidity a)+ => (a -> a -> a)+ -> Property+commutativeOnValids op+ = commutativeOnGens op genValid++commutative+ :: (Show a, Eq a, GenValidity a)+ => (a -> a -> a)+ -> Property+commutative op+ = commutativeOnGens op genUnchecked+ nameOf :: Typeable a => Proxy a -> String nameOf proxy =