#constraints #composable #fixtures

contrafact

一种高度可组合的约束("事实")特质,可用于验证数据和在这些约束内生成任意数据

10 个版本

0.2.0-rc.12023年6月30日
0.2.0-dev.32023年6月10日
0.1.1 2023年6月8日
0.1.0-dev.12021年5月18日

#361 in 测试

Download history 801/week @ 2024-04-21 884/week @ 2024-04-28 581/week @ 2024-05-05 601/week @ 2024-05-12 816/week @ 2024-05-19 660/week @ 2024-05-26 816/week @ 2024-06-02 560/week @ 2024-06-09 724/week @ 2024-06-16 801/week @ 2024-06-23 433/week @ 2024-06-30 548/week @ 2024-07-07 800/week @ 2024-07-14 380/week @ 2024-07-21 720/week @ 2024-07-28 611/week @ 2024-08-04

2,533 个月下载量
13 个 Crates 中使用(6 个直接使用)

MIT 许可证

66KB
1.5K SLoC

contrafact-rs

CI Docs

一种高度可组合的约束("事实")特质,可用于验证数据和在这些约束内生成任意数据

有关更多信息,请参阅 rust 文档

待办事项

  • 将 Arbitrary 作为功能,通用数据生成
  • 添加 lens-rs 支持

lib.rs:

一种高度可组合的约束("事实")特质,可用于验证数据和在这些约束内生成任意数据满足这些约束。

此 crate 主要用于编写测试,特别是用于生成有意义的测试数据。通过定义可组合、可重用的约束,可以将它们混合匹配以处理测试的具体用例。通过定义对测试数据的需要,而不是简单地编写所需的数据,希望随着时间的推移节省重复的工作。

示例

以下示例定义了一个简单的结构体 S,其中包含两个字段,以及一个关于 S 的简单事实(约束),说明 S:: 必须始终等于 1。这个事实,像所有事实一样,可以用来验证 S 的实例是否满足约束,也可以用来生成满足约束的新 S 实例。

use contrafact::{Fact, facts::{eq, lens1}};
use arbitrary::{Arbitrary, Unstructured};

#[derive(Debug, Clone, PartialEq, Arbitrary)]
struct S {
    x: u32,
    y: u32,
}

let mut fact = lens1("S::x", |s: &mut S| &mut s.x, eq(1));

assert!(fact.clone().check(&S {x: 1, y: 333}).is_ok());
assert!(fact.clone().check(&S {x: 2, y: 333}).is_err());

// NB: don't actually construct a Generator this way! See the docs for [[`Generator`]].
let mut g = contrafact::utils::random_generator();
let a = fact.build(&mut g);
assert_eq!(a.x, 1);

注意事项

上述示例组合了此 crate 提供的现有事实。您也可以通过实现 Fact 特质手动定义自己的事实。 待办事项:示例。

contrafact 严重依赖 arbitrary crate 生成任意数据。了解这个库,因为您需要为任何您想编写 Fact 的类型实现 Arbitrary

可以通过 [Fact::check()] 或 check_seq 来使用事实来检查约束是否匹配,也可以通过 Fact::buildbuild_seq 来构建新的值。构建值需要使用 arbitrary::Unstructured

事实也可以是状态化的,这样在检查或构建序列时约束会发生变化。TODO: 状态化事实的示例。

可以通过 facts! 宏轻松地将事实“水平”组合在一起,该宏将每个事实装箱并将它们作为特例对象一起打包,逐个应用每个事实。

可以通过 lensprism 组合子将事实“垂直”组合在一起,这些组合子允许您将一个类型的事实提升为另一个类型的事实。

有关此包中定义的每个事实的更多示例和详细说明,请参阅函数文档。

依赖项

~1.5–2.4MB
~47K SLoC