1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#!/usr/bin/perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More;
sub throws_ok (&;$) {
my ( $code, $pat, $msg ) = @_;
eval { $code->(); };
like ( $EVAL_ERROR, $pat, $msg );
}
{
package Metatest;
use Lmo;
has stuff => ( is => 'rw', required => 1 );
has init_stuff1 => ( is => 'rw', init_arg => undef );
has init_stuff2 => ( is => 'rw', init_arg => 'fancy_name' );
}
{
package Metatest::child;
use Lmo;
extends 'Metatest';
has more_stuff => ( is => 'rw' );
}
my $obj = Metatest->new( stuff => 100 );
can_ok($obj, 'meta');
my $meta = $obj->meta();
is_deeply(
[ sort $meta->attributes ],
[ sort qw(stuff init_stuff1 init_stuff2) ],
"->attributes works"
);
is_deeply(
[ sort $meta->attributes_for_new ],
[ sort qw(stuff fancy_name) ],
"->attributes_for_new works"
);
# Do these BEFORE initializing ::extends
my $meta2 = Metatest::child->meta();
is_deeply(
[ sort $meta2->attributes ],
[ sort qw(stuff init_stuff1 init_stuff2 more_stuff) ],
"->attributes works on a child class"
);
is_deeply(
[ sort $meta2->attributes_for_new ],
[ sort qw(stuff fancy_name more_stuff) ],
"->attributes_for_new works in a child class"
);
my $meta3 = Metatest::child->new(stuff => 10)->meta();
is_deeply(
[ sort $meta3->attributes ],
[ sort qw(stuff init_stuff1 init_stuff2 more_stuff) ],
"->attributes works on an initialized child class"
);
is_deeply(
[ sort $meta3->attributes_for_new ],
[ sort qw(stuff fancy_name more_stuff) ],
"->attributes_for_new works in an initialized child class"
);
throws_ok { Metatest::child->new() } qr/\QAttribute (stuff) is required for Metatest::child/;
done_testing;
|