Testing Basics
Pure Functions
A pure function is easier to test because the same input gives the same output.
pure function
A pure function calculates from its arguments without changing outside state.
Pure Functions
pure_functions.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;
sub final_price {
my ($price, $discount) = @_;
return $price - $discount;
}
my $discount = 2;
my $price = 12;
my $actual = final_price($price, $discount);
my $expected = $price - $discount;
my $status = $actual == $expected ? "pass" : "fail";
print "discount=$discount\n";
print "actual=$actual\n";
print "status=$status\n";
use strict;
use warnings;
sub final_price {
my ($price, $discount) = @_;
return $price - $discount;
}
my $discount = 0;
my $price = 12;
my $actual = final_price($price, $discount);
my $expected = $price - $discount;
my $status = $actual == $expected ? "pass" : "fail";
print "discount=$discount\n";
print "actual=$actual\n";
print "status=$status\n";
use strict;
use warnings;
sub final_price {
my ($price, $discount) = @_;
return $price - $discount;
}
my $discount = 5;
my $price = 12;
my $actual = final_price($price, $discount);
my $expected = $price - $discount;
my $status = $actual == $expected ? "pass" : "fail";
print "discount=$discount\n";
print "actual=$actual\n";
print "status=$status\n";
$discount ← 2, $price ← 12
9my $discount→ 2 = 2; #@discount=0, 510my $price→ 12 = 12;11my $actual = final_price($price12, $discount2);12my $expected = $price - $discount;$price ← 12, $discount ← 2
4sub final_price {5 my ($price→ 12, $discount→ 2) = @_;6 return $price12 - $discount2;7}$actual ← 10, $expected ← 10, $status ← pass
10my $price = 12;11my $actual→ 10 = final_price($price12, $discount2);12my $expected→ 10 = $price12 - $discount2;13my $status→ pass = $actual10 == $expected10 ? "pass" : "fail";1415print "discount=$discount2\n";16print "actual=$actual10\n";17print "status=$statuspass\n";outputdiscount=2 actual=10 status=pass
$discount ← 0, $price ← 12
9my $discount→ 0 = 0;10my $price→ 12 = 12;11my $actual = final_price($price12, $discount0);12my $expected = $price - $discount;$price ← 12, $discount ← 0
4sub final_price {5 my ($price→ 12, $discount→ 0) = @_;6 return $price12 - $discount0;7}$actual ← 12, $expected ← 12, $status ← pass
10my $price = 12;11my $actual→ 12 = final_price($price12, $discount0);12my $expected→ 12 = $price12 - $discount0;13my $status→ pass = $actual12 == $expected12 ? "pass" : "fail";1415print "discount=$discount0\n";16print "actual=$actual12\n";17print "status=$statuspass\n";outputdiscount=0 actual=12 status=pass
$discount ← 5, $price ← 12
9my $discount→ 5 = 5;10my $price→ 12 = 12;11my $actual = final_price($price12, $discount5);12my $expected = $price - $discount;$price ← 12, $discount ← 5
4sub final_price {5 my ($price→ 12, $discount→ 5) = @_;6 return $price12 - $discount5;7}$actual ← 7, $expected ← 7, $status ← pass
10my $price = 12;11my $actual→ 7 = final_price($price12, $discount5);12my $expected→ 7 = $price12 - $discount5;13my $status→ pass = $actual7 == $expected7 ? "pass" : "fail";1415print "discount=$discount5\n";16print "actual=$actual7\n";17print "status=$statuspass\n";outputdiscount=5 actual=7 status=pass