Commit | Line | Data |
ab3370e7 |
1 | use strictures 1; |
5f7ac979 |
2 | use Test::More; |
ab3370e7 |
3 | use Test::Fatal; |
4 | |
5 | BEGIN { |
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 | |
19 | BEGIN { |
20 | package MyClass; |
21 | |
22 | sub req1 { } |
23 | sub req2 { } |
24 | sub foo { 'class foo' } |
25 | sub baz { 'class baz' } |
26 | |
27 | } |
28 | |
29 | BEGIN { |
0c145208 |
30 | package ExtraClass; |
31 | sub req1 { } |
32 | sub req2 { } |
33 | sub req3 { } |
34 | sub foo { } |
35 | sub baz { 'class baz' } |
36 | } |
37 | |
38 | BEGIN { |
39 | package IntermediaryRole; |
40 | use Role::Tiny; |
41 | requires 'req3'; |
42 | } |
43 | |
44 | BEGIN { |
ab3370e7 |
45 | package NoMethods; |
46 | |
47 | package OneMethod; |
48 | |
49 | sub req1 { } |
50 | } |
51 | |
52 | sub try_apply_to { |
53 | my $to = shift; |
369a4c50 |
54 | exception { Role::Tiny->apply_role_to_package($to, 'MyRole') } |
ab3370e7 |
55 | } |
56 | |
57 | is(try_apply_to('MyClass'), undef, 'role applies cleanly'); |
58 | is(MyClass->foo, 'role foo class foo', 'method modifier'); |
59 | is(MyClass->bar, 'role bar', 'method from role'); |
60 | is(MyClass->baz, 'class baz', 'method from class'); |
5a247406 |
61 | ok(MyClass->does('MyRole'), 'class does role'); |
62 | ok(!MyClass->does('Random'), 'class does not do non-role'); |
ab3370e7 |
63 | |
64 | like(try_apply_to('NoMethods'), qr/req1, req2/, 'error for both methods'); |
65 | like(try_apply_to('OneMethod'), qr/req2/, 'error for one method'); |
5f7ac979 |
66 | |
0c145208 |
67 | is exception { |
68 | Role::Tiny->apply_role_to_package('MyRole', 'IntermediaryRole'); |
69 | Role::Tiny->apply_role_to_package('IntermediaryRole', 'ExtraClass'); |
70 | }, undef, 'No errors applying roles'; |
71 | |
72 | ok(ExtraClass->does('MyRole'), 'ExtraClass does MyRole'); |
73 | ok(ExtraClass->does('IntermediaryRole'), 'ExtraClass does IntermediaryRole'); |
74 | is(ExtraClass->bar, 'role bar', 'method from role'); |
75 | is(ExtraClass->baz, 'class baz', 'method from class'); |
76 | |
5f7ac979 |
77 | done_testing; |
0c145208 |
78 | |