A table-driven test runs the same check over several input values.

Count passing cases

multiplier
table_cases.swift
Replay: real traced execution (multi-file project)
let multiplier = 2
let inputs = [1, 2, 3]
let expected = [2, 4, 6]
var passed = 0

for index in 0..<inputs.count {
    let actual = inputs[index] * multiplier
    if actual == expected[index] {
        passed += 1
    }
}

let message = "passed=\(passed)/\(inputs.count)"

print(message)
let multiplier = 3
let inputs = [1, 2, 3]
let expected = [2, 4, 6]
var passed = 0

for index in 0..<inputs.count {
    let actual = inputs[index] * multiplier
    if actual == expected[index] {
        passed += 1
    }
}

let message = "passed=\(passed)/\(inputs.count)"

print(message)
let multiplier = 4
let inputs = [1, 2, 3]
let expected = [2, 4, 6]
var passed = 0

for index in 0..<inputs.count {
    let actual = inputs[index] * multiplier
    if actual == expected[index] {
        passed += 1
    }
}

let message = "passed=\(passed)/\(inputs.count)"

print(message)
  1. multiplier ← 2, inputs ← [1, 2, 3], expected ← [2, 4, 6], passed ← 0

    1let multiplier→ 2 = 2  //@multiplier=3, 42let inputs→ [1, 2, 3] = [1, 2, 3]3let expected→ [2, 4, 6] = [2, 4, 6]4var passed→ 0 = 0
  2. actual ← 2

    pass 1 of 3
    6for index0 in 0..<inputs.count3 {7    let actual→ 2 = inputs[index]1 * multiplier28    if actual == expected[index] {
    All 3 passes — pass 1 is the card above
    passindexinputs[index]actual
    1012
    2124
    3236
  3. if actual == expected[index]

    pass 1 of 3
    7let actual = inputs[index] * multiplier8if actual2 == expected[index]2 {9    passed0 += 110}
    All 3 passes — pass 1 is the card above
    passactualexpected[index]passed
    1220
    2441
    3662
  4. message ← passed=3/3

    13let message→ passed=3/3 = "passed=\(passed3)/\(inputs.count3)"1415print(messagepassed=3/3)
    outputpassed=3/3
  1. multiplier ← 3, inputs ← [1, 2, 3], expected ← [2, 4, 6], passed ← 0

    1let multiplier→ 3 = 32let inputs→ [1, 2, 3] = [1, 2, 3]3let expected→ [2, 4, 6] = [2, 4, 6]4var passed→ 0 = 0
  2. actual ← 3

    pass 1 of 3
    6for index0 in 0..<inputs.count3 {7    let actual→ 3 = inputs[index]1 * multiplier38    if actual == expected[index] {
    All 3 passes — pass 1 is the card above
    passindexinputs[index]actual
    1013
    2126
    3239
  3. message ← passed=0/3

    13let message→ passed=0/3 = "passed=\(passed0)/\(inputs.count3)"1415print(messagepassed=0/3)
    outputpassed=0/3
  1. multiplier ← 4, inputs ← [1, 2, 3], expected ← [2, 4, 6], passed ← 0

    1let multiplier→ 4 = 42let inputs→ [1, 2, 3] = [1, 2, 3]3let expected→ [2, 4, 6] = [2, 4, 6]4var passed→ 0 = 0
  2. actual ← 4

    pass 1 of 3
    6for index0 in 0..<inputs.count3 {7    let actual→ 4 = inputs[index]1 * multiplier48    if actual == expected[index] {
    All 3 passes — pass 1 is the card above
    passindexinputs[index]actual
    1014
    2128
    32312
  3. message ← passed=0/3

    13let message→ passed=0/3 = "passed=\(passed0)/\(inputs.count3)"1415print(messagepassed=0/3)
    outputpassed=0/3
table-driven test A loop can apply one testing rule to each input and count how many cases pass.