packages feed

text-builder-lawful-conversions-0.1.3: src/hspec/Main/LawfulConversionsHspec.hs

module Main.LawfulConversionsHspec where

import Control.Monad (forM_)
import Data.Proxy (Proxy (..))
import qualified LawfulConversions
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck (Arbitrary)
import Test.QuickCheck.Instances ()
import TextBuilderLawfulConversions ()
import Prelude

isSome :: (LawfulConversions.IsSome a b, Eq a, Eq b, Show a, Show b, Arbitrary b) => Proxy a -> Proxy b -> Spec
isSome a b = describe "IsSome" do
  forM_ (LawfulConversions.isSomeProperties a b) \(name, property) ->
    prop name property

isMany :: (LawfulConversions.IsMany a b, Eq a, Eq b, Show a, Show b, Arbitrary a, Arbitrary b) => Proxy a -> Proxy b -> Spec
isMany a b = describe "IsMany" do
  forM_ (LawfulConversions.isManyProperties a b) \(name, property) ->
    prop name property

is :: (LawfulConversions.Is a b, Eq a, Eq b, Show a, Show b, Arbitrary a, Arbitrary b) => Proxy a -> Proxy b -> Spec
is a b = describe "Is" do
  forM_ (LawfulConversions.isProperties a b) \(name, property) ->
    prop name property

allUptoIs :: (LawfulConversions.Is a b, Eq a, Eq b, Show a, Show b, Arbitrary a, Arbitrary b) => Proxy a -> Proxy b -> Spec
allUptoIs a b = do
  describe "Forward" do
    isSome a b
    isMany a b
    is a b

  describe "Backward" do
    isSome b a
    isMany b a
    is b a

allUptoIsMany :: (LawfulConversions.IsMany a b, Eq a, Eq b, Show a, Show b, Arbitrary a, Arbitrary b) => Proxy a -> Proxy b -> Spec
allUptoIsMany a b = do
  isSome a b
  isMany a b