@hackage / generic-random
Generic random generators for QuickCheck
About
Metadata
- Last updated:
- License: MIT
- Categories: Generics, Testing
- Maintained by: lysxia@gmail.com
-
Lottery factor: 4
The number of people with uploader permission on @hackage/generic-random who have released something to @hackage in the last 2 years (i.e. the number of people likely able to release critical fixes in a timely manner)
Links
Installation
Tested Compilers
- 8.4.1
- 8.6.1
- 8.8.4
- 8.10.5
- 9.0.1
- 9.2.1
Uploaders
- Albert Lawson
- Lora Edwards
- Elnora Kennedy
- Georgie McCormick
- Jeffrey Nichols
- Dale Wilson
Features flags
-
enable-inspect
(off by default)Enable inspection tests
Readme
Generic random generators

Generic random generators
to implement Arbitrary instances for QuickCheck
Automating the arbitrary boilerplate also ensures that when a type changes to
have more or fewer constructors, then the generator either fixes itself to
generate that new case (when using the uniform distribution) or causes a
compilation error so you remember to fix it (when using an explicit
distribution).
This package also offers a simple (optional) strategy to ensure termination for
recursive types:
make Test.QuickCheck.Gen's size parameter decrease at every recursive call;
when it reaches zero, sample directly from a trivially terminating generator
given explicitly (genericArbitraryRec and withBaseCase) or implicitly
(genericArbitrary').
Example
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics (Generic)
import Test.QuickCheck
import Generic.Random
data Tree a = Leaf | Node (Tree a) a (Tree a)
deriving (Show, Generic)
instance Arbitrary a => Arbitrary (Tree a) where
arbitrary = genericArbitraryRec uniform withBaseCase return Leaf
-- Equivalent to
-- > arbitrary =
-- > sized $ \n ->
-- > if n == 0 then
-- > return Leaf
-- > else
-- > oneof
-- > [ return Leaf
-- > , resize (n div 3) $
-- > Node <$> arbitrary <> arbitrary <> arbitrary
-- > ]
main :: IO ()
main = sample (arbitrary :: Gen (Tree ()))
Related
-
The following two packages also derive random generators, but only with a uniform distribution of constructors:
- quickcheck-arbitrary-template (TH)
- generic-arbitrary (GHC Generics)
-
testing-feat: derive enumerations for algebraic data types, which can be turned into random generators (TH).
-
boltzmann-samplers: derive Boltzmann samplers (SYB).