Document how to pass new attribute values at instance-role application time
[gitmo/Moose.git] / t / roles / role_exclusion.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7 use Test::Fatal;
8
9 =pod
10
11 The idea and examples for this feature are taken
12 from the Fortress spec.
13
14 http://research.sun.com/projects/plrg/fortress0903.pdf
15
16 trait OrganicMolecule extends Molecule
17     excludes { InorganicMolecule }
18 end
19 trait InorganicMolecule extends Molecule end
20
21 =cut
22
23 {
24     package Molecule;
25     use Moose::Role;
26
27     package Molecule::Organic;
28     use Moose::Role;
29
30     with 'Molecule';
31     excludes 'Molecule::Inorganic';
32
33     package Molecule::Inorganic;
34     use Moose::Role;
35
36     with 'Molecule';
37 }
38
39 ok(Molecule::Organic->meta->excludes_role('Molecule::Inorganic'), '... Molecule::Organic exludes Molecule::Inorganic');
40 is_deeply(
41    [ Molecule::Organic->meta->get_excluded_roles_list() ],
42    [ 'Molecule::Inorganic' ],
43    '... Molecule::Organic exludes Molecule::Inorganic');
44
45 =pod
46
47 Check some basic conflicts when combining
48 the roles into the same class
49
50 =cut
51
52 {
53     package My::Test1;
54     use Moose;
55
56     ::is( ::exception {
57         with 'Molecule::Organic';
58     }, undef, '... adding the role (w/ excluded roles) okay' );
59
60     package My::Test2;
61     use Moose;
62
63     ::like( ::exception {
64         with 'Molecule::Organic', 'Molecule::Inorganic';
65     }, qr/Conflict detected: Role Molecule::Organic excludes role 'Molecule::Inorganic'/, '... adding the role w/ excluded role conflict dies okay' );
66
67     package My::Test3;
68     use Moose;
69
70     ::is( ::exception {
71         with 'Molecule::Organic';
72     }, undef, '... adding the role (w/ excluded roles) okay' );
73
74     ::like( ::exception {
75         with 'Molecule::Inorganic';
76     }, qr/Conflict detected: My::Test3 excludes role 'Molecule::Inorganic'/, '... adding the role w/ excluded role conflict dies okay' );
77 }
78
79 ok(My::Test1->does('Molecule::Organic'), '... My::Test1 does Molecule::Organic');
80 ok(My::Test1->does('Molecule'), '... My::Test1 does Molecule');
81 ok(My::Test1->meta->excludes_role('Molecule::Inorganic'), '... My::Test1 excludes Molecule::Organic');
82
83 ok(!My::Test2->does('Molecule::Organic'), '... ! My::Test2 does Molecule::Organic');
84 ok(!My::Test2->does('Molecule::Inorganic'), '... ! My::Test2 does Molecule::Inorganic');
85
86 ok(My::Test3->does('Molecule::Organic'), '... My::Test3 does Molecule::Organic');
87 ok(My::Test3->does('Molecule'), '... My::Test1 does Molecule');
88 ok(My::Test3->meta->excludes_role('Molecule::Inorganic'), '... My::Test3 excludes Molecule::Organic');
89 ok(!My::Test3->does('Molecule::Inorganic'), '... ! My::Test3 does Molecule::Inorganic');
90
91 =pod
92
93 Check some basic conflicts when combining
94 the roles into the a superclass
95
96 =cut
97
98 {
99     package Methane;
100     use Moose;
101
102     with 'Molecule::Organic';
103
104     package My::Test4;
105     use Moose;
106
107     extends 'Methane';
108
109     ::like( ::exception {
110         with 'Molecule::Inorganic';
111     }, qr/Conflict detected: My::Test4 excludes role \'Molecule::Inorganic\'/, '... cannot add exculded role into class which extends Methane' );
112 }
113
114 ok(Methane->does('Molecule::Organic'), '... Methane does Molecule::Organic');
115 ok(My::Test4->isa('Methane'), '... My::Test4 isa Methane');
116 ok(My::Test4->does('Molecule::Organic'), '... My::Test4 does Molecule::Organic');
117 ok(My::Test4->meta->does_role('Molecule::Organic'), '... My::Test4 meat does_role Molecule::Organic');
118 ok(My::Test4->meta->excludes_role('Molecule::Inorganic'), '... My::Test4 meta excludes Molecule::Organic');
119 ok(!My::Test4->does('Molecule::Inorganic'), '... My::Test4 does Molecule::Inorganic');
120
121 done_testing;