是否有办法在 Rust 中构建测试,以在不详尽时发出警告? 当然,我不期望通用的解决方案,但我正在寻找一种适用于函数参数是枚举类型的解决方案。 我想检查所有组合是否被使用,就像匹配语句检查所有组合是否被覆盖一样。 例如,考虑以下代码:
// Terrible numerical type
#[derive(Debug,PartialEq)]
pub enum Num {
Int(i32),
Float(f32),
}
// Mathematical operation on this terrible type
pub fn myadd(x : crate::Num, y :Num) -> Num {
match (x,y) {
(Num::Int(x),Num::Int(y)) => Num::Int(x+y),
(Num::Int(x),Num::Float(y)) => Num::Float((x as f32) + y),
(Num::Float(x),Num::Int(y)) => Num::Float(x+(y as f32)),
(Num::Float(x),Num::Float(y)) => Num::Float(x+y),
}
}
// Add testing
#[cfg(test)]
mod test{
use super::*;
#[test]
fn int_int() {
assert_eq!(myadd(Num::Int(1),Num::Int(2)),Num::Int(3));
}
#[test]
fn float_int() {
assert_eq!(myadd(Num::Float(1.),Num::Int(2)),Num::Float(3.));
}
#[test]
fn int_float() {
assert_eq!(myadd(Num::Int(1),Num::Float(2.)),Num::Float(3.));
}
}
在这里,我们缺少了测试float_float
。我希望有一种方法来发出警告,以表示此测试已丢失。如果我们在模式匹配中忘记了Float,Float
情况,将会出现错误:
error[E0004]: non-exhaustive patterns: `(Float(_), Float(_))` not covered
--> src/lib.rs:10:11
|
10 | match (x,y) {
| ^^^^^ pattern `(Float(_), Float(_))` not covered
|
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
我正在尝试获取类似于测试组合的东西。如果有关系的话,我不在乎是否将所有测试组合到单个函数中,而不是分成四个不同的测试。我不知道是否有一种使用模式匹配或其他机制来实现这一点的技巧。