Library
Module
Module type
Parameter
Class
Class type
type 'a printer = Format.formatter -> 'a -> unit
pretty-printers for items generated by Crowbar; useful for the user in translating test failures into bugfixes.
val int : int gen
int
generates an integer ranging from min_int to max_int, inclusive. If you need integers from a smaller domain, consider using range
.
val uint8 : int gen
uint8
generates an unsigned byte, ranging from 0 to 255 inclusive.
val int8 : int gen
int8
generates a signed byte, ranging from -128 to 127 inclusive.
val float : float gen
float
generates a double-precision floating-point number.
val bytes : string gen
bytes
generates a string of arbitrary length (including zero-length strings).
val bool : bool gen
bool
generates a yes or no answer.
val range : int -> int gen
range n
is a generator for integers between 0 (inclusive) and n
(exclusive). range n
will raise Invalid_argument
for n <= 0
.
map gens map_fn
provides a means for creating generators using other generators' output. For example, one might generate a Char.t from a uint8
:
open Crowbar
let char_gen : Char.t gen = map [uint8] Char.chr
unlazy gen
forces the generator gen
. It is useful when defining generators for recursive data types:
open Crowbar
type a = A of int | Self of a
let rec a_gen = lazy (
choose [
map [int] (fun i -> A i);
map [(unlazy a_gen)] (fun s -> Self s);
])
let lazy a_gen = a_gen
fix fn
applies the function fn
. It is useful when defining generators for recursive data types:
open Crowbar
type a = A of int | Self of a
let rec a_gen = fix (fun a_gen ->
choose [
map [int] (fun i -> A i);
map [a_gen] (fun s -> Self s);
])
val const : 'a -> 'a gen
const a
always generates a
.
option gen
generates either None
or Some x
, where x
is the item generated by gen
.
list gen
makes a generator for lists using gen
. Lists may be empty; for non-empty lists, use list1
.
list1 gen
makes non-empty list generators. For potentially empty lists, use list
.
with_printer printer gen
generates the same values as gen
. If gen
is used to create a failing test case and the test was reached by calling check_eq
without pp
set, printer
will be used to print the failing test case.
val pp : Format.formatter -> ('a, Format.formatter, unit) format -> 'a
val pp_int : int printer
val pp_float : float printer
val pp_bool : bool printer
val pp_string : string printer
val add_test : ?name:string -> ('f, unit) gens -> 'f -> unit
add_test name generators test_fn
adds test_fn
to the list of eligible tests to be run when the program is invoked. At runtime, random data will be sent to generators
to create the input necessary to run test_fn
. Any failures will be printed annotated with name
.
guard b
aborts a test if b
is false. The test will not be recorded or reported as a failure.
bad_test ()
aborts a test. The test will not be recorded or reported as a failure.
nonetheless o
aborts a test if o
is None. The test will not be recorded or reported as a failure.
check b
generates a test failure if b
is false. No useful information will be printed in this case.
val check_eq :
?pp:'a printer ->
?cmp:('a -> 'a -> int) ->
?eq:('a -> 'a -> bool) ->
'a ->
'a ->
unit
check_eq pp cmp eq x y
evaluates whether x and y are equal, and if they are not, raises a failure and prints an error message. Equality is evaluated as follows:
eq
eq
is provided, use a provided cmp
eq
nor cmp
is provided, use Pervasives.compareIf pp
is provided, use this to print x
and y
if they are not equal. If pp
is not provided, a best-effort printer will be generated from the printers for primitive generators and any printers registered with with_printer
and used.