-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Testing utilities for the validity library -- -- Note: There are companion instance packages for this library: -- -- @package genvalidity @version 0.4.0.0 -- | GenValidity exists to make tests involving Validity -- types easier and speed up the generation of data for them. -- -- Let's use the example from Data.Validity again: A datatype -- that represents primes. To implement tests for this datatype, we would -- have to be able to generate both primes and non-primes. We could do -- this with (Prime $ arbitrary) suchThat isValid -- but this is tedious and inefficient. -- -- The GenValid type class allows you to specify how to -- (efficiently) generate valid data of the given type to allow for -- easier and quicker testing. Just instantiating GenUnchecked -- already gives you access to a default instance of GenValid -- and GenInvalid but writing custom implementations of these -- functions may speed up the generation of data. -- -- For example, to generate primes, we don't have to consider even -- numbers other than 2. A more efficient implementation could then look -- as follows: -- --
--   instance GenUnchecked Prime where
--       genUnchecked = Prime <$> arbitrary
--   
-- --
--   instance GenValid Prime where
--       genValid = Prime <$>
--          (oneof
--            [ pure 2
--            , ((\y -> 2 * abs y + 1) <$> arbitrary) `suchThat` isPrime)
--            ])
--   
-- -- Typical examples of tests involving validity could look as follows: -- --
--   it "succeeds when given valid input" $ do
--       forAllValid $ \input ->
--           myFunction input `shouldSatisfy` isRight
--   
-- --
--   it "produces valid output when it succeeds" $ do
--       forAllUnchecked $ \input ->
--           case myFunction input of
--               Nothing -> return () -- Can happen
--               Just output -> output `shouldSatisfy` isValid
--   
module Data.GenValidity -- | A class of types for which truly arbitrary values can be generated. -- --

Automatic instances with Generic

