Testing Rust Projects
Table Cases
Check Several Inputs
A list of input and expected-output pairs can exercise the same helper across several cases.
Program
Play the program to choose an offset and run three table cases through the same loop.
table_cases.rs
Replay: real traced execution (multi-file project)
fn main() {
let offset = 1;
let cases = [(1, 1 + offset), (2, 2 + offset), (3, 3 + offset)];
let mut passed = 0;
for (input, expected) in cases {
assert_eq!(shift(input, offset), expected);
passed += 1;
}
println!("{passed}");
}
fn shift(value: i32, offset: i32) -> i32 {
value + offset
}
fn main() {
let offset = 2;
let cases = [(1, 1 + offset), (2, 2 + offset), (3, 3 + offset)];
let mut passed = 0;
for (input, expected) in cases {
assert_eq!(shift(input, offset), expected);
passed += 1;
}
println!("{passed}");
}
fn shift(value: i32, offset: i32) -> i32 {
value + offset
}
fn main() {
let offset = 3;
let cases = [(1, 1 + offset), (2, 2 + offset), (3, 3 + offset)];
let mut passed = 0;
for (input, expected) in cases {
assert_eq!(shift(input, offset), expected);
passed += 1;
}
println!("{passed}");
}
fn shift(value: i32, offset: i32) -> i32 {
value + offset
}
offset ← 1, cases ← [(1, 2), (2, 3), (3, 4)], passed ← 0
1fn main() {2 let offse→ 1t = 1; //@offset=1, 2, 33 let case→ [(1, 2), (2, 3), (3, 4)]s = [(1, 1 + offse1t), (2, 2 + offset), (3, 3 + offset)];4 let mut passe→ 0d = 0;5 for (input, expected) in cases {for (input, expected) in cases
pass 1 of 34let mut passed = 0;5for (input, expected) in case[(1, 2), (2, 3), (3, 4)]s {6 assert_eq!(shift(input, offset), expected);7 passed += 1;fn shift(value: i32, offset: i32) -> i32
pass 1 of 312fn shift(value: i32, offset: i32) -> i32 {13 valu1e + offse1t14}All 3 passes — pass 1 is the card above pass value1 1 2 2 3 3 passed ← 1
5for (input, expected) in cases {6 assert_eq!(shift(input, offset), expected);7 passe→ 1d += 1;8}passed ← 2
5for (input, expected) in cases {6 assert_eq!(shift(input, offset), expected);7 passe→ 2d += 1;8}passed ← 3
5 for (input, expected) in cases {6 assert_eq!(shift(input, offset), expected);7 passe→ 3d += 1;8 }9 println!("{passed}");10}output3
offset ← 2, cases ← [(1, 3), (2, 4), (3, 5)], passed ← 0
1fn main() {2 let offse→ 2t = 2;3 let case→ [(1, 3), (2, 4), (3, 5)]s = [(1, 1 + offse2t), (2, 2 + offset), (3, 3 + offset)];4 let mut passe→ 0d = 0;5 for (input, expected) in cases {for (input, expected) in cases
pass 1 of 34let mut passed = 0;5for (input, expected) in case[(1, 3), (2, 4), (3, 5)]s {6 assert_eq!(shift(input, offset), expected);7 passed += 1;fn shift(value: i32, offset: i32) -> i32
pass 1 of 312fn shift(value: i32, offset: i32) -> i32 {13 valu1e + offse2t14}All 3 passes — pass 1 is the card above pass value1 1 2 2 3 3 passed ← 1
5for (input, expected) in cases {6 assert_eq!(shift(input, offset), expected);7 passe→ 1d += 1;8}passed ← 2
5for (input, expected) in cases {6 assert_eq!(shift(input, offset), expected);7 passe→ 2d += 1;8}passed ← 3
5 for (input, expected) in cases {6 assert_eq!(shift(input, offset), expected);7 passe→ 3d += 1;8 }9 println!("{passed}");10}output3
offset ← 3, cases ← [(1, 4), (2, 5), (3, 6)], passed ← 0
1fn main() {2 let offse→ 3t = 3;3 let case→ [(1, 4), (2, 5), (3, 6)]s = [(1, 1 + offse3t), (2, 2 + offset), (3, 3 + offset)];4 let mut passe→ 0d = 0;5 for (input, expected) in cases {for (input, expected) in cases
pass 1 of 34let mut passed = 0;5for (input, expected) in case[(1, 4), (2, 5), (3, 6)]s {6 assert_eq!(shift(input, offset), expected);7 passed += 1;fn shift(value: i32, offset: i32) -> i32
pass 1 of 312fn shift(value: i32, offset: i32) -> i32 {13 valu1e + offse3t14}All 3 passes — pass 1 is the card above pass value1 1 2 2 3 3 passed ← 1
5for (input, expected) in cases {6 assert_eq!(shift(input, offset), expected);7 passe→ 1d += 1;8}passed ← 2
5for (input, expected) in cases {6 assert_eq!(shift(input, offset), expected);7 passe→ 2d += 1;8}passed ← 3
5 for (input, expected) in cases {6 assert_eq!(shift(input, offset), expected);7 passe→ 3d += 1;8 }9 println!("{passed}");10}output3
table-driven test
A case table keeps inputs and expected outputs near each other.
loop
The loop applies the same assertion to every case.
coverage
Several small cases can cover more behavior than one example.