#递归 #proptest #策略 #辅助 #相互 #策略 #克隆

proptest-recurse

使用 proptest 定义相互递归策略的辅助工具

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 数据结构

Download history 48/week @ 2024-04-06 4/week @ 2024-04-13 15/week @ 2024-04-27 1/week @ 2024-05-04 5/week @ 2024-05-11 3/week @ 2024-05-18 21/week @ 2024-06-01 1/week @ 2024-06-08 22/week @ 2024-06-15 1/week @ 2024-06-22 4/week @ 2024-07-06 6/week @ 2024-07-13 83/week @ 2024-07-20

每月下载量 93

MIT/Apache

11KB
152 代码行

Crates.io Docs.rs

proptest-recurse

使用 proptest 定义相互递归策略的辅助工具。


lib.rs:

本软件包提供了一种辅助结构体,用于使用 proptest 定义相互递归策略。当需要定义简单的递归策略时,prop_recursive 组合器非常有用,但对于两个或更多相互递归策略,使用起来会变得相当繁琐。 StrategySet 旨在解决这个问题。

示例

假设我们有以下相互递归的类型 FirstSecond

#[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