-- -- An instance of this class can be made automatically if the type in -- question has a Generic instance. This instance will try to use -- genUnchecked to generate all structural sub-parts of the value -- that is being generated. -- -- Example: -- --
--   {-# LANGUAGE DeriveGeneric #-}
--   
--   data MyType = MyType Double String
--       deriving (Show, Eq, Generic)
--   
--   instance GenUnchecked MyType
--   
-- -- generates something like: -- --
--   instance GenUnchecked MyType where
--       genUnchecked = MyType <$> genUnchecked <*> genUnchecked
--   
class GenUnchecked a where genUnchecked = to <$> gGenUnchecked shrinkUnchecked = gShrinkUnchecked genUnchecked :: GenUnchecked a => Gen a genUnchecked :: (GenUnchecked a, Generic a, GGenUnchecked (Rep a)) => Gen a shrinkUnchecked :: GenUnchecked a => a -> [a] shrinkUnchecked :: (GenUnchecked a, Generic a, GUncheckedRecursivelyShrink (Rep a), GUncheckedSubterms (Rep a) a) => a -> [a] -- | A class of types for which valid values can be generated. -- -- If you also write Arbitrary instances for GenValid -- types, it may be best to simply write arbitrary = genValid. class (Validity a, GenUnchecked a) => GenValid a where genValid = genUnchecked `suchThat` isValid shrinkValid = filter isValid . shrinkUnchecked genValid :: GenValid a => Gen a shrinkValid :: GenValid a => a -> [a] -- | A class of types for which invalid values can be generated. class (Validity a, GenUnchecked a) => GenInvalid a where genInvalid = genUnchecked `suchThat` isInvalid shrinkInvalid = filter isInvalid . shrinkUnchecked genInvalid :: GenInvalid a => Gen a shrinkInvalid :: GenInvalid a => a -> [a] -- | This instance ensures that the generated tupse contains at least one -- invalid element. The other element is unchecked. -- | This instance ensures that the generated triple contains at least one -- invalid element. The other two are unchecked. -- | This instance ensures that the generated triple contains at least one -- invalid element. The other two are unchecked. -- | If we can generate values of a certain type, we can also generate -- lists of them. -- | This instance ensures that the generated list contains at least one -- element that satisfies isInvalid. The rest is unchecked. -- | Either NaN or Infinity. -- | Either NaN or Infinity. shrinkT2 :: (a -> [a]) -> (a, a) -> [(a, a)] shrinkT3 :: (a -> [a]) -> (a, a, a) -> [(a, a, a)] -- | upTo generates an integer between 0 (inclusive) and n. upTo :: Int -> Gen Int -- | 'genSplit a' generates a tuple '(b, c)' such that 'b + c' equals -- a. genSplit :: Int -> Gen (Int, Int) -- | 'genSplit3 a' generates a triple '(b, c, d)' such that 'b + c + d' -- equals a. genSplit3 :: Int -> Gen (Int, Int, Int) -- | 'genSplit4 a' generates a quadruple '(b, c, d, e)' such that 'b + c + -- d + e' equals a. genSplit4 :: Int -> Gen (Int, Int, Int, Int) -- | 'arbPartition n' generates a list ls such that 'sum ls' -- equals n. arbPartition :: Int -> Gen [Int] -- | A version of listOf that takes size into account more -- accurately. genListOf :: Gen a -> Gen [a] class GGenUnchecked f gGenUnchecked :: GGenUnchecked f => Gen (f a) -- | Shrink a term to any of its immediate subterms, and also recursively -- shrink all subterms. gShrinkUnchecked :: (Generic a, GUncheckedRecursivelyShrink (Rep a), GUncheckedSubterms (Rep a) a) => a -> [a] -- | Recursively shrink all immediate uncheckedSubterms. uncheckedRecursivelyShrink :: (Generic a, GUncheckedRecursivelyShrink (Rep a)) => a -> [a] class GUncheckedRecursivelyShrink f gUncheckedRecursivelyShrink :: GUncheckedRecursivelyShrink f => f a -> [f a] -- | All immediate uncheckedSubterms of a term. uncheckedSubterms :: (Generic a, GUncheckedSubterms (Rep a) a) => a -> [a] class GUncheckedSubterms f a gUncheckedSubterms :: GUncheckedSubterms f a => f a -> [a] class GUncheckedSubtermsIncl f a gUncheckedSubtermsIncl :: GUncheckedSubtermsIncl f a => f a -> [a] instance (Data.GenValidity.GenUnchecked a, Data.GenValidity.GenUnchecked b) => Data.GenValidity.GenUnchecked (a, b) instance (Data.GenValidity.GenValid a, Data.GenValidity.GenValid b) => Data.GenValidity.GenValid (a, b) instance (Data.GenValidity.GenInvalid a, Data.GenValidity.GenInvalid b) => Data.GenValidity.GenInvalid (a, b) instance (Data.GenValidity.GenUnchecked a, Data.GenValidity.GenUnchecked b) => Data.GenValidity.GenUnchecked (Data.Either.Either a b) instance (Data.GenValidity.GenValid a, Data.GenValidity.GenValid b) => Data.GenValidity.GenValid (Data.Either.Either a b) instance (Data.GenValidity.GenInvalid a, Data.GenValidity.GenInvalid b) => Data.GenValidity.GenInvalid (Data.Either.Either a b) instance (Data.GenValidity.GenUnchecked a, Data.GenValidity.GenUnchecked b, Data.GenValidity.GenUnchecked c) => Data.GenValidity.GenUnchecked (a, b, c) instance (Data.GenValidity.GenValid a, Data.GenValidity.GenValid b, Data.GenValidity.GenValid c) => Data.GenValidity.GenValid (a, b, c) instance (Data.GenValidity.GenInvalid a, Data.GenValidity.GenInvalid b, Data.GenValidity.GenInvalid c) => Data.GenValidity.GenInvalid (a, b, c) instance (Data.GenValidity.GenUnchecked a, Data.GenValidity.GenUnchecked b, Data.GenValidity.GenUnchecked c, Data.GenValidity.GenUnchecked d) => Data.GenValidity.GenUnchecked (a, b, c, d) instance (Data.GenValidity.GenValid a, Data.GenValidity.GenValid b, Data.GenValidity.GenValid c, Data.GenValidity.GenValid d) => Data.GenValidity.GenValid (a, b, c, d) instance (Data.GenValidity.GenInvalid a, Data.GenValidity.GenInvalid b, Data.GenValidity.GenInvalid c, Data.GenValidity.GenInvalid d) => Data.GenValidity.GenInvalid (a, b, c, d) instance Data.GenValidity.GenUnchecked a => Data.GenValidity.GenUnchecked (GHC.Base.Maybe a) instance Data.GenValidity.GenValid a => Data.GenValidity.GenValid (GHC.Base.Maybe a) instance Data.GenValidity.GenInvalid a => Data.GenValidity.GenInvalid (GHC.Base.Maybe a) instance Data.GenValidity.GenUnchecked a => Data.GenValidity.GenUnchecked [a] instance Data.GenValidity.GenValid a => Data.GenValidity.GenValid [a] instance Data.GenValidity.GenInvalid a => Data.GenValidity.GenInvalid [a] instance Data.GenValidity.GenUnchecked () instance Data.GenValidity.GenValid () instance Data.GenValidity.GenUnchecked GHC.Types.Bool instance Data.GenValidity.GenValid GHC.Types.Bool instance Data.GenValidity.GenUnchecked GHC.Types.Ordering instance Data.GenValidity.GenValid GHC.Types.Ordering instance Data.GenValidity.GenUnchecked GHC.Types.Char instance Data.GenValidity.GenValid GHC.Types.Char instance Data.GenValidity.GenUnchecked GHC.Types.Int instance Data.GenValidity.GenValid GHC.Types.Int instance Data.GenValidity.GenUnchecked GHC.Types.Word instance Data.GenValidity.GenValid GHC.Types.Word instance Data.GenValidity.GenUnchecked GHC.Word.Word8 instance Data.GenValidity.GenValid GHC.Word.Word8 instance Data.GenValidity.GenUnchecked GHC.Word.Word16 instance Data.GenValidity.GenValid GHC.Word.Word16 instance Data.GenValidity.GenUnchecked GHC.Word.Word32 instance Data.GenValidity.GenValid GHC.Word.Word32 instance Data.GenValidity.GenUnchecked GHC.Word.Word64 instance Data.GenValidity.GenValid GHC.Word.Word64 instance Data.GenValidity.GenUnchecked GHC.Types.Float instance Data.GenValidity.GenValid GHC.Types.Float instance Data.GenValidity.GenInvalid GHC.Types.Float instance Data.GenValidity.GenUnchecked GHC.Types.Double instance Data.GenValidity.GenValid GHC.Types.Double instance Data.GenValidity.GenInvalid GHC.Types.Double instance Data.GenValidity.GenUnchecked GHC.Integer.Type.Integer instance Data.GenValidity.GenValid GHC.Integer.Type.Integer instance Data.GenValidity.GenUnchecked (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.GenValidity.GenValid (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Fixed.HasResolution a => Data.GenValidity.GenUnchecked (Data.Fixed.Fixed a) instance Data.Fixed.HasResolution a => Data.GenValidity.GenValid (Data.Fixed.Fixed a) instance Data.GenValidity.GGenUnchecked GHC.Generics.U1 instance (Data.GenValidity.GGenUnchecked a, Data.GenValidity.GGenUnchecked b) => Data.GenValidity.GGenUnchecked (a GHC.Generics.:*: b) instance (Data.GenValidity.GGenUnchecked a, Data.GenValidity.GGenUnchecked b) => Data.GenValidity.GGenUnchecked (a GHC.Generics.:+: b) instance Data.GenValidity.GGenUnchecked a => Data.GenValidity.GGenUnchecked (GHC.Generics.M1 i c a) instance Data.GenValidity.GenUnchecked a => Data.GenValidity.GGenUnchecked (GHC.Generics.K1 i a) instance (Data.GenValidity.GUncheckedRecursivelyShrink f, Data.GenValidity.GUncheckedRecursivelyShrink g) => Data.GenValidity.GUncheckedRecursivelyShrink (f GHC.Generics.:*: g) instance (Data.GenValidity.GUncheckedRecursivelyShrink f, Data.GenValidity.GUncheckedRecursivelyShrink g) => Data.GenValidity.GUncheckedRecursivelyShrink (f GHC.Generics.:+: g) instance Data.GenValidity.GUncheckedRecursivelyShrink f => Data.GenValidity.GUncheckedRecursivelyShrink (GHC.Generics.M1 i c f) instance Data.GenValidity.GenUnchecked a => Data.GenValidity.GUncheckedRecursivelyShrink (GHC.Generics.K1 i a) instance Data.GenValidity.GUncheckedRecursivelyShrink GHC.Generics.U1 instance Data.GenValidity.GUncheckedRecursivelyShrink GHC.Generics.V1 instance Data.GenValidity.GUncheckedSubterms GHC.Generics.V1 a instance Data.GenValidity.GUncheckedSubterms GHC.Generics.U1 a instance (Data.GenValidity.GUncheckedSubtermsIncl f a, Data.GenValidity.GUncheckedSubtermsIncl g a) => Data.GenValidity.GUncheckedSubterms (f GHC.Generics.:*: g) a instance (Data.GenValidity.GUncheckedSubtermsIncl f a, Data.GenValidity.GUncheckedSubtermsIncl g a) => Data.GenValidity.GUncheckedSubterms (f GHC.Generics.:+: g) a instance Data.GenValidity.GUncheckedSubterms f a => Data.GenValidity.GUncheckedSubterms (GHC.Generics.M1 i c f) a instance Data.GenValidity.GUncheckedSubterms (GHC.Generics.K1 i a) b instance Data.GenValidity.GUncheckedSubtermsIncl GHC.Generics.V1 a instance Data.GenValidity.GUncheckedSubtermsIncl GHC.Generics.U1 a instance (Data.GenValidity.GUncheckedSubtermsIncl f a, Data.GenValidity.GUncheckedSubtermsIncl g a) => Data.GenValidity.GUncheckedSubtermsIncl (f GHC.Generics.:*: g) a instance (Data.GenValidity.GUncheckedSubtermsIncl f a, Data.GenValidity.GUncheckedSubtermsIncl g a) => Data.GenValidity.GUncheckedSubtermsIncl (f GHC.Generics.:+: g) a instance Data.GenValidity.GUncheckedSubtermsIncl f a => Data.GenValidity.GUncheckedSubtermsIncl (GHC.Generics.M1 i c f) a instance Data.GenValidity.GUncheckedSubtermsIncl (GHC.Generics.K1 i a) a instance Data.GenValidity.GUncheckedSubtermsIncl (GHC.Generics.K1 i a) b module Data.GenRelativeValidity class (GenUnchecked a, RelativeValidity a b) => GenRelativeUnchecked a b where genUncheckedFor _ = genUnchecked genUncheckedFor :: GenRelativeUnchecked a b => b -> Gen a class (GenValid a, RelativeValidity a b) => GenRelativeValid a b where genValidFor b = genValid `suchThat` (`isValidFor` b) genValidFor :: GenRelativeValid a b => b -> Gen a class (GenUnchecked a, RelativeValidity a b, GenRelativeUnchecked a b) => GenRelativeInvalid a b where genInvalidFor b = genUncheckedFor b `suchThat` (not . (`isValidFor` b)) genInvalidFor :: GenRelativeInvalid a b => b -> Gen a