6aa72bb14034baf1d75bc8340aeb40f358e35c2a
[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 => 24;
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 =pod
57
58 Check some basic conflicts when combining  
59 the roles into the same class
60
61 =cut
62
63 {
64     package My::Test1;
65     use strict;
66     use warnings;
67     use Moose;
68     
69     ::lives_ok {
70         with 'Molecule::Organic';
71     } '... adding the role (w/ excluded roles) okay';
72
73     package My::Test2;
74     use strict;
75     use warnings;
76     use Moose;
77     
78     ::throws_ok {
79         with 'Molecule::Organic', 'Molecule::Inorganic';
80     } qr/Conflict detected: Class::MOP::Class::__ANON__::SERIAL::1 excludes role \'Molecule::Inorganic\'/, 
81     '... adding the role w/ excluded role conflict dies okay';    
82     
83     package My::Test3;
84     use strict;
85     use warnings;
86     use Moose;
87     
88     ::lives_ok {
89         with 'Molecule::Organic';
90     } '... adding the role (w/ excluded roles) okay';   
91     
92     ::throws_ok {
93         with 'Molecule::Inorganic';
94     } qr/Conflict detected: My::Test3 excludes role 'Molecule::Inorganic'/, 
95     '... adding the role w/ excluded role conflict dies okay'; 
96 }
97
98 ok(My::Test1->does('Molecule::Organic'), '... My::Test1 does Molecule::Organic');
99 ok(My::Test1->does('Molecule'), '... My::Test1 does Molecule');
100 ok(My::Test1->meta->excludes_role('Molecule::Inorganic'), '... My::Test1 excludes Molecule::Organic');
101
102 ok(!My::Test2->does('Molecule::Organic'), '... ! My::Test2 does Molecule::Organic');
103 ok(!My::Test2->does('Molecule::Inorganic'), '... ! My::Test2 does Molecule::Inorganic');
104
105 ok(My::Test3->does('Molecule::Organic'), '... My::Test3 does Molecule::Organic');
106 ok(My::Test3->does('Molecule'), '... My::Test1 does Molecule');
107 ok(My::Test3->meta->excludes_role('Molecule::Inorganic'), '... My::Test3 excludes Molecule::Organic');
108 ok(!My::Test3->does('Molecule::Inorganic'), '... ! My::Test3 does Molecule::Inorganic');
109
110 =pod
111
112 Check some basic conflicts when combining  
113 the roles into the a superclass
114
115 =cut
116
117 {
118     package Methane;
119     use strict;
120     use warnings;
121     use Moose;
122     
123     with 'Molecule::Organic';
124     
125     package My::Test4;
126     use strict;
127     use warnings;
128     use Moose;
129     
130     extends 'Methane';    
131     
132     ::throws_ok {
133         with 'Molecule::Inorganic';    
134     } qr/Conflict detected: My::Test4 excludes role \'Molecule::Inorganic\'/,
135     '... cannot add exculded role into class which extends Methane';
136 }
137
138 ok(Methane->does('Molecule::Organic'), '... Methane does Molecule::Organic');
139 ok(My::Test4->isa('Methane'), '... My::Test4 isa Methane');
140 ok(My::Test4->does('Molecule::Organic'), '... My::Test4 does Molecule::Organic');
141 ok(My::Test4->meta->does_role('Molecule::Organic'), '... My::Test4 meat does_role Molecule::Organic');
142 ok(My::Test4->meta->excludes_role('Molecule::Inorganic'), '... My::Test4 meta excludes Molecule::Organic');
143 ok(!My::Test4->does('Molecule::Inorganic'), '... My::Test4 does Molecule::Inorganic');
144