package Test::Unit::tests::SuiteTest;
use strict;
use base qw(Test::Unit::TestCase);
use Test::Unit::TestResult;
use Test::Unit::TestSuite;
use Test::Unit::tests::TornDown;
use Test::Unit::tests::WasRun;
require Test::Unit::Assertion::CodeRef;
my %method_hash = (runs => 'run_count',
failures => 'failure_count',
success => 'was_successful',
errors => 'error_count',);
sub new {
my $self = shift()->SUPER::new(@_);
$self->{_my_result} = undef;
$self->{__default_assertion} =
Test::Unit::Assertion::CodeRef->new(sub {
my $arg_hash = shift;
for (qw/runs failures errors/) {
next unless exists $arg_hash->{$_};
my $method = $method_hash{$_};
my $expected = $arg_hash->{$_};
my $got = $self->result->$method();
$expected == $got or
die "Expected $expected $_, got $got\n";
}
if (exists $arg_hash->{'success'}) {
my $method = $method_hash{'success'};
my $expected = $arg_hash->{'success'};
my $got = $self->result->$method();
$expected && $got || !$expected && !$got or
die "Expected ", $expected ? 'success,' : 'failure,',
' got ', $got ? 'success.' : 'failure.', "\n";
}
1;
});
return $self;
}
sub basic_assertion {
my $self = shift;
$self->{__default_assertion}->do_assertion(ref($_[0]) ? shift : {@_});
}
sub result {
my $self = shift;
return $self->{_my_result};
}
sub set_up {
my $self = shift;
$self->{_my_result} = Test::Unit::TestResult->new();
}
sub suite {
my $class = shift;
my $suite = Test::Unit::TestSuite->empty_new("Suite Tests");
$suite->add_test(Test::Unit::tests::SuiteTest->new("test_no_test_case_class"));
$suite->add_test(Test::Unit::tests::SuiteTest->new("test_no_test_cases"));
$suite->add_test(Test::Unit::tests::SuiteTest->new("test_one_test_case"));
$suite->add_test(Test::Unit::tests::SuiteTest->new("test_not_existing_test_case"));
$suite->add_test(Test::Unit::tests::SuiteTest->new("test_inherited_tests"));
$suite->add_test(Test::Unit::tests::SuiteTest->new("test_inherited_inherited_tests"));
$suite->add_test(Test::Unit::tests::SuiteTest->new("test_shadowed_tests"));
$suite->add_test(Test::Unit::tests::SuiteTest->new("test_complex_inheritance"));
return $suite;
}
# test subs
sub test_inherited_tests {
my $self = shift;
my $suite = Test::Unit::TestSuite->new("Test::Unit::tests::InheritedTestCase");
$suite->run($self->result());
$self->basic_assertion({success => 1, runs => 2});
$self->assert($self->result()->was_successful());
$self->assert(2 == $self->result->run_count);
}
sub test_complex_inheritance {
my $self = shift;
eval q{
package Test::Unit::tests::_SuperClass;
use base qw(Test::Unit::TestCase);
sub test_case {
my $self = shift;
$self->assert($self->override_this_method );
}
sub override_this_method { 0 ; }
package Test::Unit::tests::_SubClass;
use base qw(Test::Unit::tests::_SuperClass);
sub override_this_method { 1 ; }
};
die $@ if $@;
my $suite = Test::Unit::TestSuite->new("Test::Unit::tests::_SubClass");
my $result = $self->result;
$suite->run($result);
$self->assert($result->was_successful());
$self->assert(1 == $self->result->run_count);
}
sub test_inherited_inherited_tests {
my $self = shift;
my $suite = Test::Unit::TestSuite->new("Test::Unit::tests::InheritedInheritedTestCase");
$suite->run($self->result());
$self->basic_assertion(success => 1, runs => 3);
$self->assert($self->result()->was_successful());
$self->assert(3 == $self->result()->run_count());
}
sub test_no_test_case_class {
my $self = shift;
my $t = Test::Unit::TestSuite->new("Test::Unit::tests::NoTestCaseClass");
$t->run($self->result());
$self->basic_assertion(success => 0, runs => 1);
$self->assert(1 == $self->result()->run_count()); # warning test
$self->assert(not $self->result()->was_successful());
}
sub test_no_test_cases {
my $self = shift;
my $t = Test::Unit::TestSuite->new("Test::Unit::tests::NoTestCases");
$t->run($self->result());
$self->basic_assertion(runs => 1, failures => 1, success => 0);
$self->assert(1 == $self->result()->run_count()); # warning test
$self->assert(1 == $self->result()->failure_count());
$self->assert(not $self->result()->was_successful());
}
sub test_not_existing_test_case {
my $self = shift;
my $t = Test::Unit::tests::SuiteTest->new("not_existing_method");
$t->run($self->result());
$self->basic_assertion(runs => 1, failures => 1, errors => 0);
$self->assert(1 == $self->result()->run_count());
$self->assert(1 == $self->result()->failure_count());
$self->assert(0 == $self->result()->error_count());
}
sub test_one_test_case {
my $self = shift;
my $t = Test::Unit::TestSuite->new("Test::Unit::tests::OneTestCase");
$t->run($self->result());
$self->basic_assertion(runs => 1, failures => 0, errors => 0, success => 1);
$self->assert(1 == $self->result()->run_count());
$self->assert(0 == $self->result()->failure_count());
$self->assert(0 == $self->result()->error_count());
$self->assert($self->result()->was_successful());
}
sub test_shadowed_tests {
my $self = shift;
my $t = Test::Unit::TestSuite->new("Test::Unit::tests::OverrideTestCase");
$t->run($self->result());
$self->basic_assertion(runs => 1);
$self->assert(1 == $self->result()->run_count());
}
1;