checkers 0.4.3 → 0.4.4
raw patch · 8 files changed
+42/−38 lines, 8 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Test.QuickCheck.Checkers: instance (EqProp a, EqProp b) => EqProp (Either a b)
- Test.QuickCheck.Checkers: instance (EqProp a, EqProp b) => EqProp (a, b)
- Test.QuickCheck.Checkers: instance (EqProp a, EqProp b, EqProp c) => EqProp (a, b, c)
- Test.QuickCheck.Checkers: instance (EqProp a, EqProp b, EqProp c, EqProp d) => EqProp (a, b, c, d)
- Test.QuickCheck.Checkers: instance (Model a b, Model a' b') => Model (a, a') (b, b')
- Test.QuickCheck.Checkers: instance (Show a, Arbitrary a, EqProp b) => EqProp (a -> b)
- Test.QuickCheck.Checkers: instance (Testable a, Testable b) => Testable (a, b)
- Test.QuickCheck.Checkers: instance EqProp Bool
- Test.QuickCheck.Checkers: instance EqProp Char
- Test.QuickCheck.Checkers: instance EqProp Double
- Test.QuickCheck.Checkers: instance EqProp Float
- Test.QuickCheck.Checkers: instance EqProp Int
- Test.QuickCheck.Checkers: instance EqProp a => EqProp (Maybe a)
- Test.QuickCheck.Checkers: instance EqProp a => EqProp [a]
- Test.QuickCheck.Checkers: instance Model Bool Bool
- Test.QuickCheck.Checkers: instance Model Char Char
- Test.QuickCheck.Checkers: instance Model Double Double
- Test.QuickCheck.Checkers: instance Model Float Float
- Test.QuickCheck.Checkers: instance Model Int Int
- Test.QuickCheck.Checkers: instance Model String String
- Test.QuickCheck.Checkers: instance Testable a => Testable [a]
- Test.QuickCheck.Instances.Array: instance (Ix a, Integral a, Arbitrary b) => Arbitrary (Array a b)
- Test.QuickCheck.Instances.Array: instance (Ix a, Integral a, CoArbitrary b) => CoArbitrary (Array a b)
+ Test.QuickCheck.Checkers: instance (GHC.Show.Show a, Test.QuickCheck.Arbitrary.Arbitrary a, Test.QuickCheck.Checkers.EqProp b) => Test.QuickCheck.Checkers.EqProp (a -> b)
+ Test.QuickCheck.Checkers: instance (Test.QuickCheck.Checkers.EqProp a, Test.QuickCheck.Checkers.EqProp b) => Test.QuickCheck.Checkers.EqProp (Data.Either.Either a b)
+ Test.QuickCheck.Checkers: instance (Test.QuickCheck.Checkers.EqProp a, Test.QuickCheck.Checkers.EqProp b) => Test.QuickCheck.Checkers.EqProp (a, b)
+ Test.QuickCheck.Checkers: instance (Test.QuickCheck.Checkers.EqProp a, Test.QuickCheck.Checkers.EqProp b, Test.QuickCheck.Checkers.EqProp c) => Test.QuickCheck.Checkers.EqProp (a, b, c)
+ Test.QuickCheck.Checkers: instance (Test.QuickCheck.Checkers.EqProp a, Test.QuickCheck.Checkers.EqProp b, Test.QuickCheck.Checkers.EqProp c, Test.QuickCheck.Checkers.EqProp d) => Test.QuickCheck.Checkers.EqProp (a, b, c, d)
+ Test.QuickCheck.Checkers: instance (Test.QuickCheck.Checkers.Model a b, Test.QuickCheck.Checkers.Model a' b') => Test.QuickCheck.Checkers.Model (a, a') (b, b')
+ Test.QuickCheck.Checkers: instance (Test.QuickCheck.Property.Testable a, Test.QuickCheck.Property.Testable b) => Test.QuickCheck.Property.Testable (a, b)
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.EqProp GHC.Types.Bool
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.EqProp GHC.Types.Char
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.EqProp GHC.Types.Double
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.EqProp GHC.Types.Float
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.EqProp GHC.Types.Int
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.EqProp a => Test.QuickCheck.Checkers.EqProp (GHC.Base.Maybe a)
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.EqProp a => Test.QuickCheck.Checkers.EqProp [a]
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.Model GHC.Base.String GHC.Base.String
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.Model GHC.Types.Bool GHC.Types.Bool
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.Model GHC.Types.Char GHC.Types.Char
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.Model GHC.Types.Double GHC.Types.Double
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.Model GHC.Types.Float GHC.Types.Float
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Checkers.Model GHC.Types.Int GHC.Types.Int
+ Test.QuickCheck.Checkers: instance Test.QuickCheck.Property.Testable a => Test.QuickCheck.Property.Testable [a]
+ Test.QuickCheck.Checkers: involution :: (Show a, Arbitrary a, EqProp a) => (a -> a) -> Property
+ Test.QuickCheck.Instances.Array: instance (GHC.Arr.Ix a, GHC.Real.Integral a, Test.QuickCheck.Arbitrary.Arbitrary b) => Test.QuickCheck.Arbitrary.Arbitrary (GHC.Arr.Array a b)
+ Test.QuickCheck.Instances.Array: instance (GHC.Arr.Ix a, GHC.Real.Integral a, Test.QuickCheck.Arbitrary.CoArbitrary b) => Test.QuickCheck.Arbitrary.CoArbitrary (GHC.Arr.Array a b)
Files
- checkers.cabal +3/−3
- src/Test/QuickCheck/Checkers.hs +10/−6
- src/Test/QuickCheck/Classes.hs +16/−16
- src/Test/QuickCheck/Instances.hs +2/−2
- src/Test/QuickCheck/Instances/Array.hs +1/−1
- src/Test/QuickCheck/Instances/Num.hs +1/−1
- src/Test/QuickCheck/Later.hs +4/−4
- src/Test/QuickCheck/Utils.hs +5/−5
checkers.cabal view
@@ -1,5 +1,5 @@ Name: checkers-Version: 0.4.3+Version: 0.4.4 Cabal-Version: >= 1.6 Synopsis: Check properties on standard classes and data structures. Category: Testing@@ -12,7 +12,7 @@ © 2008-2013 by Conal Elliott; BSD3 license. . Contributions from: Thomas Davie.-Author: Conal Elliott +Author: Conal Elliott Maintainer: conal@conal.net Copyright: (c) 2008-2013 by Conal Elliott License: BSD3@@ -28,7 +28,7 @@ hs-Source-Dirs: src Extensions: Build-Depends: base < 5, random, QuickCheck>=2.3 && <2.9, array >= 0.1- Exposed-Modules: + Exposed-Modules: Test.QuickCheck.Utils Test.QuickCheck.Checkers Test.QuickCheck.Classes
src/Test/QuickCheck/Checkers.hs view
@@ -9,10 +9,10 @@ -- Module : Test.QuickCheck.Checkers -- Copyright : (c) Conal Elliott 2007,2008 -- License : BSD3--- +-- -- Maintainer : conal@conal.net -- Stability : experimental--- +-- -- Some QuickCheck helpers ---------------------------------------------------------------------- @@ -21,7 +21,7 @@ -- * Misc Test, TestBatch, unbatch, checkBatch, quickBatch, verboseBatch -- , probablisticPureCheck- , Unop, Binop, genR, inverseL, inverse+ , Unop, Binop, genR, involution, inverseL, inverse , FracT, NumT, OrdT, T -- * Generalized equality , EqProp(..), eq@@ -91,7 +91,7 @@ mapM_ pr tests where pr (s,p) = do putStr (padTo (width + 4) (" "++s ++ ":"))- Ex.catch (quickCheckWith args p) + Ex.catch (quickCheckWith args p) (print :: Ex.SomeException -> IO ()) width = foldl' max 0 (map (length.fst) tests) @@ -102,7 +102,7 @@ -- | Check a batch tersely. quickBatch :: TestBatch -> IO () quickBatch = checkBatch quick'- + -- | Check a batch verbosely. verboseBatch :: TestBatch -> IO () verboseBatch = checkBatch verbose'@@ -150,11 +150,15 @@ genR :: Random a => (a, a) -> Gen a genR (lo,hi) = fmap (fst . randomR (lo,hi)) rand +-- | @f@ is its own inverse. See also 'inverse'.+involution :: (Show a, Arbitrary a, EqProp a) =>+ (a -> a) -> Property+involution f = f `inverseL` f -- | @f@ is a left inverse of @g@. See also 'inverse'. inverseL :: (EqProp b, Arbitrary b, Show b) => (a -> b) -> (b -> a) -> Property-f `inverseL` g = f . g =-= id +f `inverseL` g = f . g =-= id -- | @f@ is a left and right inverse of @g@. See also 'inverseL'. inverse :: ( EqProp a, Arbitrary a, Show a
src/Test/QuickCheck/Classes.hs view
@@ -8,10 +8,10 @@ -- Module : Test.QuickCheck.Classes -- Copyright : (c) Conal Elliott 2008 -- License : BSD3--- +-- -- Maintainer : conal@conal.net -- Stability : experimental--- +-- -- Some QuickCheck properties for standard type classes ---------------------------------------------------------------------- @@ -59,7 +59,7 @@ -- | 'Ord' morphism properties. @h@ is an 'Ord' morphism iff:--- +-- -- > a <= b = h a <= h b -- > -- > h (a `min` b) = h a `min` h b@@ -76,7 +76,7 @@ where distrib :: (forall c. Ord c => c -> c -> c) -> Property distrib op = property $ \ u v -> h (u `op` v) =-= h u `op` h v- + distrib' :: EqProp d => (forall c. Ord c => c -> c -> d) -> Property distrib' op = property $ \ u v -> u `op` v =-= h u `op` h v @@ -143,7 +143,7 @@ binopP :: (a->b) -> (m a) -> (m a) -> Property binopP f u v = (fmap f) (u `mappend` v) =-= (fmap f u) `mappend` (fmap f v) --- <camio> There I have an attempt at doing this. I eventually implemented +-- <camio> There I have an attempt at doing this. I eventually implemented -- those semanticMorphisms as their own functions. I'm not too thrilled with -- that implementation, but it works. @@ -164,15 +164,15 @@ where identityP :: Property composeP :: (b -> c) -> (a -> b) -> Property- + identityP = fmap id =-= (id :: m a -> m a) composeP g f = fmap g . fmap f =-= (fmap (g.f) :: m a -> m c) -- Note the similarity between 'functor' and 'monoidMorphism'. The -- functor laws say that 'fmap' is a homomorphism w.r.t '(.)':--- +-- -- functor = const ("functor", homomorphism endoMonoidD endoMonoidD fmap)--- +-- -- However, I don't think the types can work out, since 'fmap' is used at -- three different types. @@ -232,7 +232,7 @@ homomorphismP :: (a -> b) -> a -> Property interchangeP :: m (a -> b) -> a -> Property functorP :: (a -> b) -> m a -> Property- + identityP v = (pure id <*> v) =-= v compositionP u v w = (pure (.) <*> u <*> v <*> w) =-= (u <*> (v <*> w)) homomorphismP f x = (pure f <*> pure x) =-= (pure (f x) :: m b)@@ -255,7 +255,7 @@ where pureP :: NumT -> Property applyP :: f (NumT->T) -> f NumT -> Property- + pureP a = q (pure a) =-= pure a applyP mf mx = q (mf <*> mx) =-= (q mf <*> q mx) @@ -292,7 +292,7 @@ leftP :: (a -> m b) -> a -> Property rightP :: m a -> Property assocP :: m a -> (a -> m b) -> (b -> m c) -> Property- + leftP f a = (return a >>= f) =-= f a rightP m = (m >>= return) =-= m assocP m f g = ((m >>= f) >>= g) =-= (m >>= (\x -> f x >>= g))@@ -350,7 +350,7 @@ returnP :: NumT -> Property bindP :: f NumT -> (NumT -> f T) -> Property joinP :: f (f (NumT->T)) -> Property- + returnP a = q (return a) =-= return a bindP u k = q (u >>= k) =-= (q u >>= q . k) joinP uu = q (join uu) =-= join (fmap q (q uu))@@ -471,21 +471,21 @@ where assocP :: a b c -> a c d -> a d e -> Property assocP f g h = ((f >>> g) >>> h) =-= (f >>> (g >>> h))- + arrDistributesP :: (b -> c) -> (c -> d) -> Property arrDistributesP f g = ((arr (f >>> g)) :: a b d) =-= (arr f >>> arr g)- + firstAsFunP :: (b -> c) -> Property firstAsFunP f = (first (arr f) :: a (b,d) (c,d)) =-= arr (first f) firstKeepCompP :: a b c -> a c d -> Property firstKeepCompP f g = ((first (f >>> g)) :: (a (b,e) (d,e))) =-= (first f >>> first g)- + firstIsFstP :: a b c -> Property firstIsFstP f = ((first f :: a (b,d) (c,d)) >>> arr fst) =-= (arr fst >>> f)- + secondMovesP :: (a b c) -> (d -> e) -> Property secondMovesP f g = (first f >>> second (arr g)) =-= ((second (arr g)) >>> first f)
src/Test/QuickCheck/Instances.hs view
@@ -8,9 +8,9 @@ ,module Test.QuickCheck.Instances.Ord ,module Test.QuickCheck.Instances.Tuple ) where- + import Test.QuickCheck.Instances.Array ()-import Test.QuickCheck.Instances.Char +import Test.QuickCheck.Instances.Char import Test.QuickCheck.Instances.Eq import Test.QuickCheck.Instances.List import Test.QuickCheck.Instances.Maybe
src/Test/QuickCheck/Instances/Array.hs view
@@ -7,7 +7,7 @@ instance (Ix a, Integral a, Arbitrary b) => Arbitrary (Array a b) where arbitrary =- (\x -> listArray (0,fromIntegral (length x - 1)) x) <$> arbitrary + (\x -> listArray (0,fromIntegral (length x - 1)) x) <$> arbitrary instance (Ix a, Integral a, CoArbitrary b) => CoArbitrary (Array a b) where coarbitrary = coarbitrary . elems
src/Test/QuickCheck/Instances/Num.hs view
@@ -1,4 +1,4 @@-module Test.QuickCheck.Instances.Num +module Test.QuickCheck.Instances.Num (nonNegative,nonPositive ,negative,positive ,nonZero,nonZero_
src/Test/QuickCheck/Later.hs view
@@ -4,10 +4,10 @@ -- Module : Data.Later -- Copyright : (c) David Sankel 2008 -- License : BSD3--- +-- -- Maintainer : david@sankelsoftware.com -- Stability : experimental--- +-- -- Later. Allows for testing of functions that depend on the order of -- evaluation. --@@ -45,7 +45,7 @@ del t1 # del t2 =-= del t2 # del t1 -- Note that we delay v by t1 and by t2 twice.--- +-- -- TODO: make sure CSE isn't kicking in. Examine the core code. -- | Is the given function associative when restricted to the same value@@ -75,7 +75,7 @@ -- | A value that is never available. Rerun of @hang@ from unamb, but -- replicated to avoid mutual dependency.--- +-- -- TODO: Remove when this module is moved into the unamb-test package. delayForever :: a delayForever = unsafePerformIO $ do _ <- forever (threadDelay maxBound)
src/Test/QuickCheck/Utils.hs view
@@ -4,7 +4,7 @@ -- Module : Test.QuickCheck.Utils -- Copyright : (c) Andy Gill 2001 -- License : BSD-style (see the file libraries/base/LICENSE)--- +-- -- Maintainer : libraries@haskell.org -- Stability : experimental -- Portability : portable@@ -26,9 +26,9 @@ import Test.QuickCheck -isAssociativeBy :: (Show a,Testable prop) +isAssociativeBy :: (Show a,Testable prop) => (a -> a -> prop) -> Gen a -> (a -> a -> a) -> Property-isAssociativeBy (=~=) src (#) = +isAssociativeBy (=~=) src (#) = forAll src $ \ a -> forAll src $ \ b -> forAll src $ \ c ->@@ -37,7 +37,7 @@ isAssociative :: (Arbitrary a,Show a,Eq a) => (a -> a -> a) -> Property isAssociative = isAssociativeBy (==) arbitrary -isCommutableBy :: (Show a,Testable prop) +isCommutableBy :: (Show a,Testable prop) => (b -> b -> prop) -> Gen a -> (a -> a -> b) -> Property isCommutableBy (=~=) src (#) = forAll src $ \ a ->@@ -48,7 +48,7 @@ isCommutable = isCommutableBy (==) arbitrary isTotalOrder :: (Arbitrary a,Show a,Ord a) => a -> a -> Property-isTotalOrder x y = +isTotalOrder x y = classify (x > y) "less than" $ classify (x == y) "equals" $ classify (x < y) "greater than" $