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 在 测试
每月下载量 750
在 3 crates 中使用
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_option
、arbitrary_vec
、arbitrary_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