packages feed

holmes-0.3.0.0: test/Test/Data/JoinSemilattice/Class/Boolean.hs

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ViewPatterns #-}
module Test.Data.JoinSemilattice.Class.Boolean where

import Data.Holmes (BooleanR (..))
import Hedgehog
import qualified Hedgehog.Gen as Gen

bool :: BooleanR f => Gen (f Bool)
bool = Gen.element [ trueR, falseR ]

booleanR_andR :: forall f. (BooleanR f, Eq (f Bool), Show (f Bool)) => Property
booleanR_andR = property do
  a :: f Bool <- forAll bool
  b :: f Bool <- forAll bool

  let ( _, _, c ) = andR ( a, b, mempty )
  annotateShow c

  let ( a', _, _ ) = andR ( mempty, b, c )
  annotateShow a'
  a' <> a === a

  let ( _, b', _ ) = andR ( a, mempty, c )
  annotateShow b'
  b' <> b === b

booleanR_deMorgan_and :: forall f. (BooleanR f, Eq (f Bool), Show (f Bool)) => Property
booleanR_deMorgan_and = property do
  a :: f Bool <- forAll bool
  b :: f Bool <- forAll bool

  let ( _, _, c ) = andR ( a, b, mempty )
      ( _, a' ) = notR ( a, mempty )
      ( _, b' ) = notR ( b, mempty )
      ( _, _, d' ) = orR ( a', b', mempty )
      ( _, d ) = notR ( d', mempty )

  c === d

booleanR_deMorgan_or :: forall f. (BooleanR f, Eq (f Bool), Show (f Bool)) => Property
booleanR_deMorgan_or = property do
  a :: f Bool <- forAll bool
  b :: f Bool <- forAll bool

  let ( _, _, c ) = orR ( a, b, mempty )
      ( _, a' ) = notR ( a, mempty )
      ( _, b' ) = notR ( b, mempty )
      ( _, _, d' ) = andR ( a', b', mempty )
      ( _, d ) = notR ( d', mempty )

  c === d

booleanR_orR :: forall f. (BooleanR f, Eq (f Bool), Show (f Bool)) => Property
booleanR_orR = property do
  a :: f Bool <- forAll bool
  b :: f Bool <- forAll bool

  let ( _, _, c ) = orR ( a, b, mempty )
  annotateShow c

  let ( a', _, _ ) = orR ( mempty, b, c )
  annotateShow a'
  a' <> a === a

  let ( _, b', _ ) = orR ( a, mempty, c )
  annotateShow b'
  b' <> b === b

booleanR_notR :: forall f. (BooleanR f, Eq (f Bool), Show (f Bool)) => Property
booleanR_notR = property do
  a :: f Bool <- forAll bool

  let ( _, b ) = notR ( a, mempty )
  annotateShow b

  let ( a', _ ) = notR ( mempty, b )
  annotateShow a'
  a' === a