Expand description
This crate provides a helper struct for defining mutually recursive strategies with
proptest
. The prop_recursive
combinator is useful for
defining simple recursive strategies but for two or more mutually recursive strategies it
becomes cumbersome to use. StrategySet
aims to solve this problem.
§Examples
Suppose we have the following mutually recursive types First
and Second
#[derive(Clone, Debug)]
enum First {
Zero,
Second(Vec<Second>),
}
#[derive(Clone, Debug)]
enum Second {
Zero,
First(First),
}
We can define strategies for each using a StrategySet
use proptest_recurse::{StrategySet, StrategyExt};
fn arb_first(set: &mut StrategySet) -> SBoxedStrategy<First> {
Just(First::Zero).prop_mutually_recursive(5, 32, 8, set, |set| {
vec(set.get::<Second, _>(arb_second), 0..8)
.prop_map(First::Second)
.sboxed()
})
}
fn arb_second(set: &mut StrategySet) -> SBoxedStrategy<Second> {
Just(Second::Zero)
.prop_mutually_recursive(3, 32, 1, set, |set| {
set.get::<First, _>(arb_first)
.prop_map(Second::First)
.sboxed()
}).sboxed()
}
To use these strategies, simply pass in an empty StrategySet
proptest! {
#[test]
fn create(_ in arb_first(&mut Default::default())) {}
}
Structs§
- Strategy
Set - A collection of strategies that depend on each other. This type is cheap to clone.
Traits§
- Strategy
Ext - Extension methods for strategies.