2014-10-30 55 views
5

我正在写一些处理原始指针的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脚本以尝试编译它们并查找特定的错误消息,这些都感觉很诡异。

+4

唉,对失败编译的测试本身并不支持。 rustc本身具有实现这种功能的基础设施('src/test/compile-fail'等),但是它是自定义的并且通常不可用。 – 2014-10-30 23:17:16

+0

@ChrisMorgan:你认为社区会支持这种测试吗? Rust有一个真正发展的类型系统,可以执行大量的检查,验证检查是否实际执行似乎很好。过去,在C++中,我使用了Clang的特定测试('-verify' flag + Clang的具体评论)来处理这类事情;这是相当先进的。 – 2014-10-31 08:48:18

+0

@MatthieuM .:我知道在设计一个库时,有能力测试验证某些代码无法编译。 – 2014-10-31 12:08:53

回答

1

Rust项目有一组特殊的称为“编译 - 失败”测试的测试,它们完全符合您的需求。

compiletest crate是这种想法,允许其他图书馆做同样的事情的提取:那被中途有使用货运的“功能”

fn main() { 
    let x: (u64, bool) = (true, 42u64); 
    //~^ ERROR mismatched types 
    //~^^ ERROR mismatched types 
} 

一个想法。

指定与功能标志测试:

#[test] 
#[cfg(feature = "compile_failure")] 
fn bogus_test() {} 

一下添加到Cargo.toml:

[features] 

compile_failure = [] 

和运行测试,

cargo test --features compile_failure 

最明显的事情,从这个失踪自动检查“是否正确的失败”。如果没有其他的东西,这允许我在我的代码库中进行半测试。

-2

您可以注释一个您预计会失败的测试。

#[should_fail] 

因此,您可以编写一个测试,试图破坏它应该有的生活时间,从而失败,这实际上是一次通过。

为“索引越界”测试的例子见下文(从Rust guides拉)

#[test] 
#[should_fail] 
fn test_out_of_bounds_failure() { 
    let v: &[int] = []; 
    v[0]; 
} 

我相信,这个例子是一个编译错误,所以它会站在原因,你的编译生命周期违规错误也会被这个问题所困扰。

+0

'#[should_fail]'用于运行时失败(现在称为“恐慌”),而不是编译错误。 – 2014-11-11 00:01:44

+0

也许我们需要推一个'#[should_fail_compile]'(半认真的) – thecoshman 2014-11-11 08:34:13

相关问题