1个不稳定版本
0.1.0 | 2019年10月20日 |
---|
#562 in 测试
12KB
194 行
#[static_test]
示例
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,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
根据您的选择。
贡献
除非您明确表示否则,根据Apache-2.0许可证定义的,您有意提交并包含在工作中的任何贡献,将按上述方式双授权,不附加任何额外条款或条件。
依赖项
~1.5MB
~36K SLoC