5 releases (breaking)
| 0.5.0 | Aug 9, 2021 |
|---|---|
| 0.4.0 | Sep 4, 2020 |
| 0.3.0 | Oct 19, 2019 |
| 0.2.0 | Nov 3, 2018 |
| 0.1.0 | Nov 1, 2018 |
#2638 in Rust patterns
3,516 downloads per month
Used in hugr-passes
11KB
152 lines
proptest-recurse
Helper for defining mutually recursive strategies with proptest.
lib.rs:
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())) {}
}
Dependencies
~4MB
~73K SLoC