#collection #combinator #standard #generate #ext #function #set

arbitrary_ext

提供组合函数以生成具有自定义任意函数的标准集合

4 个版本 (2 个破坏性更新)

0.3.0 2022 年 11 月 23 日
0.2.1 2022 年 10 月 19 日
0.2.0 2022 年 10 月 19 日
0.1.0 2022 年 10 月 18 日

#336测试

Download history 184/week @ 2024-03-14 177/week @ 2024-03-21 224/week @ 2024-03-28 113/week @ 2024-04-04 123/week @ 2024-04-11 103/week @ 2024-04-18 112/week @ 2024-04-25 228/week @ 2024-05-02 106/week @ 2024-05-09 109/week @ 2024-05-16 267/week @ 2024-05-23 148/week @ 2024-05-30 168/week @ 2024-06-06 188/week @ 2024-06-13 195/week @ 2024-06-20 179/week @ 2024-06-27

每月下载量 750
3 crates 中使用

MIT 许可证

11KB
137

Arbitrary Ext

1.2.0 Arbitrary 支持为 derive 字段提供自定义任意实现。

但是如果一个没有实现 Arbitrary 的类型被封装在一个泛型类型中,这仍然很棘手。

此 crate 提供了一组函数组合器,以支持标准库中的容器和集合。

请参见下面的示例。

用法

use arbitrary_ext::{arbitrary_option, arbitrary_vec, arbitrary_hash_map};
use std::collections::HashMap;

// Imagine this is a foreign type, that by some reason does not implement Arbitrary trait.
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
struct Number(u32);

// Our custom function to generate arbitrary Number out of Unstructured.
fn arbitrary_number(u: &mut Unstructured) -> arbitrary::Result<Number> {
    let value = u.int_in_range(0..=1000)?;
    Ok(Number(value))
}

#[derive(Debug, Arbitrary)]
struct Example {
    #[arbitrary(with = arbitrary_number)]
    number: Number,

    #[arbitrary(with = arbitrary_option(arbitrary_number))]
    option: Option<Number>,

    #[arbitrary(with = arbitrary_vec(arbitrary_number))]
    vec: Vec<Number>,

    #[arbitrary(
        with = arbitrary_hash_map(
            arbitrary_number,
            arbitrary_vec(arbitrary_option(arbitrary_number))
        )
    )]
    hash_map: HashMap<Number, Vec<Option<Number>>>,
}

在没有 arbitrary_optionarbitrary_vecarbitrary_hash_map 组合器的情况下,将被迫实现自定义函数来生成任意的 Option<Number>Vec<Number>HashMap<Number, Vec<Option<Number>>>。例如。

fn arbitrary_option_number(u: &mut Unstructured) -> arbitrary::Result<Option<Number>>;
fn arbitrary_vec_number(u: &mut Unstructured) -> arbitrary::Result<Vec<Number>>;
fn arbitrary_hash_map_of_numbers(u: &mut Unstructured) -> arbitrary::Result<HashMap<Number, Vec<Option<Number>>>>;

但这很快就会变得繁琐。

crate 的历史

最初创建此 crate 是为了解决这个 Arbitrary 问题,但后来在 这个 PR 中得到了解决。

依赖关系

~0.4–0.8MB
~19K SLoC