#attributes #unreachable #static #true #check #hold

static_test

用于编写测试的属性宏,检查给定的条件始终为真或给定的代码路径始终不可达

1个不稳定版本

0.1.0 2019年10月20日

#562 in 测试

MIT/Apache

12KB
194

Build Status

#[static_test]

Documentation

示例

use static_test::static_test;

#[static_test]
fn test_slice_get_will_always_succeed_if_length_is_known( buffer: &[u8] ) -> u8 {
    assume!( buffer.len() == 1 );
    match buffer.get( 0 ) {
        Some( &value ) => value,
        None => static_unreachable!()
    }
}

#[static_test]
fn test_multiplication( value: u8 ) {
    assume!( value == 2 );
    static_assert!( value * 10 == 20 );
}

您可以为每个标记为 #[static_test] 的函数指定任意类型作为参数和返回类型。这些函数的主体实际上永远不会被执行,但是每个 static_assert!static_unreachable! 仍然会间接检查。

如果编译器无法证明每个 static_assert! 总是成立且每个 static_unreachable! 总是不可达,那么在链接时会生成错误。

标记为 #[static_test] 的每个函数都将转换为 #[test] 函数。

assume!static_assert!static_unreachable! 宏由过程宏定义,并且仅在标记为 #[static_test] 的函数内部可用。

注意事项

  • 这至少需要Rust 1.40。
  • 这需要运行链接器,因此它对 cargo check 没有影响。
  • 只有当您开启优化编译代码时,这才会起作用,因为它依赖于优化器来删除不可达的 static_assert!static_unreachable!
  • 如果断言失败,错误消息 可能不会很好

致谢

这受到 no_panic 仓库的启发。

许可证

根据以下任一许可证授权:

根据您的选择。

贡献

除非您明确表示否则,根据Apache-2.0许可证定义的,您有意提交并包含在工作中的任何贡献,将按上述方式双授权,不附加任何额外条款或条件。

依赖项

~1.5MB
~36K SLoC