2. use Test::Spec;
describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
3. describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Standing on the shoulders of giants.
Test::Builder,Test::More, ...
4. describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Behavior-Driven Development
5. sub fooadd : Tests {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
is( $calculator->add('//;n1,1'), 2);
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
}
vs Test::Class
6. sub add : Tests {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
}
sub custom_delimiters : Tests {
is( $calculator->add('//;n1,1'), 2);
}
sub holidays : Tests {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
}
vs Test::Class
7. sub add_supports_simple_calculations_on_regular_day : Tests {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
}
sub add_supports_custom_delimiters_on_regular_day : Tests {
is( $calculator->add('//;n1,1'), 2);
}
sub add_throws_exception_on_holidays : Tests {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
}
vs Test::Class
8. sub add_returns_zero_for_empty_input_on_regular_day : Tests {
is( $calculator->add(''), 0);
}
sub add_returns_given_number_for_single_number_input_on_regular_day : Tests {
is( $calculator->add('1'), 1);
}
sub add_returns_sum_of_comma_delimited_numbers_on_regular_day : Tests {
is( $calculator->add('1,1'), 2);
}
sub add_throws_exception_for_any_given_input_on_holidays : Tests {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
}
vs Test::Class
9. describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Behavior-Driven Development
11. describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Easy mocks/stubs
12. describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => () );
};
describe "on regular day" => sub {
before each => sub { Calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { Calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Easy mocks/stubs
13. describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Multiple before/after blocks
14. describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
xdescribe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
xit "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Shortcuts