我正在编写一些操作原始指针的Rust代码。然后,这些原始指针通过使用ContravariantLifetime的结构向用户公开,以将结构的生命周期与我的对象联系起来。
我希望能够编写测试来验证面向用户的结构不能比我的对象更长寿。我有以下代码:
fn element_cannot_outlive_parts() {
let mut z = {
let p = Package::new();
p.create() // returns an object that cannot live longer than p
};
}
这无法编译,这正是我想要的。但是,我想进行一些自动检查,即使我对代码进行了任何重构,这种行为也是如此。
目前我最好的想法是使用此代码编写一次性Rust文件并装配bash脚本以尝试编译它们并查找特定的错误消息,这些都感觉非常hacky。
答案 0 :(得分:2)
Rust项目有一组特殊的测试,称为“编译 - 失败”测试,它们可以完全满足您的需求。
compiletest crate是对这个想法的提取,允许其他库做同样的事情:
fn main() {
let x: (u64, bool) = (true, 42u64);
//~^ ERROR mismatched types
//~^^ ERROR mismatched types
}
中途的一个想法就是使用Cargo的“功能”。
使用功能标志指定测试:
#[test]
#[cfg(feature = "compile_failure")]
fn bogus_test() {}
将此添加到Cargo.toml:
[features]
compile_failure = []
以
运行测试cargo test --features compile_failure
显而易见的是,自动检查“它是否是正确的失败”。如果不出意外,这使我可以在我的代码库中进行半生活测试。
答案 1 :(得分:-3)
您可以注释您希望失败的测试。
#[should_fail]
因此,您可以编写一个试图破坏其应有的生命周期的测试,从而失败,这实际上是一个过程。
有关索引越界的测试示例'见下文(从Rust guides拉出来)
#[test]
#[should_fail]
fn test_out_of_bounds_failure() {
let v: &[int] = [];
v[0];
}
我相信这个例子是一个编译错误,所以它也可以理解你的编译生命周期违规错误。