-- 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:
--   
--   <ul>
--   <li><a>genvalidity-text</a></li>
--   <li><a>genvalidity-time</a></li>
--   <li><a>genvalidity-containers</a></li>
--   <li><a>genvalidity-path</a></li>
--   </ul>
@package genvalidity
@version 0.3.2.0


-- | <tt>GenValidity</tt> exists to make tests involving <tt>Validity</tt>
--   types easier and speed up the generation of data for them.
--   
--   Let's use the example from <tt>Data.Validity</tt> 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 <tt>(Prime <a>$</a> arbitrary) <a>suchThat</a> isValid</tt>
--   but this is tedious and inefficient.
--   
--   The <tt>GenValid</tt> 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 <tt>GenUnchecked</tt>
--   already gives you access to a default instance of <tt>GenValid</tt>
--   and <tt>GenInvalid</tt> 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:
--   
--   <pre>
--   instance GenUnchecked Prime where
--       genUnchecked = Prime &lt;$&gt; arbitrary
--   </pre>
--   
--   <pre>
--   instance GenValid Prime where
--       genValid = Prime &lt;$&gt;
--          (oneof
--            [ pure 2
--            , ((\y -&gt; 2 * abs y + 1) &lt;$&gt; arbitrary) `suchThat` isPrime)
--            ])
--   </pre>
--   
--   Typical examples of tests involving validity could look as follows:
--   
--   <pre>
--   it "succeeds when given valid input" $ do
--       forAll genValid $ \input -&gt;
--           myFunction input `shouldSatisfy` isRight
--   </pre>
--   
--   <pre>
--   it "produces valid output when it succeeds" $ do
--       forAll genUnchecked $ \input -&gt;
--           case myFunction input of
--               Nothing -&gt; return () -- Can happen
--               Just output -&gt; output `shouldSatisfy` isValid
--   </pre>
module Data.GenValidity

-- | A class of types for which truly arbitrary values can be generated.
class GenUnchecked a where genUnchecked = to <$> gGenUnchecked
genUnchecked :: GenUnchecked a => Gen a
genUnchecked :: (GenUnchecked a, Generic a, GGenUnchecked (Rep a)) => Gen a

-- | A class of types for which valid values can be generated.
--   
--   If you also write <tt>Arbitrary</tt> instances for <tt>GenValid</tt>
--   types, it may be best to simply write <tt>arbitrary = genValid</tt>.
class (Validity a, GenUnchecked a) => GenValid a where genValid = genUnchecked `suchThat` isValid
genValid :: GenValid a => Gen a

-- | A class of types for which invalid values can be generated.
class (Validity a, GenUnchecked a) => GenInvalid a where genInvalid = genUnchecked `suchThat` (not . isValid)
genInvalid :: GenInvalid a => Gen 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.

-- | 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 <a>isInvalid</a>. The rest is unchecked.

-- | Either <tt>NaN</tt> or <tt>Infinity</tt>.

-- | Either <tt>NaN</tt> or <tt>Infinity</tt>.

-- | <a>upTo</a> generates an integer between 0 (inclusive) and <tt>n</tt>.
upTo :: Int -> Gen Int

-- | 'genSplit a' generates a tuple '(b, c)' such that 'b + c' equals
--   <tt>a</tt>.
genSplit :: Int -> Gen (Int, Int)

-- | 'genSplit a' generates a triple '(b, c, d)' such that 'b + c + d'
--   equals <tt>a</tt>.
genSplit3 :: Int -> Gen (Int, Int, Int)

-- | 'arbPartition n' generates a list <tt>ls</tt> such that 'sum ls'
--   equals <tt>n</tt>.
arbPartition :: Int -> Gen [Int]

-- | A version of <tt>listOf</tt> that takes size into account more
--   accurately.
genListOf :: Gen a -> Gen [a]
class GGenUnchecked f
gGenUnchecked :: GGenUnchecked f => Gen (f 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 (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.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)

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
