quickcheck-arbitrary-adt-0.3.1.0: Generic typeclasses for generating arbitrary ADTs
CopyrightPlow Technologies LLC
LicenseBSD3
Maintainermchaver@gmail.com
StabilityBeta
Safe HaskellSafe-Inferred
LanguageHaskell2010

Test.QuickCheck.Arbitrary.ADT

Description

Type classes to assist random generation of values for various types of abstract data types.

Synopsis

How to use this library

How to use ToADTArbitrary with Generic.

{-# LANGUAGE DeriveGeneric #-}

import Data.Proxy
import GHC.Generics
import Test.QuickCheck
import Test.QuickCheck.Arbitrary.ADT

-- Sum Type, multiple constructors with parameters
data Fruit
  = Apple Int
  | Orange String Int
  | PassionFruit Int String Int
  deriving (Generic, Show)

-- Product Type, single constructor
data Person =
  Person
    { name :: String
    , age  :: Int
    } deriving (Generic, Show)

Any type that implements ToADTArbitrary must also implement Arbitrary. These examples all require that the data type is an instance of Generic.

instance Arbitrary Fruit where
  arbitrary = genericArbitrary

instance ToADTArbitrary Fruit

instance Arbitrary Person where
  arbitrary = genericArbitrary

instance ToADTArbitrary Person

Now we can use toADTArbitrarySingleton to produce an arbitrary value of one random constructor along with some metadata. toADTArbitrary will produce an arbitrary value for each constructor and return it along with a String of the constructor name.

λ> generate (toADTArbitrarySingleton (Proxy :: Proxy Fruit))
ADTArbitrarySingleton {
  adtasModuleName = "Ghci1"
, adtasTypeName = "Fruit"
, adtasCAP = ConstructorArbitraryPair {
    capConstructor = "Apple", capArbitrary = Apple 30}}

λ> generate (toADTArbitrary (Proxy :: Proxy Fruit))
ADTArbitrary {
  adtModuleName = "Ghci1"
, adtTypeName = "Fruit"
, adtCAPs = [
    ConstructorArbitraryPair {
        capConstructor = "Apple"
      , capArbitrary = Apple 17}
  , ConstructorArbitraryPair {
        capConstructor = "Orange"
      , capArbitrary = Orange "abcdef" 18}
  , ConstructorArbitraryPair {
        capConstructor = "PassionFruit"
      , capArbitrary = PassionFruit 16 "datadata" 6}]}

λ> generate (toADTArbitrarySingleton (Proxy :: Proxy Person))
ADTArbitrarySingleton {
  adtasModuleName = "Ghci1"
, adtasTypeName = "Person"
, adtasCAP = ConstructorArbitraryPair {capConstructor = "Person", capArbitrary = Person {name = "John Doe", age = 30}}}

λ> generate (toADTArbitrary (Proxy :: Proxy Person))
ADTArbitrary {
  adtModuleName = "Ghci1"
, adtTypeName = "Person"
, adtCAPs = [ConstructorArbitraryPair {capConstructor = "Person", capArbitrary = Person {name = "Jane Doe", age = 15}}]}

Data types

 

data ConstructorArbitraryPair a Source #

ConstructorArbitraryPair holds the construct name as a string and an arbitrary instance of that constructor.

Instances

Instances details
Functor ConstructorArbitraryPair Source #

fmap applies a function to capArbitrary

Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Eq a => Eq (ConstructorArbitraryPair a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Read a => Read (ConstructorArbitraryPair a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Show a => Show (ConstructorArbitraryPair a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Generic (ConstructorArbitraryPair a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Associated Types

type Rep (ConstructorArbitraryPair a) :: Type -> Type #

Arbitrary a => Arbitrary (ConstructorArbitraryPair a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

type Rep (ConstructorArbitraryPair a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

type Rep (ConstructorArbitraryPair a) = D1 ('MetaData "ConstructorArbitraryPair" "Test.QuickCheck.Arbitrary.ADT" "quickcheck-arbitrary-adt-0.3.1.0-1J2VBuMzBKPHeN1VUrokXn" 'False) (C1 ('MetaCons "ConstructorArbitraryPair" 'PrefixI 'True) (S1 ('MetaSel ('Just "capConstructor") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String) :*: S1 ('MetaSel ('Just "capArbitrary") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))

data ADTArbitrarySingleton a Source #

ADTArbitrarySingleton holds the type name and one ConstructorArbitraryPair.

Instances

Instances details
Functor ADTArbitrarySingleton Source #

fmap applies a function to the ConstructorArbitraryPair in adtasCAP.

Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Eq a => Eq (ADTArbitrarySingleton a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Read a => Read (ADTArbitrarySingleton a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Show a => Show (ADTArbitrarySingleton a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Generic (ADTArbitrarySingleton a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Associated Types

type Rep (ADTArbitrarySingleton a) :: Type -> Type #

Arbitrary a => Arbitrary (ADTArbitrarySingleton a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

type Rep (ADTArbitrarySingleton a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

type Rep (ADTArbitrarySingleton a) = D1 ('MetaData "ADTArbitrarySingleton" "Test.QuickCheck.Arbitrary.ADT" "quickcheck-arbitrary-adt-0.3.1.0-1J2VBuMzBKPHeN1VUrokXn" 'False) (C1 ('MetaCons "ADTArbitrarySingleton" 'PrefixI 'True) (S1 ('MetaSel ('Just "adtasModuleName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String) :*: (S1 ('MetaSel ('Just "adtasTypeName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String) :*: S1 ('MetaSel ('Just "adtasCAP") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (ConstructorArbitraryPair a)))))

data ADTArbitrary a Source #

ADTArbitrary holds the type name and a ConstructorArbitraryPair for each constructor.

Instances

Instances details
Functor ADTArbitrary Source #

fmap applies a function to each ConstructorArbitraryPair in adtCAPs.

Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

fmap :: (a -> b) -> ADTArbitrary a -> ADTArbitrary b #

(<$) :: a -> ADTArbitrary b -> ADTArbitrary a #

Eq a => Eq (ADTArbitrary a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Read a => Read (ADTArbitrary a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Show a => Show (ADTArbitrary a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Generic (ADTArbitrary a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Associated Types

type Rep (ADTArbitrary a) :: Type -> Type #

Methods

from :: ADTArbitrary a -> Rep (ADTArbitrary a) x #

to :: Rep (ADTArbitrary a) x -> ADTArbitrary a #

Arbitrary a => Arbitrary (ADTArbitrary a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

type Rep (ADTArbitrary a) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

type Rep (ADTArbitrary a) = D1 ('MetaData "ADTArbitrary" "Test.QuickCheck.Arbitrary.ADT" "quickcheck-arbitrary-adt-0.3.1.0-1J2VBuMzBKPHeN1VUrokXn" 'False) (C1 ('MetaCons "ADTArbitrary" 'PrefixI 'True) (S1 ('MetaSel ('Just "adtModuleName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String) :*: (S1 ('MetaSel ('Just "adtTypeName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String) :*: S1 ('MetaSel ('Just "adtCAPs") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [ConstructorArbitraryPair a]))))

Type classes

 

class ToADTArbitrary a where Source #

ToADTArbitrary generalizes the production of arbitrary values for Sum types. and Product types.

Minimal complete definition

Nothing

Methods

toADTArbitrarySingleton :: Proxy a -> Gen (ADTArbitrarySingleton a) Source #

produce an arbitrary instance of one random constructor

toADTArbitrary :: Proxy a -> Gen (ADTArbitrary a) Source #

produce an arbitrary instance for each constructor in type a.

Generic type classes

 

class GToADTArbitrarySingleton rep where Source #

GToADTArbitrarySingleton creates an arbitrary value and returns the name of the constructor that was used to create it and the type name.

Instances

Instances details
GToADTArbitrarySingleton (U1 :: Type -> Type) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Arbitrary a => GToADTArbitrarySingleton (K1 i a :: Type -> Type) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

(GToADTArbitrarySingleton l, GToADTArbitrarySingleton r) => GToADTArbitrarySingleton (l :+: r) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

(GToADTArbitrarySingleton l, GToADTArbitrarySingleton r) => GToADTArbitrarySingleton (l :*: r) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

(Datatype t, Typeable t, GToADTArbitrarySingleton rep) => GToADTArbitrarySingleton (M1 D t rep) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

(Constructor c, GToADTArbitrarySingleton rep) => GToADTArbitrarySingleton (M1 C c rep) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

GToADTArbitrarySingleton rep => GToADTArbitrarySingleton (M1 S t rep) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

class GToADTArbitrary rep where Source #

GToADTArbitrary is a typeclass for generalizing the creation of a list of arbitrary values for each constructor of a type. It also returns the name of the constructor and the type name for reference and file creation.

Methods

gToADTArbitrary :: Proxy rep -> Gen (ADTArbitrary (rep a)) Source #

Instances

Instances details
GToADTArbitrary (U1 :: Type -> Type) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Arbitrary a => GToADTArbitrary (K1 i a :: Type -> Type) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gToADTArbitrary :: Proxy (K1 i a) -> Gen (ADTArbitrary (K1 i a a0)) Source #

(GToADTArbitrary l, GToADTArbitrary r) => GToADTArbitrary (l :+: r) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gToADTArbitrary :: Proxy (l :+: r) -> Gen (ADTArbitrary ((l :+: r) a)) Source #

(GToADTArbitrarySingleton l, GToADTArbitrarySingleton r) => GToADTArbitrary (l :*: r) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gToADTArbitrary :: Proxy (l :*: r) -> Gen (ADTArbitrary ((l :*: r) a)) Source #

(Datatype t, GToADTArbitrary rep) => GToADTArbitrary (M1 D t rep) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gToADTArbitrary :: Proxy (M1 D t rep) -> Gen (ADTArbitrary (M1 D t rep a)) Source #

(Constructor c, GToADTArbitrary rep) => GToADTArbitrary (M1 C c rep) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gToADTArbitrary :: Proxy (M1 C c rep) -> Gen (ADTArbitrary (M1 C c rep a)) Source #

GToADTArbitrary rep => GToADTArbitrary (M1 S t rep) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gToADTArbitrary :: Proxy (M1 S t rep) -> Gen (ADTArbitrary (M1 S t rep a)) Source #

class GArbitrary rep where Source #

GArbitrary is a typeclass for generalizing the creation of single arbitrary product and sum types. It creates an arbitrary generating function of this style: TypeName <$> arbitrary <*> arbitrary.

Methods

gArbitrary :: Gen (rep a) Source #

Instances

Instances details
GArbitrary (U1 :: Type -> Type) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gArbitrary :: Gen (U1 a) Source #

Arbitrary a => GArbitrary (K1 i a :: Type -> Type) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gArbitrary :: Gen (K1 i a a0) Source #

(GArbitrary l, GArbitrary r) => GArbitrary (l :+: r) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gArbitrary :: Gen ((l :+: r) a) Source #

(GArbitrary l, GArbitrary r) => GArbitrary (l :*: r) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gArbitrary :: Gen ((l :*: r) a) Source #

GArbitrary rep => GArbitrary (M1 i t rep) Source # 
Instance details

Defined in Test.QuickCheck.Arbitrary.ADT

Methods

gArbitrary :: Gen (M1 i t rep a) Source #

genericArbitrary :: (Generic a, GArbitrary (Rep a)) => Gen a Source #

Create a arbitrary generator for a specified a type in a naive way. Please be careful when using this function, particularly for recursive types.