packages feed

tomland-1.3.3.3: test/Test/Toml/Property.hs

module Test.Toml.Property
       ( assocSemigroup
       , rightIdentityMonoid
       , leftIdentityMonoid
       ) where

import Hedgehog (Gen, forAll, (===))
import Test.Hspec (Arg, Expectation, SpecWith, it)
import Test.Hspec.Hedgehog (hedgehog)


{- | The semigroup associativity axiom:

@
x <> (y <> z) ≡ (x <> y) <> z
@
-}
assocSemigroup
    :: (Eq a, Show a, Semigroup a)
    => Gen a
    -> SpecWith (Arg Expectation)
assocSemigroup gen = it "Semigroup associativity: x <> (y <> z) ≡ (x <> y) <> z" $ hedgehog $ do
    x <- forAll gen
    y <- forAll gen
    z <- forAll gen

    (x <> (y <> z)) === ((x <> y) <> z)

{- | Right Identity law for Monoid

@
x <> mempty ≡ x
@
-}
rightIdentityMonoid
    :: (Eq a, Show a, Monoid a)
    => Gen a
    -> SpecWith (Arg Expectation)
rightIdentityMonoid gen = it "Monoid Right Identity: x <> mempty ≡ x" $ hedgehog $ do
    x <- forAll gen
    x <> mempty === x

{- | Left Identity law for Monoid

@
mempty <> x ≡ x
@
-}
leftIdentityMonoid
    :: (Eq a, Show a, Monoid a)
    => Gen a
    -> SpecWith (Arg Expectation)
leftIdentityMonoid gen = it "Monoid Right Identity: mempty <> x ≡ x" $ hedgehog $ do
    x <- forAll gen
    mempty <> x === x