A small table of cases can check the same behavior for several inputs.

table test A table test repeats the same check for each row of input and expected output.

Table Cases

factor
table_cases.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;

sub multiply {
    my ($value, $factor) = @_;
    return $value * $factor;
}

my $factor = 2;
my @inputs = (1, 2, 3);
my @expected = (2, 4, 6);
my $passed = 0;
my $failed = 0;

foreach my $index (0 .. 2) {
    my $actual = multiply($inputs[$index], $factor);
    if ($actual == $expected[$index]) {
        $passed = $passed + 1;
    } else {
        $failed = $failed + 1;
    }
}

print "factor=$factor\n";
print "passed=$passed\n";
print "failed=$failed\n";
use strict;
use warnings;

sub multiply {
    my ($value, $factor) = @_;
    return $value * $factor;
}

my $factor = 1;
my @inputs = (1, 2, 3);
my @expected = (2, 4, 6);
my $passed = 0;
my $failed = 0;

foreach my $index (0 .. 2) {
    my $actual = multiply($inputs[$index], $factor);
    if ($actual == $expected[$index]) {
        $passed = $passed + 1;
    } else {
        $failed = $failed + 1;
    }
}

print "factor=$factor\n";
print "passed=$passed\n";
print "failed=$failed\n";
use strict;
use warnings;

sub multiply {
    my ($value, $factor) = @_;
    return $value * $factor;
}

my $factor = 3;
my @inputs = (1, 2, 3);
my @expected = (2, 4, 6);
my $passed = 0;
my $failed = 0;

foreach my $index (0 .. 2) {
    my $actual = multiply($inputs[$index], $factor);
    if ($actual == $expected[$index]) {
        $passed = $passed + 1;
    } else {
        $failed = $failed + 1;
    }
}

