571880f0a4972d953e5647667c80387813393141
[gitmo/Role-Tiny.git] / t / role-basic-bugs.t
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;
9     use Role::Tiny;
10     sub baz { 'baz' }
11
12     package RoleB;
13     use Role::Tiny;
14     with 'RoleC';
15     sub bar { 'bar' }
16
17     package RoleA;
18     use Role::Tiny;
19     with 'RoleC';
20     sub foo { 'foo' }
21
22     package Foo;
23     use strict;
24     use warnings;
25     use Role::Tiny 'with';
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;
44     use Role::Tiny 'with';
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
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 }
77 done_testing;