{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Test.Syd.Validity.Operations.Commutativity
( commutativeOnGens
, commutativeOnValids
, commutative
, commutativeOnArbitrary
) where
import Data.GenValidity
import Test.Syd
import Test.QuickCheck
commutativeOnGens ::
(Show a, Show b, Eq b)
=> (a -> a -> b)
-> Gen (a, a)
-> ((a, a) -> [(a, a)])
-> Property
commutativeOnGens :: (a -> a -> b) -> Gen (a, a) -> ((a, a) -> [(a, a)]) -> Property
commutativeOnGens a -> a -> b
op Gen (a, a)
gen (a, a) -> [(a, a)]
s =
Gen (a, a) -> ((a, a) -> [(a, a)]) -> ((a, a) -> IO ()) -> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> [a]) -> (a -> prop) -> Property
forAllShrink Gen (a, a)
gen (a, a) -> [(a, a)]
s (((a, a) -> IO ()) -> Property) -> ((a, a) -> IO ()) -> Property
forall a b. (a -> b) -> a -> b
$ \(a
a, a
b) -> (a
a a -> a -> b
`op` a
b) b -> b -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` (a
b a -> a -> b
`op` a
a)
commutativeOnValids ::
(Show a, Show b, Eq b, GenValid a)
=> (a -> a -> b) -> Property
commutativeOnValids :: (a -> a -> b) -> Property
commutativeOnValids a -> a -> b
op = (a -> a -> b) -> Gen (a, a) -> ((a, a) -> [(a, a)]) -> Property
forall a b.
(Show a, Show b, Eq b) =>
(a -> a -> b) -> Gen (a, a) -> ((a, a) -> [(a, a)]) -> Property
commutativeOnGens a -> a -> b
op Gen (a, a)
forall a. GenValid a => Gen a
genValid (a, a) -> [(a, a)]
forall a. GenValid a => a -> [a]
shrinkValid
commutative ::
(Show a, Show b, Eq b, GenUnchecked a)
=> (a -> a -> b) -> Property
commutative :: (a -> a -> b) -> Property
commutative a -> a -> b
op = (a -> a -> b) -> Gen (a, a) -> ((a, a) -> [(a, a)]) -> Property
forall a b.
(Show a, Show b, Eq b) =>
(a -> a -> b) -> Gen (a, a) -> ((a, a) -> [(a, a)]) -> Property
commutativeOnGens a -> a -> b
op Gen (a, a)
forall a. GenUnchecked a => Gen a
genUnchecked (a, a) -> [(a, a)]
forall a. GenUnchecked a => a -> [a]
shrinkUnchecked
commutativeOnArbitrary ::
(Show a, Show b, Eq b, Arbitrary a)
=> (a -> a -> b) -> Property
commutativeOnArbitrary :: (a -> a -> b) -> Property
commutativeOnArbitrary a -> a -> b
op = (a -> a -> b) -> Gen (a, a) -> ((a, a) -> [(a, a)]) -> Property
forall a b.
(Show a, Show b, Eq b) =>
(a -> a -> b) -> Gen (a, a) -> ((a, a) -> [(a, a)]) -> Property
commutativeOnGens a -> a -> b
op Gen (a, a)
forall a. Arbitrary a => Gen a
arbitrary (a, a) -> [(a, a)]
forall a. Arbitrary a => a -> [a]
shrink