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