tomland-1.3.3.3: test/Test/Toml/Codec/BiMap.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Test.Toml.Codec.BiMap
( biMapSpec
) where
import Prelude hiding (id, (.))
import Control.Category (id, (.))
import Data.Word (Word8)
import Hedgehog (Gen, PropertyT, forAll, (===))
import Test.Hspec (Spec, describe, it, parallel)
import Test.Hspec.Hedgehog (hedgehog)
import Test.Toml.Codec.BiMap.Conversion (conversionSpec)
import Test.Toml.Gen (genInteger, genText, genWord8)
import Toml.Codec.BiMap (BiMap (..), TomlBiMap)
import Toml.Codec.BiMap.Conversion (_BoundedInteger, _ReadString, _StringText)
biMapSpec :: Spec
biMapSpec = parallel $ describe "Tagged Partial Bidirectional Isomorphism: tests" $ do
conversionSpec
categoryLaws
categoryLaws :: Spec
categoryLaws = describe "BiMap Category instance laws" $ do
it "Right identity: f . id ≡ f" $ biMapEquality
(_Word8Integer . id)
_Word8Integer
genWord8
genInteger
it "Left identity: id . f ≡ f" $ biMapEquality
_Word8Integer
(_Word8Integer . id)
genWord8
genInteger
it "Associativity: f . (g . h) ≡ (f . g) . h" $ biMapEquality
(_StringText . (_ReadString . _Word8Integer))
((_StringText . _ReadString) . _Word8Integer)
genWord8
genText
{- | Property that takes two 'BiMap's and checks them on equality. We
consider two 'BiMap's @m1@ and @m2@ equal if:
* @forward m1 ≡ forward m2@
* @backward m1 ≡ backward m2@
-}
biMapEquality
:: (Eq a, Eq b, Show a, Show b)
=> TomlBiMap a b
-> TomlBiMap a b
-> Gen a
-> Gen b
-> PropertyT IO ()
biMapEquality m1 m2 genA genB = hedgehog $ do
a <- forAll genA
b <- forAll genB
forward m1 a === forward m2 a
backward m1 b === backward m2 b
_Word8Integer :: TomlBiMap Word8 Integer
_Word8Integer = _BoundedInteger