genvalidity-0.5.1.0: Testing utilities for the validity library

Safe HaskellNone
LanguageHaskell2010

Data.GenValidity

Description

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
Synopsis

Documentation

class GUncheckedSubtermsIncl f a where #

Minimal complete definition

gUncheckedSubtermsIncl

Methods

gUncheckedSubtermsIncl :: f a -> [a] #

Instances
GUncheckedSubtermsIncl (V1 :: * -> *) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubtermsIncl :: V1 a -> [a] #

GUncheckedSubtermsIncl (U1 :: * -> *) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubtermsIncl :: U1 a -> [a] #

GUncheckedSubtermsIncl (K1 i a :: * -> *) b # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubtermsIncl :: K1 i a b -> [b] #

GUncheckedSubtermsIncl (K1 i a :: * -> *) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubtermsIncl :: K1 i a a -> [a] #

(GUncheckedSubtermsIncl f a, GUncheckedSubtermsIncl g a) => GUncheckedSubtermsIncl (f :+: g) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubtermsIncl :: (f :+: g) a -> [a] #

(GUncheckedSubtermsIncl f a, GUncheckedSubtermsIncl g a) => GUncheckedSubtermsIncl (f :*: g) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubtermsIncl :: (f :*: g) a -> [a] #

GUncheckedSubtermsIncl f a => GUncheckedSubtermsIncl (M1 i c f) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubtermsIncl :: M1 i c f a -> [a] #

class GUncheckedSubterms f a where #

Minimal complete definition

gUncheckedSubterms

Methods

gUncheckedSubterms :: f a -> [a] #

Instances
GUncheckedSubterms (V1 :: * -> *) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubterms :: V1 a -> [a] #

GUncheckedSubterms (U1 :: * -> *) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubterms :: U1 a -> [a] #

GUncheckedSubterms (K1 i a :: * -> *) b # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubterms :: K1 i a b -> [b] #

(GUncheckedSubtermsIncl f a, GUncheckedSubtermsIncl g a) => GUncheckedSubterms (f :+: g) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubterms :: (f :+: g) a -> [a] #

(GUncheckedSubtermsIncl f a, GUncheckedSubtermsIncl g a) => GUncheckedSubterms (f :*: g) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubterms :: (f :*: g) a -> [a] #

GUncheckedSubterms f a => GUncheckedSubterms (M1 i c f) a # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedSubterms :: M1 i c f a -> [a] #

class GUncheckedRecursivelyShrink f where #

Minimal complete definition

gUncheckedRecursivelyShrink

Methods

gUncheckedRecursivelyShrink :: f a -> [f a] #

Instances
GUncheckedRecursivelyShrink (V1 :: * -> *) # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedRecursivelyShrink :: V1 a -> [V1 a] #

GUncheckedRecursivelyShrink (U1 :: * -> *) # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedRecursivelyShrink :: U1 a -> [U1 a] #

GenUnchecked a => GUncheckedRecursivelyShrink (K1 i a :: * -> *) # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedRecursivelyShrink :: K1 i a a0 -> [K1 i a a0] #

(GUncheckedRecursivelyShrink f, GUncheckedRecursivelyShrink g) => GUncheckedRecursivelyShrink (f :+: g) # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedRecursivelyShrink :: (f :+: g) a -> [(f :+: g) a] #

(GUncheckedRecursivelyShrink f, GUncheckedRecursivelyShrink g) => GUncheckedRecursivelyShrink (f :*: g) # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedRecursivelyShrink :: (f :*: g) a -> [(f :*: g) a] #

GUncheckedRecursivelyShrink f => GUncheckedRecursivelyShrink (M1 i c f) # 
Instance details

Defined in Data.GenValidity

Methods

gUncheckedRecursivelyShrink :: M1 i c f a -> [M1 i c f a] #

class GGenUnchecked f where #

Minimal complete definition

gGenUnchecked

Methods

gGenUnchecked :: Gen (f a) #

Instances
GGenUnchecked (U1 :: * -> *) # 
Instance details

Defined in Data.GenValidity

Methods

gGenUnchecked :: Gen (U1 a) #

