quickcheck-combinators 0.0.0 → 0.0.1
raw patch · 3 files changed
+83/−18 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Test.QuickCheck.Combinators: instance (Data.Unfoldable.Restricted.UnfoldableR p t, GHC.Base.Monoid (t a), Test.QuickCheck.Arbitrary.Arbitrary a, Test.QuickCheck.Arbitrary.Arbitrary (t a), GHC.TypeLits.KnownNat m, p a) => Test.QuickCheck.Arbitrary.Arbitrary (Test.QuickCheck.Combinators.AtMost m t a)
- Test.QuickCheck.Combinators: instance (Data.Unfoldable.Restricted.UnfoldableR p t, GHC.Base.Monoid (t a), Test.QuickCheck.Arbitrary.Arbitrary a, Test.QuickCheck.Arbitrary.Arbitrary (t a), GHC.TypeLits.KnownNat n, GHC.TypeLits.KnownNat m, p a) => Test.QuickCheck.Arbitrary.Arbitrary (Test.QuickCheck.Combinators.Between n m t a)
- Test.QuickCheck.Combinators: instance (Data.Unfoldable.Restricted.UnfoldableR p t, GHC.Base.Monoid (t a), Test.QuickCheck.Arbitrary.Arbitrary a, Test.QuickCheck.Arbitrary.Arbitrary (t a), GHC.TypeLits.KnownNat n, p a) => Test.QuickCheck.Arbitrary.Arbitrary (Test.QuickCheck.Combinators.AtLeast n t a)
+ Test.QuickCheck.Combinators: [getAtLeast] :: AtLeast t a -> t a
+ Test.QuickCheck.Combinators: [getAtMost] :: AtMost t a -> t a
+ Test.QuickCheck.Combinators: [getBetween] :: Between t a -> t a
+ Test.QuickCheck.Combinators: instance (Data.Data.Data (t a), Data.Typeable.Internal.Typeable a, Data.Typeable.Internal.Typeable t, GHC.TypeLits.KnownNat n) => Data.Data.Data (Test.QuickCheck.Combinators.AtLeast n t a)
+ Test.QuickCheck.Combinators: instance (Data.Data.Data (t a), Data.Typeable.Internal.Typeable a, Data.Typeable.Internal.Typeable t, GHC.TypeLits.KnownNat n) => Data.Data.Data (Test.QuickCheck.Combinators.AtMost n t a)
+ Test.QuickCheck.Combinators: instance (Data.Data.Data (t a), Data.Typeable.Internal.Typeable a, Data.Typeable.Internal.Typeable t, GHC.TypeLits.KnownNat n, GHC.TypeLits.KnownNat m) => Data.Data.Data (Test.QuickCheck.Combinators.Between n m t a)
+ Test.QuickCheck.Combinators: instance (Data.Unfoldable.Restricted.UnfoldableR p t, GHC.Base.Monoid (t a), Test.QuickCheck.Arbitrary.Arbitrary a, GHC.TypeLits.KnownNat m, p a) => Test.QuickCheck.Arbitrary.Arbitrary (Test.QuickCheck.Combinators.AtMost m t a)
+ Test.QuickCheck.Combinators: instance (Data.Unfoldable.Restricted.UnfoldableR p t, GHC.Base.Monoid (t a), Test.QuickCheck.Arbitrary.Arbitrary a, GHC.TypeLits.KnownNat n, GHC.TypeLits.KnownNat m, p a) => Test.QuickCheck.Arbitrary.Arbitrary (Test.QuickCheck.Combinators.Between n m t a)
+ Test.QuickCheck.Combinators: instance (Data.Unfoldable.Restricted.UnfoldableR p t, GHC.Base.Monoid (t a), Test.QuickCheck.Arbitrary.Arbitrary a, GHC.TypeLits.KnownNat n, p a) => Test.QuickCheck.Arbitrary.Arbitrary (Test.QuickCheck.Combinators.AtLeast n t a)
+ Test.QuickCheck.Combinators: instance (Test.QuickCheck.Arbitrary.Arbitrary a, GHC.Classes.Ord a, Data.Unfoldable.Restricted.UnfoldableR p [], p a, GHC.TypeLits.KnownNat n) => Test.QuickCheck.Arbitrary.Arbitrary (Test.QuickCheck.Combinators.AtLeast n Test.QuickCheck.Modifiers.OrderedList a)
+ Test.QuickCheck.Combinators: instance (Test.QuickCheck.Arbitrary.Arbitrary a, GHC.Classes.Ord a, Data.Unfoldable.Restricted.UnfoldableR p [], p a, GHC.TypeLits.KnownNat n) => Test.QuickCheck.Arbitrary.Arbitrary (Test.QuickCheck.Combinators.AtMost n Test.QuickCheck.Modifiers.OrderedList a)
+ Test.QuickCheck.Combinators: instance (Test.QuickCheck.Arbitrary.Arbitrary a, GHC.Classes.Ord a, GHC.TypeLits.KnownNat n, Data.Unfoldable.Restricted.UnfoldableR p [], p a, GHC.TypeLits.KnownNat m) => Test.QuickCheck.Arbitrary.Arbitrary (Test.QuickCheck.Combinators.Between n m Test.QuickCheck.Modifiers.OrderedList a)
+ Test.QuickCheck.Combinators: instance Data.Foldable.Foldable t => Data.Foldable.Foldable (Test.QuickCheck.Combinators.AtLeast n t)
+ Test.QuickCheck.Combinators: instance Data.Foldable.Foldable t => Data.Foldable.Foldable (Test.QuickCheck.Combinators.AtMost n t)
+ Test.QuickCheck.Combinators: instance Data.Foldable.Foldable t => Data.Foldable.Foldable (Test.QuickCheck.Combinators.Between n m t)
+ Test.QuickCheck.Combinators: instance Data.Traversable.Traversable t => Data.Traversable.Traversable (Test.QuickCheck.Combinators.AtLeast n t)
+ Test.QuickCheck.Combinators: instance Data.Traversable.Traversable t => Data.Traversable.Traversable (Test.QuickCheck.Combinators.AtMost n t)
+ Test.QuickCheck.Combinators: instance Data.Traversable.Traversable t => Data.Traversable.Traversable (Test.QuickCheck.Combinators.Between n m t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Applicative t => GHC.Base.Applicative (Test.QuickCheck.Combinators.AtLeast n t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Applicative t => GHC.Base.Applicative (Test.QuickCheck.Combinators.AtMost n t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Applicative t => GHC.Base.Applicative (Test.QuickCheck.Combinators.Between n m t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Functor t => GHC.Base.Functor (Test.QuickCheck.Combinators.AtLeast n t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Functor t => GHC.Base.Functor (Test.QuickCheck.Combinators.AtMost n t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Functor t => GHC.Base.Functor (Test.QuickCheck.Combinators.Between n m t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Monad t => GHC.Base.Monad (Test.QuickCheck.Combinators.AtLeast n t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Monad t => GHC.Base.Monad (Test.QuickCheck.Combinators.AtMost n t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Monad t => GHC.Base.Monad (Test.QuickCheck.Combinators.Between n m t)
+ Test.QuickCheck.Combinators: instance GHC.Base.Monoid (t a) => GHC.Base.Monoid (Test.QuickCheck.Combinators.AtLeast n t a)
+ Test.QuickCheck.Combinators: instance GHC.Base.Monoid (t a) => GHC.Base.Monoid (Test.QuickCheck.Combinators.AtMost n t a)
+ Test.QuickCheck.Combinators: instance GHC.Base.Monoid (t a) => GHC.Base.Monoid (Test.QuickCheck.Combinators.Between n m t a)
+ Test.QuickCheck.Combinators: instance GHC.Generics.Generic (Test.QuickCheck.Combinators.AtLeast n t a)
+ Test.QuickCheck.Combinators: instance GHC.Generics.Generic (Test.QuickCheck.Combinators.AtMost n t a)
+ Test.QuickCheck.Combinators: instance GHC.Generics.Generic (Test.QuickCheck.Combinators.Between n m t a)
- Test.QuickCheck.Combinators: AtLeast :: (t a) -> AtLeast t a
+ Test.QuickCheck.Combinators: AtLeast :: t a -> AtLeast t a
- Test.QuickCheck.Combinators: AtMost :: (t a) -> AtMost t a
+ Test.QuickCheck.Combinators: AtMost :: t a -> AtMost t a
- Test.QuickCheck.Combinators: Between :: (t a) -> Between t a
+ Test.QuickCheck.Combinators: Between :: t a -> Between t a
Files
- ChangeLog.md +12/−0
- quickcheck-combinators.cabal +3/−2
- src/Test/QuickCheck/Combinators.hs +68/−16
+ ChangeLog.md view
@@ -0,0 +1,12 @@+# Revision history for dnf++## 0.0.0 -- 2016-04-08++* First version. Released on an unsuspecting world.++## 0.0.1 -- 2016-06-18++* Added changelog (which you are now reading).+* Added instances of ``AtLeast``, ``AtMost``, and ``Between`` for+ ``OrderedList``.+* Removed some redundant constraints.
quickcheck-combinators.cabal view
@@ -1,5 +1,5 @@ Name: quickcheck-combinators-Version: 0.0.0+Version: 0.0.1 Author: Athan Clark <athan.clark@gmail.com> Maintainer: Athan Clark <athan.clark@gmail.com> License: BSD3@@ -27,7 +27,8 @@ . Cabal-Version: >= 1.10 Build-Type: Simple-+Extra-Source-Files: ChangeLog.md+ Library Default-Language: Haskell2010 HS-Source-Dirs: src
src/Test/QuickCheck/Combinators.hs view
@@ -2,10 +2,16 @@ DataKinds , ScopedTypeVariables , FlexibleContexts+ , FlexibleInstances , KindSignatures , GeneralizedNewtypeDeriving , ConstraintKinds , UndecidableInstances+ , DeriveDataTypeable+ , DeriveGeneric+ , DeriveFunctor+ , DeriveFoldable+ , DeriveTraversable #-} module Test.QuickCheck.Combinators where@@ -19,50 +25,82 @@ import Test.QuickCheck +import qualified Data.List as L (sort) +import Data.Data+import GHC.Generics ++ -- | Generate with a minimum, inclusive size as @n :: Nat@-newtype AtLeast (n :: Nat) t a = AtLeast (t a)- deriving (Show, Read, Eq, Ord, Enum)+newtype AtLeast (n :: Nat) t a = AtLeast+ { getAtLeast :: t a+ } deriving (Show, Read, Eq, Ord, Enum, Data, Typeable, Generic, Functor+ , Applicative, Monad, Foldable, Traversable, Monoid) instance ( UnfoldableR p t , Monoid (t a) , Arbitrary a- , Arbitrary (t a) , KnownNat n , p a ) => Arbitrary (AtLeast (n :: Nat) t a) where arbitrary = sized $ \m' -> do let n' = fromIntegral $ natVal (Proxy :: Proxy n)- k <- choose (n', m')- (ts :: t x) <- (fromMaybe mempty . fromList) <$> replicateM k arbitrary- return (AtLeast ts)+ k <- choose (min n' m', max n' m')+ ts <- fromMaybe mempty . fromList <$> replicateM k arbitrary+ return . AtLeast $ ts +instance ( Arbitrary a+ , Ord a+ , UnfoldableR p []+ , p a+ , KnownNat n) => Arbitrary (AtLeast (n :: Nat) OrderedList a) where+ arbitrary = sized $ \m -> do+ let n' = fromIntegral $ natVal (Proxy :: Proxy n)+ mkOrd = Ordered . L.sort . fromMaybe mempty . fromList+ k <- choose (min n' m, max n' m)+ ts <- mkOrd <$> replicateM k arbitrary+ return . AtLeast $ ts+ -- | Generate with a maximum, inclusive size as @n :: Nat@-newtype AtMost (n :: Nat) t a = AtMost (t a)- deriving (Show, Read, Eq, Ord, Enum)+newtype AtMost (n :: Nat) t a = AtMost+ { getAtMost :: t a+ } deriving (Show, Read, Eq, Ord, Enum, Data, Typeable, Generic, Functor+ , Applicative, Monad, Foldable, Traversable, Monoid) instance ( UnfoldableR p t , Monoid (t a) , Arbitrary a- , Arbitrary (t a) , KnownNat m , p a ) => Arbitrary (AtMost (m :: Nat) t a) where arbitrary = sized $ \m'' -> do let m' = fromIntegral $ natVal (Proxy :: Proxy m) k <- choose (0, min m' m'')- (ts :: t x) <- (fromMaybe mempty . fromList) <$> replicateM k arbitrary- return (AtMost ts)+ ts <- fromMaybe mempty . fromList <$> replicateM k arbitrary+ return . AtMost $ ts +instance ( Arbitrary a+ , Ord a+ , UnfoldableR p []+ , p a+ , KnownNat n) => Arbitrary (AtMost (n :: Nat) OrderedList a) where+ arbitrary = sized $ \m -> do+ let n' = fromIntegral $ natVal (Proxy :: Proxy n)+ mkOrd = Ordered . L.sort . fromMaybe mempty . fromList+ k <- choose (0, min n' m)+ ts <- mkOrd <$> replicateM k arbitrary+ return . AtMost $ ts+ -- | Generate between the inclusive range of @n :: Nat@ and @m :: Nat@-newtype Between (n :: Nat) (m :: Nat) t a = Between (t a)- deriving (Show, Read, Eq, Ord, Enum)+newtype Between (n :: Nat) (m :: Nat) t a = Between+ { getBetween :: t a+ } deriving (Show, Read, Eq, Ord, Enum, Data, Typeable, Generic, Functor+ , Applicative, Monad, Foldable, Traversable, Monoid) instance ( UnfoldableR p t , Monoid (t a) , Arbitrary a- , Arbitrary (t a) , KnownNat n , KnownNat m , p a@@ -71,8 +109,22 @@ let n' = fromIntegral $ natVal (Proxy :: Proxy n) m' = fromIntegral $ natVal (Proxy :: Proxy m) k <- choose (n', min m' m'')- (ts :: t x) <- (fromMaybe mempty . fromList) <$> replicateM k arbitrary- return (Between ts)+ ts <- fromMaybe mempty . fromList <$> replicateM k arbitrary+ return . Between $ ts++instance ( Arbitrary a+ , Ord a+ , KnownNat n+ , UnfoldableR p []+ , p a+ , KnownNat m) => Arbitrary (Between (n :: Nat) (m :: Nat) OrderedList a) where+ arbitrary = sized $ \s -> do+ let n' = fromIntegral $ natVal (Proxy :: Proxy n)+ m' = fromIntegral $ natVal (Proxy :: Proxy m)+ mkOrd = Ordered . L.sort . fromMaybe mempty . fromList+ k <- choose (n', min m' s)+ ts <- mkOrd <$> replicateM k arbitrary+ return . Between $ ts -- | Convenience for @AtLeast 1@ type NonMempty = AtLeast 1