--------------------------------------------------------------------------------
test_BooleanAlgebra :: forall a.
                       (BooleanAlgebra a, Eq a, Arbitrary a, Show a) =>
                       TypeIndexedTest a
test_BooleanAlgebra t
    = testGroup "Boolean algebra laws"
      [ testProperty "or is associative" (prop_or_assoc `asFunctionOf` t)
      , testProperty "or is commutative" (prop_or_commutative `asFunctionOf` t)
      , testProperty "and is associative" (prop_and_assoc `asFunctionOf` t)
      , testProperty "and is commutative" (prop_and_commutative `asFunctionOf` t)
      , testProperty "or/and distribute on the left" (prop_distrib1 `asFunctionOf` t)
      , testProperty "or/and distribute on the right" (prop_distrib2 `asFunctionOf` t)
      , testProperty "absorbtion law 1" (prop_absorb1 `asFunctionOf` t)
      , testProperty "absorbtion law 2" (prop_absorb2 `asFunctionOf` t)
      , testProperty "a and not a is zero" (prop_complement1 `asFunctionOf` t)
      , testProperty "a or not a is one" (prop_complement2 `asFunctionOf` t)
      ]
test_BooleanAlgebra :: forall a.
                       (BooleanAlgebra a, Eq a, Arbitrary a, Show a) =>
                       TypeIndexedTest a
test_BooleanAlgebra t
    = testGroup "Boolean algebra laws"
      [ testProperty "or is associative" (prop_or_assoc `asFunctionOf` t)
      , testProperty "or is commutative" (prop_or_commutative `asFunctionOf` t)
      , testProperty "and is associative" (prop_and_assoc `asFunctionOf` t)
      , testProperty "and is commutative" (prop_and_commutative `asFunctionOf` t)
      , testProperty "or/and distribute on the left" (prop_distrib1 `asFunctionOf` t)
      , testProperty "or/and distribute on the right" (prop_distrib2 `asFunctionOf` t)
      , testProperty "absorbtion law 1" (prop_absorb1 `asFunctionOf` t)
      , testProperty "absorbtion law 2" (prop_absorb2 `asFunctionOf` t)
      , testProperty "a and not a is zero" (prop_complement1 `asFunctionOf` t)
      , testProperty "a or not a is one" (prop_complement2 `asFunctionOf` t)
      ]
test_BooleanAlgebra t
    = testGroup "Boolean algebra laws"
      [ testProperty "or is associative" (prop_or_assoc `asFunctionOf` t)
      , testProperty "or is commutative" (prop_or_commutative `asFunctionOf` t)
      , testProperty "and is associative" (prop_and_assoc `asFunctionOf` t)
      , testProperty "and is commutative" (prop_and_commutative `asFunctionOf` t)
      , testProperty "or/and distribute on the left" (prop_distrib1 `asFunctionOf` t)
      , testProperty "or/and distribute on the right" (prop_distrib2 `asFunctionOf` t)
      , testProperty "absorbtion law 1" (prop_absorb1 `asFunctionOf` t)
      , testProperty "absorbtion law 2" (prop_absorb2 `asFunctionOf` t)
      , testProperty "a and not a is zero" (prop_complement1 `asFunctionOf` t)
      , testProperty "a or not a is one" (prop_complement2 `asFunctionOf` t)
      ]