print "factor=$factor\n";
print "passed=$passed\n";
print "failed=$failed\n";
  1. $factor ← 2, @inputs ← 3, @expected ← 3, $passed ← 0, $failed ← 0

    9my $factor→ 2 = 2; #@factor=1, 310my @inputs→ 3 = (1, 2, 3);11my @expected→ 3 = (2, 4, 6);12my $passed→ 0 = 0;13my $failed→ 0 = 0;
  2. foreach my $index (0 .. 2)

    pass 1 of 3
    15foreach my $index0 (0 .. 2) {16    my $actual = multiply($inputs[$index]1, $factor2);17    if ($actual == $expected[$index]) {
    All 3 passes — pass 1 is the card above
    pass$index$inputs[$index]
    101
    212
    323
  3. $value ← 1, $factor ← 2

    pass 1 of 3
    4sub multiply {5    my ($value→ 1, $factor→ 2) = @_;6    return $value1 * $factor2;7}
    All 3 passes — pass 1 is the card above
    pass$value$factor
    112
    222
    332
  4. $actual ← 2

    15foreach my $index (0 .. 2) {16    my $actual→ 2 = multiply($inputs[$index]1, $factor2);17    if ($actual == $expected[$index]) {
  5. $passed ← 1

    pass 1 of 3
    16my $actual = multiply($inputs[$index], $factor);17if ($actual2 == $expected[$index]2) {18    $passed→ 1 = $passed + 1;19} else {
    All 3 passes — pass 1 is the card above
    pass$actual$expected[$index]$passed
    1220 1
    2441 2
    3662 3
  6. $actual ← 4

    15foreach my $index (0 .. 2) {16    my $actual→ 4 = multiply($inputs[$index]2, $factor2);17    if ($actual == $expected[$index]) {
  7. $actual ← 6

    15foreach my $index (0 .. 2) {16    my $actual→ 6 = multiply($inputs[$index]3, $factor2);17    if ($actual == $expected[$index]) {
  8. print "factor=$factor ";

    24print "factor=$factor2\n";25print "passed=$passed3\n";26print "failed=$failed0\n";
    outputfactor=2
    passed=3
    failed=0
  1. $factor ← 1, @inputs ← 3, @expected ← 3, $passed ← 0, $failed ← 0

    9my $factor→ 1 = 1;10my @inputs→ 3 = (1, 2, 3);11my @expected→ 3 = (2, 4, 6);12my $passed→ 0 = 0;13my $failed→ 0 = 0;
  2. foreach my $index (0 .. 2)

    pass 1 of 3
    15foreach my $index0 (0 .. 2) {16    my $actual = multiply($inputs[$index]1, $factor1);17    if ($actual == $expected[$index]) {
    All 3 passes — pass 1 is the card above
    pass$index$inputs[$index]
    101
    212
    323
  3. $value ← 1, $factor ← 1

    pass 1 of 3
    4sub multiply {5    my ($value→ 1, $factor→ 1) = @_;6    return $value1 * $factor1;7}
    All 3 passes — pass 1 is the card above
    pass$value$factor
    111
    221
    331
  4. $actual ← 1

    15foreach my $index (0 .. 2) {16    my $actual→ 1 = multiply($inputs[$index]1, $factor1);17    if ($actual == $expected[$index]) {
  5. $failed ← 1

    pass 1 of 3
    18    $passed = $passed + 1;19} else {20    $failed→ 1 = $failed + 1;21}
    All 3 passes — pass 1 is the card above
    pass$failed
    10 1
    21 2
    32 3
  6. $actual ← 2

    15foreach my $index (0 .. 2) {16    my $actual→ 2 = multiply($inputs[$index]2, $factor1);17    if ($actual == $expected[$index]) {
  7. $actual ← 3

    15foreach my $index (0 .. 2) {16    my $actual→ 3 = multiply($inputs[$index]3, $factor1);17    if ($actual == $expected[$index]) {
  8. print "factor=$factor ";

    24print "factor=$factor1\n";25print "passed=$passed0\n";26print "failed=$failed3\n";
    outputfactor=1
    passed=0
    failed=3
  1. $factor ← 3, @inputs ← 3, @expected ← 3, $passed ← 0, $failed ← 0

    9my $factor→ 3 = 3;10my @inputs→ 3 = (1, 2, 3);11my @expected→ 3 = (2, 4, 6);12my $passed→ 0 = 0;13my $failed→ 0 = 0;
  2. foreach my $index (0 .. 2)

    pass 1 of 3
    15foreach my $index0 (0 .. 2) {16    my $actual = multiply($inputs[$index]1, $factor3);17    if ($actual == $expected[$index]) {
    All 3 passes — pass 1 is the card above
    pass$index$inputs[$index]
    101
    212
    323
  3. $value ← 1, $factor ← 3

    pass 1 of 3
    4sub multiply {5    my ($value→ 1, $factor→ 3) = @_;6    return $value1 * $factor3;7}
    All 3 passes — pass 1 is the card above
    pass$value$factor
    113
    223
    333
  4. $actual ← 3

    15foreach my $index (0 .. 2) {16    my $actual→ 3 = multiply($inputs[$index]1, $factor3);17    if ($actual == $expected[$index]) {
  5. $failed ← 1

    pass 1 of 3
    18    $passed = $passed + 1;19} else {20    $failed→ 1 = $failed + 1;21}
    All 3 passes — pass 1 is the card above
    pass$failed
    10 1
    21 2
    32 3
  6. $actual ← 6

    15foreach my $index (0 .. 2) {16    my $actual→ 6 = multiply($inputs[$index]2, $factor3);17    if ($actual == $expected[$index]) {
  7. $actual ← 9

    15foreach my $index (0 .. 2) {16    my $actual→ 9 = multiply($inputs[$index]3, $factor3);17    if ($actual == $expected[$index]) {
  8. print "factor=$factor ";

    24print "factor=$factor3\n";25print "passed=$passed0\n";26print "failed=$failed3\n";
    outputfactor=3
    passed=0
    failed=3