Commit | Line | Data |
5ef4ffe7 |
1 | use strict; |
2 | use warnings FATAL => 'all'; |
5f7ac979 |
3 | use Test::More; |
ab3370e7 |
4 | use Test::Fatal; |
5 | |
6 | BEGIN { |
7 | package MyRole; |
8 | |
9 | use Role::Tiny; |
10 | |
11 | requires qw(req1 req2); |
12 | |
ab3370e7 |
13 | sub bar { 'role bar' } |
14 | |
15 | sub baz { 'role baz' } |
16 | } |
17 | |
18 | BEGIN { |
19 | package MyClass; |
20 | |
2f57f81a |
21 | use constant SIMPLE => 'simple'; |
22 | use constant REF_CONST => [ 'ref_const' ]; |
7b8177f8 |
23 | use constant VSTRING_CONST => v1; |
2f57f81a |
24 | |
ab3370e7 |
25 | sub req1 { } |
26 | sub req2 { } |
27 | sub foo { 'class foo' } |
28 | sub baz { 'class baz' } |
29 | |
30 | } |
31 | |
32 | BEGIN { |
0c145208 |
33 | package ExtraClass; |
34 | sub req1 { } |
35 | sub req2 { } |
36 | sub req3 { } |
37 | sub foo { } |
38 | sub baz { 'class baz' } |
39 | } |
40 | |
41 | BEGIN { |
42 | package IntermediaryRole; |
43 | use Role::Tiny; |
44 | requires 'req3'; |
45 | } |
46 | |
47 | BEGIN { |
ab3370e7 |
48 | package NoMethods; |
49 | |
50 | package OneMethod; |
51 | |
52 | sub req1 { } |
53 | } |
54 | |
a8cc1122 |
55 | BEGIN { |
56 | package ExtraRole; |
57 | use Role::Tiny; |
58 | |
59 | sub extra1 { 'role extra' } |
60 | } |
61 | |
ab3370e7 |
62 | sub try_apply_to { |
63 | my $to = shift; |
369a4c50 |
64 | exception { Role::Tiny->apply_role_to_package($to, 'MyRole') } |
ab3370e7 |
65 | } |
66 | |
67 | is(try_apply_to('MyClass'), undef, 'role applies cleanly'); |
ab3370e7 |
68 | is(MyClass->bar, 'role bar', 'method from role'); |
69 | is(MyClass->baz, 'class baz', 'method from class'); |
5a247406 |
70 | ok(MyClass->does('MyRole'), 'class does role'); |
a8cc1122 |
71 | ok(!MyClass->does('IntermediaryRole'), 'class does not do non-applied role'); |
5a247406 |
72 | ok(!MyClass->does('Random'), 'class does not do non-role'); |
ab3370e7 |
73 | |
74 | like(try_apply_to('NoMethods'), qr/req1, req2/, 'error for both methods'); |
75 | like(try_apply_to('OneMethod'), qr/req2/, 'error for one method'); |
5f7ac979 |
76 | |
0c145208 |
77 | is exception { |
c4fd8838 |
78 | Role::Tiny->apply_role_to_package('IntermediaryRole', 'MyRole'); |
79 | Role::Tiny->apply_role_to_package('ExtraClass', 'IntermediaryRole'); |
0c145208 |
80 | }, undef, 'No errors applying roles'; |
81 | |
82 | ok(ExtraClass->does('MyRole'), 'ExtraClass does MyRole'); |
83 | ok(ExtraClass->does('IntermediaryRole'), 'ExtraClass does IntermediaryRole'); |
84 | is(ExtraClass->bar, 'role bar', 'method from role'); |
85 | is(ExtraClass->baz, 'class baz', 'method from class'); |
86 | |
a8cc1122 |
87 | my $new_class; |
88 | is exception { |
89 | $new_class = Role::Tiny->create_class_with_roles('MyClass', 'ExtraRole'); |
90 | }, undef, 'No errors creating class with roles'; |
91 | |
92 | isa_ok($new_class, 'MyClass'); |
93 | is($new_class->extra1, 'role extra', 'method from role'); |
94 | |
fe2e95b1 |
95 | ok(Role::Tiny->is_role('MyRole'), 'is_role true for roles'); |
96 | ok(!Role::Tiny->is_role('MyClass'), 'is_role false for classes'); |
97 | |
98 | |
5f7ac979 |
99 | done_testing; |
0c145208 |
100 | |