Object-LocalVars
view release on metacpan or search on metacpan
t/Common.pm view on Meta::CPAN
package t::Common;
use strict;
use warnings;
use Exporter ();
our @ISA = 'Exporter';
our @EXPORT = qw(
test_constructor TC
test_accessors TA
test_methods TM
test_new TN
);
use Test::More;
use Test::Exception;
sub load_fail_msg { return "because $_[0] isn't loaded" }
sub method_fail_msg { return "because $_[0] can't $_[1]" }
sub TC { return 1 + TN() }
sub test_constructor {
my ($class, @args) = @_;
my $pass = require_ok( $class );
my $o;
SKIP: {
skip load_fail_msg($class), TC() - 1 unless $pass;
$o = test_new($class,@args);
}
return $o;
}
sub TN { return 2 }
sub test_new {
my ($class, @args) = @_;
my $o;
ok( $o = $class->new(@args), "... creating a $class object");
ok( $o->isa($class), "... confirming object is a $class" );
return $o;
}
sub TA { return TN() + 7 }
sub test_accessors {
my ($o, $prop, $prefix) = @_;
my $class = ref($o);
$prefix ||= { get => q{}, set => 'set_' };
my $acc = $prefix->{get} . $prop;
my $mut = $prefix->{set} . $prop;
my $pass = ok( $o->can($acc), "... found accessor function '$acc'" );
$pass = ok( $o->can($mut), "... found mutator function '$mut'" ) && $pass;
SKIP: {
skip load_fail_msg($class), TA() - 2 unless $pass;
my $p = test_new($class);
my $value1 = "foo";
my $value2 = "bar";
if ( $acc ne $mut ) {
is( $o->$mut($value1), $o,
"... $mut(\$value1) returns self for object 1" );
is( $o->$acc, $value1,
"... $acc() equals \$value1 for object 1" );
is( $p->$mut($value2), $p,
"... $mut(\$value2) returns self for object 2" );
is( $p->$acc, $value2,
"... $acc() equals \$value2 for object 2" );
is( $o->$acc, $value1,
"... $acc() still equals \$value1 for object1" );
}
else {
is( $o->$mut($value1), $value1,
"... $mut(\$value1) returns \$value1 for object 1" );
is( $o->$acc, $value1,
"... $acc() equals \$value1 for object 1" );
is( $p->$mut($value2), $value2,
"... $mut(\$value2) returns \$value2 for object 2" );
is( $p->$acc, $value2,
"... $acc() equals \$value2 for object 2" );
is( $o->$acc, $value1,
"... $acc() still equals \$value1 for object1" );
}
}
return $pass;
}
( run in 1.997 second using v1.01-cache-2.11-cpan-39bf76dae61 )