role-exclusion
[gitmo/Moose.git] / t / 045_role_exclusion.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 15;
7 use Test::Exception;
8
9 BEGIN {
10     use_ok('Moose');
11     use_ok('Moose::Role');    
12 }
13
14 =pod
15
16 The idea and examples for this feature are taken
17 from the Fortress spec.
18
19 http://research.sun.com/projects/plrg/fortress0903.pdf
20
21 trait OrganicMolecule extends Molecule 
22     excludes { InorganicMolecule } 
23 end 
24 trait InorganicMolecule extends Molecule end 
25
26 =cut
27
28 {
29     package Molecule;
30     use strict;
31     use warnings;
32     use Moose::Role;
33
34     package Molecule::Organic;
35     use strict;
36     use warnings;
37     use Moose::Role;
38     
39     with 'Molecule';
40     excludes 'Molecule::Inorganic';
41     
42     package Molecule::Inorganic;
43     use strict;
44     use warnings;
45     use Moose::Role;     
46     
47     with 'Molecule';       
48 }
49
50 ok(Molecule::Organic->meta->excludes_role('Molecule::Inorganic'), '... Molecule::Organic exludes Molecule::Inorganic');
51 is_deeply(
52    [ Molecule::Organic->meta->get_excluded_roles_list() ], 
53    [ 'Molecule::Inorganic' ],
54    '... Molecule::Organic exludes Molecule::Inorganic');
55
56 {
57     package My::Test1;
58     use strict;
59     use warnings;
60     use Moose;
61     
62     ::lives_ok {
63         with 'Molecule::Organic';
64     } '... adding the role (w/ excluded roles) okay';
65
66     package My::Test2;
67     use strict;
68     use warnings;
69     use Moose;
70     
71     ::throws_ok {
72         with 'Molecule::Organic', 'Molecule::Inorganic';
73     } qr/Conflict detected: Class::MOP::Class::__ANON__::SERIAL::1 excludes role \'Molecule::Inorganic\'/, 
74     '... adding the role w/ excluded role conflict dies okay';    
75     
76     package My::Test3;
77     use strict;
78     use warnings;
79     use Moose;
80     
81     ::lives_ok {
82         with 'Molecule::Organic';
83     } '... adding the role (w/ excluded roles) okay';   
84     
85     ::throws_ok {
86         with 'Molecule::Inorganic';
87     } qr/Conflict detected: My::Test3 excludes role 'Molecule::Inorganic'/, 
88     '... adding the role w/ excluded role conflict dies okay'; 
89 }
90
91 ok(My::Test1->does('Molecule::Organic'), '... My::Test1 does Molecule::Organic');
92 ok(My::Test1->meta->excludes_role('Molecule::Inorganic'), '... My::Test1 excludes Molecule::Organic');
93 ok(!My::Test2->does('Molecule::Organic'), '... ! My::Test2 does Molecule::Organic');
94 ok(!My::Test2->does('Molecule::Inorganic'), '... ! My::Test2 does Molecule::Inorganic');
95 ok(My::Test3->does('Molecule::Organic'), '... My::Test3 does Molecule::Organic');
96 ok(My::Test3->meta->excludes_role('Molecule::Inorganic'), '... My::Test3 excludes Molecule::Organic');
97 ok(!My::Test3->does('Molecule::Inorganic'), '... ! My::Test3 does Molecule::Inorganic');
98
99
100
101
102
103
104
105
106