add is_role method
[gitmo/Role-Tiny.git] / t / role-tiny.t
CommitLineData
5ef4ffe7 1use strict;
2use warnings FATAL => 'all';
5f7ac979 3use Test::More;
ab3370e7 4use Test::Fatal;
5
6BEGIN {
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
18BEGIN {
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
32BEGIN {
0c145208 33 package ExtraClass;
34 sub req1 { }
35 sub req2 { }
36 sub req3 { }
37 sub foo { }
38 sub baz { 'class baz' }
39}
40
41BEGIN {
42 package IntermediaryRole;
43 use Role::Tiny;
44 requires 'req3';
45}
46
47BEGIN {
ab3370e7 48 package NoMethods;
49
50 package OneMethod;
51
52 sub req1 { }
53}
54
a8cc1122 55BEGIN {
56 package ExtraRole;
57 use Role::Tiny;
58
59 sub extra1 { 'role extra' }
60}
61
ab3370e7 62sub try_apply_to {
63 my $to = shift;
369a4c50 64 exception { Role::Tiny->apply_role_to_package($to, 'MyRole') }
ab3370e7 65}
66
67is(try_apply_to('MyClass'), undef, 'role applies cleanly');
ab3370e7 68is(MyClass->bar, 'role bar', 'method from role');
69is(MyClass->baz, 'class baz', 'method from class');
5a247406 70ok(MyClass->does('MyRole'), 'class does role');
a8cc1122 71ok(!MyClass->does('IntermediaryRole'), 'class does not do non-applied role');
5a247406 72ok(!MyClass->does('Random'), 'class does not do non-role');
ab3370e7 73
74like(try_apply_to('NoMethods'), qr/req1, req2/, 'error for both methods');
75like(try_apply_to('OneMethod'), qr/req2/, 'error for one method');
5f7ac979 76
0c145208 77is 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
82ok(ExtraClass->does('MyRole'), 'ExtraClass does MyRole');
83ok(ExtraClass->does('IntermediaryRole'), 'ExtraClass does IntermediaryRole');
84is(ExtraClass->bar, 'role bar', 'method from role');
85is(ExtraClass->baz, 'class baz', 'method from class');
86
a8cc1122 87my $new_class;
88is exception {
89 $new_class = Role::Tiny->create_class_with_roles('MyClass', 'ExtraRole');
90}, undef, 'No errors creating class with roles';
91
92isa_ok($new_class, 'MyClass');
93is($new_class->extra1, 'role extra', 'method from role');
94
fe2e95b1 95ok(Role::Tiny->is_role('MyRole'), 'is_role true for roles');
96ok(!Role::Tiny->is_role('MyClass'), 'is_role false for classes');
97
98
5f7ac979 99done_testing;
0c145208 100