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
fn main() {
    let offset = ;
    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 = ;
    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 = ;
    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
}
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.