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 +0/−81
- Setup.hs +2/−0
- quickcheck-property-comb.cabal +20/−24
− 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 =