5 个版本 (重大更新)
0.5.0 | 2021 年 8 月 9 日 |
---|---|
0.4.0 | 2020 年 9 月 4 日 |
0.3.0 | 2019 年 10 月 19 日 |
0.2.0 | 2018 年 11 月 3 日 |
0.1.0 | 2018 年 11 月 1 日 |
#1279 in 数据结构
每月下载量 93
11KB
152 代码行
proptest-recurse
使用 proptest 定义相互递归策略的辅助工具。
lib.rs
:
本软件包提供了一种辅助结构体,用于使用 proptest
定义相互递归策略。当需要定义简单的递归策略时,prop_recursive
组合器非常有用,但对于两个或更多相互递归策略,使用起来会变得相当繁琐。 StrategySet
旨在解决这个问题。
示例
假设我们有以下相互递归的类型 First
和 Second
#[derive(Clone, Debug)]
enum First {
Zero,
Second(Vec<Second>),
}
#[derive(Clone, Debug)]
enum Second {
Zero,
First(First),
}
我们可以使用 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()
}
#
要使用这些策略,只需传递一个空的 StrategySet
#
#
#
#
#
#
#
proptest! {
#[test]
fn create(_ in arb_first(&mut Default::default())) {}
}
依赖关系
~3MB
~64K SLoC