GenUnchecked a => GGenUnchecked (K1 i a :: * -> *) # 
Instance details

Defined in Data.GenValidity

Methods

gGenUnchecked :: Gen (K1 i a a0) #

(GGenUnchecked a, GGenUnchecked b) => GGenUnchecked (a :+: b) # 
Instance details

Defined in Data.GenValidity

Methods

gGenUnchecked :: Gen ((a :+: b) a0) #

(GGenUnchecked a, GGenUnchecked b) => GGenUnchecked (a :*: b) # 
Instance details

Defined in Data.GenValidity

Methods

gGenUnchecked :: Gen ((a :*: b) a0) #

GGenUnchecked a => GGenUnchecked (M1 i c a) # 
Instance details

Defined in Data.GenValidity

Methods

gGenUnchecked :: Gen (M1 i c a a0) #

class (Validity a, GenUnchecked a) => GenInvalid a where #

A class of types for which invalid values can be generated.

Methods

genInvalid :: Gen a #

shrinkInvalid :: a -> [a] #

Instances
GenInvalid Double #

Either NaN or Infinity.

Instance details

Defined in Data.GenValidity

GenInvalid Float #

Either NaN or Infinity.

Instance details

Defined in Data.GenValidity

GenInvalid a => GenInvalid [a] #

This instance ensures that the generated list contains at least one element that satisfies isInvalid. The rest is unchecked.

Instance details

Defined in Data.GenValidity

Methods

genInvalid :: Gen [a] #

shrinkInvalid :: [a] -> [[a]] #

GenInvalid a => GenInvalid (Maybe a) # 
Instance details

Defined in Data.GenValidity

Methods

genInvalid :: Gen (Maybe a) #

shrinkInvalid :: Maybe a -> [Maybe a] #

(Integral a, Num a, Ord a, GenValid a) => GenInvalid (Ratio a) # 
Instance details

Defined in Data.GenValidity

Methods

genInvalid :: Gen (Ratio a) #

shrinkInvalid :: Ratio a -> [Ratio a] #

GenInvalid a => GenInvalid (NonEmpty a) # 
Instance details

Defined in Data.GenValidity

(GenInvalid a, GenInvalid b) => GenInvalid (Either a b) #

This instance ensures that the generated tupse contains at least one invalid element. The other element is unchecked.

Instance details

Defined in Data.GenValidity

Methods

genInvalid :: Gen (Either a b) #

shrinkInvalid :: Either a b -> [Either a b] #

(GenInvalid a, GenInvalid b) => GenInvalid (a, b) # 
Instance details

Defined in Data.GenValidity

Methods

genInvalid :: Gen (a, b) #

shrinkInvalid :: (a, b) -> [(a, b)] #

(GenInvalid a, GenInvalid b, GenInvalid c) => GenInvalid (a, b, c) #

This instance ensures that the generated triple contains at least one invalid element. The other two are unchecked.

Instance details

Defined in Data.GenValidity

Methods

genInvalid :: Gen (a, b, c) #

shrinkInvalid :: (a, b, c) -> [(a, b, c)] #

(GenInvalid a, GenInvalid b, GenInvalid c, GenInvalid d) => GenInvalid (a, b, c, d) #

This instance ensures that the generated triple contains at least one invalid element. The other two are unchecked.

Instance details

Defined in Data.GenValidity

Methods

genInvalid :: Gen (a, b, c, d) #

shrinkInvalid :: (a, b, c, d) -> [(a, b, c, d)] #

(GenInvalid a, GenInvalid b, GenInvalid c, GenInvalid d, GenInvalid e) => GenInvalid (a, b, c, d, e) #

This instance ensures that the generated triple contains at least one invalid element. The other two are unchecked.

Instance details

Defined in Data.GenValidity

Methods

genInvalid :: Gen (a, b, c, d, e) #

shrinkInvalid :: (a, b, c, d, e) -> [(a, b, c, d, e)] #

class (Validity a, GenUnchecked a) => GenValid a where #

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.

Methods

genValid :: Gen a #

shrinkValid :: a -> [a] #

Instances
GenValid Bool # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen Bool #

