also update Role::Tiny to handle VSTRING and credit doy for pointing it out
[gitmo/Role-Tiny.git] / t / role-tiny.t
CommitLineData
ab3370e7 1use strictures 1;
5f7ac979 2use Test::More;
ab3370e7 3use Test::Fatal;
4
5BEGIN {
6 package MyRole;
7
8 use Role::Tiny;
9
10 requires qw(req1 req2);
11
12 around foo => sub { my $orig = shift; join ' ', 'role foo', $orig->(@_) };
13
14 sub bar { 'role bar' }
15
16 sub baz { 'role baz' }
17}
18
19BEGIN {
20 package MyClass;
21
2f57f81a 22 use constant SIMPLE => 'simple';
23 use constant REF_CONST => [ 'ref_const' ];
7b8177f8 24 use constant VSTRING_CONST => v1;
2f57f81a 25
ab3370e7 26 sub req1 { }
27 sub req2 { }
28 sub foo { 'class foo' }
29 sub baz { 'class baz' }
30
31}
32
33BEGIN {
0c145208 34 package ExtraClass;
35 sub req1 { }
36 sub req2 { }
37 sub req3 { }
38 sub foo { }
39 sub baz { 'class baz' }
40}
41
42BEGIN {
43 package IntermediaryRole;
44 use Role::Tiny;
45 requires 'req3';
46}
47
48BEGIN {
ab3370e7 49 package NoMethods;
50
51 package OneMethod;
52
53 sub req1 { }
54}
55
56sub try_apply_to {
57 my $to = shift;
369a4c50 58 exception { Role::Tiny->apply_role_to_package($to, 'MyRole') }
ab3370e7 59}
60
61is(try_apply_to('MyClass'), undef, 'role applies cleanly');
62is(MyClass->foo, 'role foo class foo', 'method modifier');
63is(MyClass->bar, 'role bar', 'method from role');
64is(MyClass->baz, 'class baz', 'method from class');
5a247406 65ok(MyClass->does('MyRole'), 'class does role');
66ok(!MyClass->does('Random'), 'class does not do non-role');
ab3370e7 67
68like(try_apply_to('NoMethods'), qr/req1, req2/, 'error for both methods');
69like(try_apply_to('OneMethod'), qr/req2/, 'error for one method');
5f7ac979 70
0c145208 71is exception {
c4fd8838 72 Role::Tiny->apply_role_to_package('IntermediaryRole', 'MyRole');
73 Role::Tiny->apply_role_to_package('ExtraClass', 'IntermediaryRole');
0c145208 74}, undef, 'No errors applying roles';
75
76ok(ExtraClass->does('MyRole'), 'ExtraClass does MyRole');
77ok(ExtraClass->does('IntermediaryRole'), 'ExtraClass does IntermediaryRole');
78is(ExtraClass->bar, 'role bar', 'method from role');
79is(ExtraClass->baz, 'class baz', 'method from class');
80
5f7ac979 81done_testing;
0c145208 82