module Test.Toml.Property ( assocLaw , identityLaw ) where import Data.Semigroup (Semigroup ((<>))) import Hedgehog (Gen, forAll, (===)) import Test.Toml.Gen (PropertyTest, prop) {- | The semigroup associativity axiom: @ x <> (y <> z) ≡ (x <> y) <> z @ -} assocLaw :: (Eq a, Show a, Semigroup a) => Gen a -> PropertyTest assocLaw gen = prop "Semigroup associativity law" $ do x <- forAll gen y <- forAll gen z <- forAll gen (x <> (y <> z)) === ((x <> y) <> z) {- | Identity law for Monoid @ mempty <> x = x x <> mempty = x @ -} identityLaw :: (Eq a, Show a, Semigroup a, Monoid a) => Gen a -> PropertyTest identityLaw gen = prop "Monoid identity laws" $ do x <- forAll gen x <> mempty === x mempty <> x === x