packages feed

quickcheck-property-comb 0.1.0.1 → 0.1.0.2

raw patch · 3 files changed

+22/−105 lines, 3 filessetup-changed

Files

− README.md
@@ -1,81 +0,0 @@-quickcheck-property-comb----------These are combinators, based on the Reader and Writer Monads, to allow for fast-and painless Quickcheck property/invariant construction.--Why?------[Quickcheck](http://hackage.haskell.org/package/QuickCheck) is a tool used to-test cases based on constructed Properties, or essentially functions taking a-data structure and returning a boolean True or False. --However when running tests, the only way to document their failing case-is through labeling them after binding, e.g.: --```haskell-inv1, inv2, inv3 :: Foo -> Bool -..-fooInvariants :: Foo -> Property -fooInvariants f = -    conjoin . map property $ -      conjoin $ zipWith toLabeled-        ["foo should be even", "foo should contain 3 bar", "all bar should not equal foo"] -        [inv1 f, inv2 f, inv3 f]-```--This gets unwieldy fast as the complexity of the data-structure increases, so-quickcheck-property-comb provides the following:-  - Monadically unifies composition of invariants and the documenting of those invariants for determining cause of failure.-  - Effective diagnostics for invariants with changing post-conditions,-    leading to <b>faster cause-of-failure diagnosis</b>.--Example use-------------```haskell-data (Ord l) => QuantityConsumers l =-  QuantityConsumers {-    atQuantity :: S.Set l,-    qcMet :: M.Map (S.Set l) Bool,-    qcDisjoints :: Disjoints l-  }--disjoint_sizes ::  Inv (Disjoints l)-disjoint_sizes = do-  doc . unlines $-    [-     "the intersection of all at quantity and disjoints are the only allowed",-     "singleton sets in disjoints"-    ]-  disjoints <- cause -  -- Do some checking on disjoints -  return False--disjoints_eq :: Inv (Disjoints l)-disjoints_eq = do-  doc "the solution state domain and sets formed by partition are equal"-  ..-  return False--disjoints :: Invariants (Disjoints l)-disjoints = do-  sat disjoints_eq-  sat disjoints_sizes--at_quantity_in_disjoint :: Inv (QuantityConsumers l)-at_quantity_in_disjoint = do-  doc "all at quantity are a singleton subset in disjoints"--  subsets       <- (map S.singleton) . S.toList . atQuantity <$> cause-  disjoint_sets <- fromDisjoints <$>  cause--  return . and . map ((flip S.member) disjoint_sets) $ subsets--inv_quantity_consumers :: Invariants (QuantityConsumers l)-inv_quantity_consumers = do-  satcomp qcDisjoints disjoints-  sat at_quantity_in_disjoint---- Then to create the final property-prop_quantity_consumers :: QuantityConsumers l -> Property-prop_quantity_consumers q = runInvariants q inv_quantity_consumers-```
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
quickcheck-property-comb.cabal view
@@ -2,7 +2,7 @@ -- further documentation, see http://haskell.org/cabal/users-guide/  name:                quickcheck-property-comb-version:             0.1.0.1+version:             0.1.0.2 synopsis:            Combinators for Quickcheck Property construction and diagnostics description:            These are simple monads that aim to reduce the pain of composing@@ -12,7 +12,7 @@   for invariants with changing post-conditions, leading to a   faster cause-of-failure diagnosis.   .-  Example case for invariants on a data structure "Consumers".+  Example case for invariants on a data structure Consumers:   .   > data (Ord l) => Consumers l =   >   Consumers {@@ -21,33 +21,29 @@   >     disjoints :: Disjoints l   >   }   >-  > 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-  > -  > disjoint_sizes ::  Inv (Disjoints l)-  > disjoint_sizes = do-  >  doc . unlines $-  >    [ "the intersection of introduced and disjoints are the only allowed",-  >     "singleton sets in disjoints"-  >      ]-  >  disjoints' <- cause -  >  -- Do the checking+  > disjoints_odds ::  Inv (Disjoints l)+  > disjoints_odds = do+  >  doc "no odd sets in disjoints"+  >  disjoint_sets <- cause +  >  ..   >  return False   >-  > disjoints_eq :: Inv (Disjoints l)-  > disjoints_eq = do-  >   doc "disjoint sets are equal in size"-  >   -- ..+  > disjoints_non_singletons :: Inv (Disjoints l)+  > disjoints_non_singletons = do+  >   ..   >   return True   >   > disjoints_inv :: Invariants (Disjoints l)   > disjoints_inv= do-  >   sat disjoints_eq-  >   sat disjoints_sizes+  >   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@@ -55,7 +51,7 @@   >   satcomp met met_inv   >   sat introduced_in_disjoint   . -  And to run the Consumer invariant on generated cases: +  And to run the invariants on generated cases:   .   > prop_testedFunction :: Arg -> Property   > prop_testedFunction arg =