Commit | Line | Data |
4a582a37 |
1 | #!/usr/bin/env perl |
2 | |
3 | use lib 'lib', 't/role-basic/lib'; |
4 | use MyTests; |
5 | |
6 | # multiple roles with the same role |
7 | { |
8 | package RoleC; |
2c580674 |
9 | use Role::Tiny; |
4a582a37 |
10 | sub baz { 'baz' } |
11 | |
12 | package RoleB; |
2c580674 |
13 | use Role::Tiny; |
4a582a37 |
14 | with 'RoleC'; |
15 | sub bar { 'bar' } |
16 | |
17 | package RoleA; |
2c580674 |
18 | use Role::Tiny; |
4a582a37 |
19 | with 'RoleC'; |
20 | sub foo { 'foo' } |
21 | |
22 | package Foo; |
23 | use strict; |
24 | use warnings; |
2c580674 |
25 | use Role::Tiny 'with'; |
4a582a37 |
26 | ::is( ::exception { |
27 | with 'RoleA', 'RoleB'; |
28 | }, undef, 'Composing multiple roles which use the same role should not have conflicts' ); |
29 | sub new { bless {} => shift } |
30 | |
31 | my $object = Foo->new; |
32 | foreach my $method (qw/foo bar baz/) { |
33 | ::can_ok $object, $method; |
34 | ::is $object->$method, $method, |
35 | '... and all methods should be composed in correctly'; |
36 | } |
37 | } |
38 | |
39 | { |
40 | no warnings 'redefine'; |
41 | local *UNIVERSAL::can = sub { 1 }; |
42 | eval <<' END'; |
43 | package Can::Can; |
2c580674 |
44 | use Role::Tiny 'with'; |
4a582a37 |
45 | with 'A::NonExistent::Role'; |
46 | END |
47 | my $error = $@ || ''; |
48 | like $error, qr{^Can't locate A/NonExistent/Role.pm}, |
49 | 'If ->can always returns true, we should still not think we loaded the role' |
50 | or diag "Error found: $error"; |
51 | } |
52 | |
558f9dc9 |
53 | { |
54 | package Role1; |
55 | use Role::Tiny; |
56 | |
57 | package Role2; |
58 | use Role::Tiny; |
59 | |
60 | package Frew; |
61 | use strict; |
62 | use warnings; |
63 | sub new { bless {} => shift } |
64 | |
65 | my $object = Frew->new; |
66 | |
67 | ::ok(!Role::Tiny::does_role($object, 'Role1'), 'no Role1 yet'); |
68 | ::ok(!Role::Tiny::does_role($object, 'Role2'), 'no Role2 yet'); |
69 | |
70 | Role::Tiny->apply_roles_to_object($object, 'Role1'); |
71 | ::ok(Role::Tiny::does_role($object, "Role1"), 'Role1 consumed'); |
72 | ::ok(!Role::Tiny::does_role($object, 'Role2'), 'no Role2 yet'); |
73 | Role::Tiny->apply_roles_to_object($object, 'Role2'); |
74 | ::ok(Role::Tiny::does_role($object, "Role1"), 'Role1 consumed'); |
75 | ::ok(Role::Tiny::does_role($object, 'Role2'), 'Role2 consumed'); |
76 | } |
4a582a37 |
77 | done_testing; |