quickcheck-property-comb: Combinators for Quickcheck Property construction and diagnostics

[ library, public-domain, testing ] [ Propose Tags ]

These are simple monads that aim to reduce the pain of composing invariants/properties, and the documenting of those invariants for determining the cause of failure. Specifically, they provide a tool for effective diagnostic for invariants with changing post-conditions, leading to a faster cause-of-failure diagnosis.

Example case for invariants on a data structure Consumers:

data (Ord l) => Consumers l =
Consumers {
introduced :: S.Set l,
met :: M.Map (S.Set l) Bool,
disjoints :: Disjoints l
}

disjoints_odds ::  Inv (Disjoints l)
disjoints_odds = do
doc "no odd sets in disjoints"
disjoint_sets <- cause
..
return False

disjoints_non_singletons :: Inv (Disjoints l)
disjoints_non_singletons = do
..
return True

disjoints_inv :: Invariants (Disjoints l)
disjoints_inv= do
sat disjoints_odds
sat disjoints_non_singletons

introduced_in_disjoint :: Inv (Consumers l)
introduced_in_disjoint = do
doc "all at quantity are a singleton subset in disjoints"
subsets       <- (map S.singleton) . S.toList . introduced <$> cause disjoint_sets <- disjoints <$> cause
return . and . map ((flip S.member) disjoint_sets) \$ subsets

inv_consumers :: Invariants (Consumers l)
inv_consumers = do
satcomp disjoints disjoints_inv
satcomp met met_inv
sat introduced_in_disjoint

And to run the invariants on generated cases:

prop_testedFunction :: Arg -> Property
prop_testedFunction arg =
let consumers = testedFunction arg in
runInvariants consumers inv_consumers

Modules

• Test
• QuickCheck
• Property
• Test.QuickCheck.Property.Comb