我正在编写一些操作原始指针的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
};
}
Run Code Online (Sandbox Code Playgroud)
这无法编译,这正是我想要的.但是,我想进行一些自动检查,即使在对代码进行任何重构之后,这种行为也是如此.
我目前最好的想法是用这段代码编写一次性Rust文件并装配bash脚本以尝试编译它们并查找特定的错误消息,这些都感觉非常hacky.
Rust 项目有一组特殊的测试,称为“编译失败”测试,可以完全满足您的需求。
compiletest箱是这个想法的提取,它允许其他库做同样的事情:
fn main() {
let x: (u64, bool) = (true, 42u64);
//~^ ERROR mismatched types
//~^^ ERROR mismatched types
}
Run Code Online (Sandbox Code Playgroud)
一个可行的想法是使用 Cargo 的“功能”。
使用功能标志指定测试:
#[test]
#[cfg(feature = "compile_failure")]
fn bogus_test() {}
Run Code Online (Sandbox Code Playgroud)
将其添加到 Cargo.toml 中:
[features]
compile_failure = []
Run Code Online (Sandbox Code Playgroud)
并运行测试
cargo test --features compile_failure
Run Code Online (Sandbox Code Playgroud)
其中明显缺少的是“这是否是正确的失败”的自动检查。如果不出意外的话,这允许我在我的代码库中进行半实时的测试。