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.

offset
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
}
  1. 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 {
  2. for (input, expected) in cases

    pass 1 of 3
    4let 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;
  3. fn shift(value: i32, offset: i32) -> i32

    pass 1 of 3
    12fn shift(value: i32, offset: i32) -> i32 {13    valu1e + offse1t14}
    All 3 passes — pass 1 is the card above
    passvalue
    11
    22
    33
  4. passed ← 1

    5for (input, expected) in cases {6    assert_eq!(shift(input, offset), expected);7    passe→ 1d += 1;8}
  5. passed ← 2

    5for (input, expected) in cases {6    assert_eq!(shift(input, offset), expected);7    passe→ 2d += 1;8}
  6. 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
  1. 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 {
  2. for (input, expected) in cases

    pass 1 of 3
    4let 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;
  3. fn shift(value: i32, offset: i32) -> i32

    pass 1 of 3
    12fn shift(value: i32, offset: i32) -> i32 {13    valu1e + offse2t14}
    All 3 passes — pass 1 is the card above
    passvalue
    11
    22
    33
  4. passed ← 1

    5for (input, expected) in cases {6    assert_eq!(shift(input, offset), expected);7    passe→ 1d += 1;8}
  5. passed ← 2

    5for (input, expected) in cases {6    assert_eq!(shift(input, offset), expected);7    passe→ 2d += 1;8}
  6. 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
  1. 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 {
  2. for (input, expected) in cases

    pass 1 of 3
    4let 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;
  3. fn shift(value: i32, offset: i32) -> i32

    pass 1 of 3
    12fn shift(value: i32, offset: i32) -> i32 {13    valu1e + offse3t14}
    All 3 passes — pass 1 is the card above
    passvalue
    11
    22
    33
  4. passed ← 1

    5for (input, expected) in cases {6    assert_eq!(shift(input, offset), expected);7    passe→ 1d += 1;8}
  5. passed ← 2

    5for (input, expected) in cases {6    assert_eq!(shift(input, offset), expected);7    passe→ 2d += 1;8}
  6. 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.