Shrinking is used to reduce the size of a counter-example. It tries to make the counter-example smaller by decreasing it, or removing elements, until the property to test holds again; then it returns the smallest value that still made the test fail.
val int : int t
val string : string t
filter f shrink
shrinks values the same as shrink
, but
only keep smaller values that satisfy f
.
This way it's easy to preserve invariants that are enforced by
generators, when shrinking values
val int_aggressive : int t
Shrink integers by trying all smaller integers (can take a lot of time!)
Try to shrink lists by removing elements one by one.
int list
one can try to decrease the integers).pair a b
uses a
to shrink the first element of tuples,
then tries to shrink the second element using b
.
It is often better, when generating tuples, to put the "simplest"
element first (atomic type rather than list, etc.) because it will be
shrunk earlier. In particular, putting functions last might help.