packages feed

fitspec-0.2.0: bench/bools.hs

import FitSpec

propertiesN :: (Bool -> Bool) -> [Property]
propertiesN not =
  [ property $ \p -> not (not p) == p
  , property $ \p -> not p /= p
  , property $       not True == False
  ]

propertiesNA :: (Bool -> Bool) -> (Bool -> Bool -> Bool) -> [Property]
propertiesNA not (&&) =
  [ property $ \p     -> not (not p)     == p
  , property $ \p q   -> p && q          == q && p
  , property $ \p     -> p && p          == p
  , property $ \p     -> p && False      == False
  , property $ \p q r -> p && (q && r)   == (p && q) && r
  , property $ \p     -> p && not p      == False
  , property $ \p     -> p && not False  == p
  ]

propertiesNAO :: (Bool->Bool) -> (Bool->Bool->Bool) -> (Bool->Bool->Bool)
              -> [Property]
propertiesNAO not (&&) (||) =
  [ property $                not True == False
  , property $ \p     ->   not (not p) == p

  , property $ \p q   ->        p && q == q && p
  , property $ \p     ->        p && p == p
  , property $ \p     ->     p && True == p
  , property $ \p     ->    p && False == False
  , property $ \p q r -> p && (q && r) == q && (p && r)

  , property $ \p q   ->        p || q == q || p
  , property $ \p     ->        p || p == p
  , property $ \p     ->     p || True == True
  , property $ \p     ->    p || False == p
  , property $ \p q r -> p || (q || r) == q || (p || r)

  , property $ \p q   -> p && (p || q) == p
  , property $ \p q   -> p || (p && q) == p
  , property $ \p     ->    p && not p == False
  ]

main = do
  as <- getArgsWith args { names = ["not p","p && q","p || q"]
                         , nMutants = 100
                         , nTests   = 100
                         , timeout  = 0 }
  let run f ps = reportWith as f ps
  case concat $ extra as of
    "nao" -> run (not,(&&),(||)) (uncurry3 propertiesNAO)
    "na"  -> run (not,(&&))      (uncurry  propertiesNA)
    _     -> run  not                      propertiesN

uncurry3 :: (a -> b -> c -> d) -> (a, b, c) -> d
uncurry3 f (x,y,z) = f x y z