|
Packit |
73b376 |
use strict;
|
|
Packit |
73b376 |
use warnings;
|
|
Packit |
73b376 |
use Test::More;
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
BEGIN {
|
|
Packit |
73b376 |
package MyRole;
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
use Role::Tiny;
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
requires qw(req1 req2);
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub bar { 'role bar' }
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub baz { 'role baz' }
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
BEGIN {
|
|
Packit |
73b376 |
package MyClass;
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
use constant SIMPLE => 'simple';
|
|
Packit |
73b376 |
use constant REF_CONST => [ 'ref_const' ];
|
|
Packit |
73b376 |
use constant VSTRING_CONST => v1;
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub req1 { }
|
|
Packit |
73b376 |
sub req2 { }
|
|
Packit |
73b376 |
sub foo { 'class foo' }
|
|
Packit |
73b376 |
sub baz { 'class baz' }
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
BEGIN {
|
|
Packit |
73b376 |
package ExtraClass;
|
|
Packit |
73b376 |
sub req1 { }
|
|
Packit |
73b376 |
sub req2 { }
|
|
Packit |
73b376 |
sub req3 { }
|
|
Packit |
73b376 |
sub foo { }
|
|
Packit |
73b376 |
sub baz { 'class baz' }
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
BEGIN {
|
|
Packit |
73b376 |
package IntermediaryRole;
|
|
Packit |
73b376 |
use Role::Tiny;
|
|
Packit |
73b376 |
requires 'req3';
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
BEGIN {
|
|
Packit |
73b376 |
package NoMethods;
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
package OneMethod;
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub req1 { }
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
BEGIN {
|
|
Packit |
73b376 |
package ExtraRole;
|
|
Packit |
73b376 |
use Role::Tiny;
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub extra1 { 'role extra' }
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub try_apply_to {
|
|
Packit |
73b376 |
my $to = shift;
|
|
Packit |
73b376 |
eval { Role::Tiny->apply_role_to_package($to, 'MyRole'); 1 }
|
|
Packit |
73b376 |
and return undef;
|
|
Packit |
73b376 |
return $@ if $@;
|
|
Packit |
73b376 |
die "false exception caught!";
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
is(try_apply_to('MyClass'), undef, 'role applies cleanly');
|
|
Packit |
73b376 |
is(MyClass->bar, 'role bar', 'method from role');
|
|
Packit |
73b376 |
is(MyClass->baz, 'class baz', 'method from class');
|
|
Packit |
73b376 |
ok(MyClass->does('MyRole'), 'class does role');
|
|
Packit |
73b376 |
ok(!MyClass->does('IntermediaryRole'), 'class does not do non-applied role');
|
|
Packit |
73b376 |
ok(!MyClass->does('Random'), 'class does not do non-role');
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
like(try_apply_to('NoMethods'), qr/req1, req2/, 'error for both methods');
|
|
Packit |
73b376 |
like(try_apply_to('OneMethod'), qr/req2/, 'error for one method');
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
eval {
|
|
Packit |
73b376 |
Role::Tiny->apply_role_to_package('IntermediaryRole', 'MyRole');
|
|
Packit |
73b376 |
Role::Tiny->apply_role_to_package('ExtraClass', 'IntermediaryRole');
|
|
Packit |
73b376 |
1;
|
|
Packit |
73b376 |
} or $@ ||= "false exception!";
|
|
Packit |
73b376 |
is $@, '', 'No errors applying roles';
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
ok(ExtraClass->does('MyRole'), 'ExtraClass does MyRole');
|
|
Packit |
73b376 |
ok(ExtraClass->does('IntermediaryRole'), 'ExtraClass does IntermediaryRole');
|
|
Packit |
73b376 |
is(ExtraClass->bar, 'role bar', 'method from role');
|
|
Packit |
73b376 |
is(ExtraClass->baz, 'class baz', 'method from class');
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
my $new_class;
|
|
Packit |
73b376 |
eval {
|
|
Packit |
73b376 |
$new_class = Role::Tiny->create_class_with_roles('MyClass', 'ExtraRole');
|
|
Packit |
73b376 |
} or $@ ||= "false exception!";
|
|
Packit |
73b376 |
is $@, '', 'No errors creating class with roles';
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
isa_ok($new_class, 'MyClass');
|
|
Packit |
73b376 |
is($new_class->extra1, 'role extra', 'method from role');
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
ok(Role::Tiny->is_role('MyRole'), 'is_role true for roles');
|
|
Packit |
73b376 |
ok(!Role::Tiny->is_role('MyClass'), 'is_role false for classes');
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
done_testing;
|