shrinkValid :: Bool -> [Bool] #

GenValid Char # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen Char #

shrinkValid :: Char -> [Char] #

GenValid Double # 
Instance details

Defined in Data.GenValidity

GenValid Float # 
Instance details

Defined in Data.GenValidity

GenValid Int # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen Int #

shrinkValid :: Int -> [Int] #

GenValid Int8 # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen Int8 #

shrinkValid :: Int8 -> [Int8] #

GenValid Int16 # 
Instance details

Defined in Data.GenValidity

GenValid Int32 # 
Instance details

Defined in Data.GenValidity

GenValid Int64 # 
Instance details

Defined in Data.GenValidity

GenValid Integer # 
Instance details

Defined in Data.GenValidity

GenValid Natural # 
Instance details

Defined in Data.GenValidity

GenValid Ordering # 
Instance details

Defined in Data.GenValidity

GenValid Word # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen Word #

shrinkValid :: Word -> [Word] #

GenValid Word8 # 
Instance details

Defined in Data.GenValidity

GenValid Word16 # 
Instance details

Defined in Data.GenValidity

GenValid Word32 # 
Instance details

Defined in Data.GenValidity

GenValid Word64 # 
Instance details

Defined in Data.GenValidity

GenValid () # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen () #

shrinkValid :: () -> [()] #

GenValid a => GenValid [a] #

If we can generate values of a certain type, we can also generate lists of them.

Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen [a] #

shrinkValid :: [a] -> [[a]] #

GenValid a => GenValid (Maybe a) # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen (Maybe a) #

shrinkValid :: Maybe a -> [Maybe a] #

(Integral a, Num a, Ord a, GenValid a) => GenValid (Ratio a) # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen (Ratio a) #

shrinkValid :: Ratio a -> [Ratio a] #

HasResolution a => GenValid (Fixed a) # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen (Fixed a) #

shrinkValid :: Fixed a -> [Fixed a] #

GenValid a => GenValid (NonEmpty a) # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen (NonEmpty a) #

shrinkValid :: NonEmpty a -> [NonEmpty a] #

(GenValid a, GenValid b) => GenValid (Either a b) # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen (Either a b) #

shrinkValid :: Either a b -> [Either a b] #

(GenValid a, GenValid b) => GenValid (a, b) # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen (a, b) #

shrinkValid :: (a, b) -> [(a, b)] #

(GenValid a, GenValid b, GenValid c) => GenValid (a, b, c) # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen (a, b, c) #

shrinkValid :: (a, b, c) -> [(a, b, c)] #

(GenValid a, GenValid b, GenValid c, GenValid d) => GenValid (a, b, c, d) # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen (a, b, c, d) #

shrinkValid :: (a, b, c, d) -> [(a, b, c, d)] #

(GenValid a, GenValid b, GenValid c, GenValid d, GenValid e) => GenValid (a, b, c, d, e) # 
Instance details

Defined in Data.GenValidity

Methods

genValid :: Gen (a, b, c, d, e) #

shrinkValid :: (a, b, c, d, e) -> [(a, b, c, d, e)] #

class GenUnchecked a where #

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
Instances
GenUnchecked Bool # 
Instance details

Defined in Data.GenValidity

GenUnchecked Char # 
Instance details

Defined in Data.GenValidity

GenUnchecked Double # 
Instance details

Defined in Data.GenValidity

GenUnchecked Float # 
Instance details

Defined in Data.GenValidity

GenUnchecked Int # 
Instance details

Defined in Data.GenValidity

GenUnchecked Int8 # 
Instance details

Defined in Data.GenValidity

GenUnchecked Int16 # 
Instance details

Defined in Data.GenValidity

GenUnchecked Int32 # 
Instance details

Defined in Data.GenValidity

GenUnchecked Int64 # 
Instance details

Defined in Data.GenValidity

GenUnchecked Integer # 
Instance details

Defined in Data.GenValidity

GenUnchecked Natural # 
Instance details

Defined in Data.GenValidity

GenUnchecked Ordering # 
Instance details

Defined in Data.GenValidity

GenUnchecked Word # 
Instance details

Defined in Data.GenValidity

