@hackage / generic-random

Generic random generators for QuickCheck

Latest v1.5.0.1

About

Metadata

  • Last updated:
  • License: MIT
  • Categories: Generics, Testing
  • Maintained by: lysxia@gmail.com
  • Lottery factor: 4

Links

Installation

Tested Compilers

  1. 8.4.1
  2. 8.6.1
  3. 8.8.4
  4. 8.10.5
  5. 9.0.1
  6. 9.2.1

Uploaders

  1. Albert Lawson
  2. Lora Edwards
  3. Elnora Kennedy
  4. Georgie McCormick
  5. Jeffrey Nichols
  6. Dale Wilson

Features flags

  • enable-inspect
     (off by default)

    Enable inspection tests

Readme

Generic random generators Hackage Build Status

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 ()))