b3ee22f0764e1d302186a3fc73b69c402946862b
[gitmo/Moo.git] / t / role-tiny.t
1 use strictures 1;
2 use Test::More;
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 {
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 {
45   package NoMethods;
46
47   package OneMethod;
48
49   sub req1 { }
50 }
51
52 sub try_apply_to {
53   my $to = shift;
54   exception { Role::Tiny->apply_role_to_package('MyRole', $to) }
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');
61 ok(MyClass->does('MyRole'), 'class does role');
62 ok(!MyClass->does('Random'), 'class does not do non-role');
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');
66
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
77 done_testing;
78