GenUnchecked Word8 # 
Instance details

Defined in Data.GenValidity

GenUnchecked Word16 # 
Instance details

Defined in Data.GenValidity

GenUnchecked Word32 # 
Instance details

Defined in Data.GenValidity

GenUnchecked Word64 # 
Instance details

Defined in Data.GenValidity

GenUnchecked () # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen () #

shrinkUnchecked :: () -> [()] #

GenUnchecked a => GenUnchecked [a] # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen [a] #

shrinkUnchecked :: [a] -> [[a]] #

GenUnchecked a => GenUnchecked (Maybe a) # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen (Maybe a) #

shrinkUnchecked :: Maybe a -> [Maybe a] #

(Integral a, GenUnchecked a) => GenUnchecked (Ratio a) # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen (Ratio a) #

shrinkUnchecked :: Ratio a -> [Ratio a] #

HasResolution a => GenUnchecked (Fixed a) # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen (Fixed a) #

shrinkUnchecked :: Fixed a -> [Fixed a] #

GenUnchecked a => GenUnchecked (NonEmpty a) # 
Instance details

Defined in Data.GenValidity

(GenUnchecked a, GenUnchecked b) => GenUnchecked (Either a b) # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen (Either a b) #

shrinkUnchecked :: Either a b -> [Either a b] #

(GenUnchecked a, GenUnchecked b) => GenUnchecked (a, b) # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen (a, b) #

shrinkUnchecked :: (a, b) -> [(a, b)] #

(GenUnchecked a, GenUnchecked b, GenUnchecked c) => GenUnchecked (a, b, c) # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen (a, b, c) #

shrinkUnchecked :: (a, b, c) -> [(a, b, c)] #

(GenUnchecked a, GenUnchecked b, GenUnchecked c, GenUnchecked d) => GenUnchecked (a, b, c, d) # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen (a, b, c, d) #

shrinkUnchecked :: (a, b, c, d) -> [(a, b, c, d)] #

(GenUnchecked a, GenUnchecked b, GenUnchecked c, GenUnchecked d, GenUnchecked e) => GenUnchecked (a, b, c, d, e) # 
Instance details

Defined in Data.GenValidity

Methods

genUnchecked :: Gen (a, b, c, d, e) #

shrinkUnchecked :: (a, b, c, d, e) -> [(a, b, c, d, e)] #

shrinkT2 :: (a -> [a]) -> (a, a) -> [(a, a)] #

shrinkT3 :: (a -> [a]) -> (a, a, a) -> [(a, a, a)] #

upTo :: Int -> Gen Int #

upTo generates an integer between 0 (inclusive) and n.

genSplit :: Int -> Gen (Int, Int) #

'genSplit a' generates a tuple '(b, c)' such that 'b + c' equals a.

genSplit3 :: Int -> Gen (Int, Int, Int) #

'genSplit3 a' generates a triple '(b, c, d)' such that 'b + c + d' equals a.

genSplit4 :: Int -> Gen (Int, Int, Int, Int) #

'genSplit4 a' generates a quadruple '(b, c, d, e)' such that 'b + c + d + e' equals a.

genSplit5 :: Int -> Gen (Int, Int, Int, Int, Int) #

'genSplit5 a' generates a quadruple '(b, c, d, e, f)' such that 'b + c + d + e + f' equals a.

arbPartition :: Int -> Gen [Int] #

'arbPartition n' generates a list ls such that 'sum ls' equals n.

genListOf :: Gen a -> Gen [a] #

A version of listOf that takes size into account more accurately.

gShrinkUnchecked :: (Generic a, GUncheckedRecursivelyShrink (Rep a), GUncheckedSubterms (Rep a) a) => a -> [a] #

Shrink a term to any of its immediate subterms, and also recursively shrink all subterms.

uncheckedRecursivelyShrink :: (Generic a, GUncheckedRecursivelyShrink (Rep a)) => a -> [a] #

Recursively shrink all immediate uncheckedSubterms.

uncheckedSubterms :: (Generic a, GUncheckedSubterms (Rep a) a) => a -> [a] #

All immediate uncheckedSubterms of a term.