T
- The type of generated objects. Primitive objects (e.g. int, boolean etc.) are represented by their boxed
type (e.g. Integer, Boolean).@API(status=STABLE,
since="1.0")
public interface Arbitrary<T>
Modifier and Type | Interface and Description |
---|---|
static class |
Arbitrary.ArbitraryFacade |
Modifier and Type | Method and Description |
---|---|
default java.util.Optional<java.util.stream.Stream<T>> |
allValues()
Create optional stream of all possible values this arbitrary could generate.
|
default <A> StreamableArbitrary<T,A> |
array(java.lang.Class<A> arrayClass)
Create a new arbitrary of type
T[] using the existing arbitrary for generating the elements of the array. |
default Arbitrary<java.lang.Object> |
asGeneric()
Sometimes simplifies test writing
|
default Arbitrary<java.util.List<T>> |
collect(java.util.function.Predicate<java.util.List<T>> until)
Create a new arbitrary of type
List<T> by adding elements of type T until condition until is fulfilled. |
default Arbitrary<T> |
dontShrink()
Create a new arbitrary of type
T that will use the underlying
arbitrary to create the tuple values but will return unshrinkable values. |
EdgeCases<T> |
edgeCases() |
default java.util.Optional<ExhaustiveGenerator<T>> |
exhaustive()
Create the exhaustive generator for an arbitrary using the maximum allowed
number of generated samples.
|
default java.util.Optional<ExhaustiveGenerator<T>> |
exhaustive(long maxNumberOfSamples)
Create the exhaustive generator for an arbitrary.
|
default Arbitrary<T> |
filter(java.util.function.Predicate<T> filterPredicate)
Create a new arbitrary of the same type
T that creates and shrinks the original arbitrary but only allows
values that are accepted by the filterPredicate . |
default Arbitrary<T> |
fixGenSize(int genSize)
Fix the genSize of an arbitrary so that it can no longer be influenced from outside
|
default <U> Arbitrary<U> |
flatMap(java.util.function.Function<T,Arbitrary<U>> mapper)
Create a new arbitrary of type
U that uses the values of the existing arbitrary to create a new arbitrary
using the mapper function. |
default void |
forEachValue(java.util.function.Consumer<? super T> action)
Iterate through each value this arbitrary can generate if - and only if -
exhaustive generation is possible.
|
RandomGenerator<T> |
generator(int genSize)
Create the random generator for an arbitrary
|
default Arbitrary<T> |
ignoreException(java.lang.Class<? extends java.lang.Throwable> exceptionType)
Create a new arbitrary of type
T that will use the underlying
arbitrary to create the tuple values but will ignore any raised exception of
type exceptionType during generation. |
default Arbitrary<T> |
injectDuplicates(double duplicateProbability)
Create a new arbitrary of type
Iterable<T> that will
inject duplicates of previously generated values with a probability of duplicateProbability . |
default Arbitrary<T> |
injectNull(double nullProbability)
Create a new arbitrary of the same type but inject null values with a probability of
nullProbability . |
default boolean |
isUnique()
All arbitraries whose base generator is supposed to produce no duplicates
should return true.
|
default IteratorArbitrary<T> |
iterator()
Create a new arbitrary of type
Iterable<T> using the existing arbitrary for generating the elements of the
stream. |
default ListArbitrary<T> |
list()
Create a new arbitrary of type
List<T> using the existing arbitrary for generating the elements of the list. |
default <U> Arbitrary<U> |
map(java.util.function.Function<T,U> mapper)
Create a new arbitrary of type
U that maps the values of the original arbitrary using the mapper
function. |
default Arbitrary<java.util.Optional<T>> |
optional()
Create a new arbitrary of type
Optional<T> using the existing arbitrary for generating the elements of the
stream. |
default T |
sample()
Generate a single sample value using this arbitrary.
|
default java.util.stream.Stream<T> |
sampleStream()
Generate a stream of sample values using this arbitrary.
|
default SetArbitrary<T> |
set()
Create a new arbitrary of type
Set<T> using the existing arbitrary for generating the elements of the set. |
default StreamArbitrary<T> |
stream()
Create a new arbitrary of type
Stream<T> using the existing arbitrary
for generating the elements of the stream. |
default Arbitrary<Tuple.Tuple1<T>> |
tuple1()
Create a new arbitrary of type
Tuple.Tuple1<T> that will use the underlying
arbitrary to create the tuple value; |
default Arbitrary<Tuple.Tuple2<T,T>> |
tuple2()
Create a new arbitrary of type
Tuple.Tuple2<T, T> that will use the underlying
arbitrary to create the tuple values; |
default Arbitrary<Tuple.Tuple3<T,T,T>> |
tuple3()
Create a new arbitrary of type
Tuple.Tuple3<T, T, T> that will use the underlying
arbitrary to create the tuple values; |
default Arbitrary<Tuple.Tuple4<T,T,T,T>> |
tuple4()
Create a new arbitrary of type
Tuple.Tuple4<T, T, T, T> that will use the underlying
arbitrary to create the tuple values; |
default Arbitrary<T> |
unique()
Create a new arbitrary of the same type
T that creates and shrinks the original arbitrary but will
never generate the same value twice. |
RandomGenerator<T> generator(int genSize)
genSize
- a very unspecific configuration parameter that can be used
to influence the configuration and behaviour of a random generator
if and only if the generator wants to be influenced.
Many generators are independent of genSize.
The default value of genSize
is the number of tries configured
for a property. Use fixGenSize(int) to fix
the parameter for a given arbitrary.
@API(status=INTERNAL) default Arbitrary<java.lang.Object> asGeneric()
@API(status=INTERNAL) default boolean isUnique()
@API(status=INTERNAL) default java.util.Optional<ExhaustiveGenerator<T>> exhaustive()
@API(status=INTERNAL) default java.util.Optional<ExhaustiveGenerator<T>> exhaustive(long maxNumberOfSamples)
maxNumberOfSamples
this can take a long time.
This method must be overridden in all arbitraries that support exhaustive
generation.maxNumberOfSamples
- The maximum number of samples considered.
If during generation it becomes clear that this
number will be exceeded generation stops.default java.util.Optional<java.util.stream.Stream<T>> allValues()
@API(status=MAINTAINED, since="1.1.2") default void forEachValue(java.util.function.Consumer<? super T> action)
action
- the consumer function to be invoked for each valuejava.lang.AssertionError
- if exhaustive generation is not possibledefault Arbitrary<T> filter(java.util.function.Predicate<T> filterPredicate)
T
that creates and shrinks the original arbitrary but only allows
values that are accepted by the filterPredicate
.JqwikException
- if filtering will fail to come up with a value after 10000 triesdefault <U> Arbitrary<U> map(java.util.function.Function<T,U> mapper)
U
that maps the values of the original arbitrary using the mapper
function.default <U> Arbitrary<U> flatMap(java.util.function.Function<T,Arbitrary<U>> mapper)
U
that uses the values of the existing arbitrary to create a new arbitrary
using the mapper
function.default Arbitrary<T> injectNull(double nullProbability)
nullProbability
.default Arbitrary<T> unique()
T
that creates and shrinks the original arbitrary but will
never generate the same value twice.JqwikException
- if filtering will fail to come up with a value after 10000 tries@API(status=MAINTAINED, since="1.2.0") default Arbitrary<T> fixGenSize(int genSize)
default ListArbitrary<T> list()
List<T>
using the existing arbitrary for generating the elements of the list.default SetArbitrary<T> set()
Set<T>
using the existing arbitrary for generating the elements of the set.default StreamArbitrary<T> stream()
Stream<T>
using the existing arbitrary
for generating the elements of the stream.default IteratorArbitrary<T> iterator()
Iterable<T>
using the existing arbitrary for generating the elements of the
stream.default <A> StreamableArbitrary<T,A> array(java.lang.Class<A> arrayClass)
T[]
using the existing arbitrary for generating the elements of the array.arrayClass
- The arrays class to create, e.g. String[].class
. This is required due to limitations in Java's
reflection capabilities.default Arbitrary<java.util.Optional<T>> optional()
Optional<T>
using the existing arbitrary for generating the elements of the
stream.
The new arbitrary also generates Optional.empty()
values with a probability of 0.05
(i.e. 1 in 20).
@API(status=MAINTAINED, since="1.3.0") default Arbitrary<java.util.List<T>> collect(java.util.function.Predicate<java.util.List<T>> until)
List<T>
by adding elements of type T until condition until
is fulfilled.@API(status=MAINTAINED, since="1.3.0") default java.util.stream.Stream<T> sampleStream()
The underlying generator is created with size 1000. Outside a property a new instance of Random will be created to feed the generator.
Using this method within a property does not break reproducibility of results, i.e. rerunning it with same seed will also generate the same values.
@API(status=MAINTAINED, since="1.3.0") default T sample()
Some additional things to be aware of:
@API(status=MAINTAINED, since="1.3.0") default Arbitrary<T> injectDuplicates(double duplicateProbability)
Iterable<T>
that will
inject duplicates of previously generated values with a probability of duplicateProbability
.
Shrinking behavior for duplicate values -- if duplication is required for falsification -- is poor, i.e. those duplicate values cannot be shrunk to "smaller" duplicate values.
duplicateProbability
- The probability with which a previous value will be generated@API(status=MAINTAINED, since="1.3.0") default Arbitrary<Tuple.Tuple1<T>> tuple1()
Tuple.Tuple1<T>
that will use the underlying
arbitrary to create the tuple value;@API(status=MAINTAINED, since="1.3.0") default Arbitrary<Tuple.Tuple2<T,T>> tuple2()
Tuple.Tuple2<T, T>
that will use the underlying
arbitrary to create the tuple values;@API(status=MAINTAINED, since="1.3.0") default Arbitrary<Tuple.Tuple3<T,T,T>> tuple3()
Tuple.Tuple3<T, T, T>
that will use the underlying
arbitrary to create the tuple values;@API(status=MAINTAINED, since="1.3.0") default Arbitrary<Tuple.Tuple4<T,T,T,T>> tuple4()
Tuple.Tuple4<T, T, T, T>
that will use the underlying
arbitrary to create the tuple values;@API(status=EXPERIMENTAL, since="1.3.1") default Arbitrary<T> ignoreException(java.lang.Class<? extends java.lang.Throwable> exceptionType)
T
that will use the underlying
arbitrary to create the tuple values but will ignore any raised exception of
type exceptionType
during generation.exceptionType
- The exception type to ignore@API(status=EXPERIMENTAL, since="1.3.2") default Arbitrary<T> dontShrink()
T
that will use the underlying
arbitrary to create the tuple values but will return unshrinkable values.
This might be necessary if values are being mutated during a property run
and the mutated state would make a shrunk value invalid.
This is a hack to get around a weakness in jqwik's shrinking mechanism