Generators
In this section, we’ll teach QuickCheck
to generate test inputs for new data types.
Arbitrary
Out of the box, QuickCheck
does not support properties of all types. It only supports the common data types in the standard library. Suppose we define a custom data type, say for the two states of a button:
data Button = On | Off deriving (Eq, Show)
We have written a simple function to toggle a button:
toggle :: Button -> Button toggle On = Off toggle Off = On
We want to test this function using the following property:
prop_toggle b = toggle (toggle b) == b
This expresses that toggling the button twice brings it back to its original state. Unfortunately, QuickCheck
cannot work with this property:
*Main> quickCheck prop_toggle <interactive>:3:1: error: • No instance for (Arbitrary Button) arising from a use of ‘quickCheck’ • In the expression: quickCheck prop_toggle In an equation...