Mouse::Role improved
[gitmo/Mouse.git] / t / 030_roles / failing / 021_role_composite_exclusion.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 12;
7 use Test::Exception;
8
9 use Mouse::Meta::Role::Application::RoleSummation;
10 use Mouse::Meta::Role::Composite;
11
12 {
13     package Role::Foo;
14     use Mouse::Role;
15
16     package Role::Bar;
17     use Mouse::Role;
18
19     package Role::ExcludesFoo;
20     use Mouse::Role;
21     excludes 'Role::Foo';
22
23     package Role::DoesExcludesFoo;
24     use Mouse::Role;
25     with 'Role::ExcludesFoo';
26
27     package Role::DoesFoo;
28     use Mouse::Role;
29     with 'Role::Foo';
30 }
31
32 ok(Role::ExcludesFoo->meta->excludes_role('Role::Foo'), '... got the right exclusions');
33 ok(Role::DoesExcludesFoo->meta->excludes_role('Role::Foo'), '... got the right exclusions');
34
35 # test simple exclusion
36 dies_ok {
37     Mouse::Meta::Role::Application::RoleSummation->new->apply(
38         Mouse::Meta::Role::Composite->new(
39             roles => [
40                 Role::Foo->meta,
41                 Role::ExcludesFoo->meta,
42             ]
43         )
44     );
45 } '... this fails as expected';
46
47 # test no conflicts
48 {
49     my $c = Mouse::Meta::Role::Composite->new(
50         roles => [
51             Role::Foo->meta,
52             Role::Bar->meta,
53         ]
54     );
55     isa_ok($c, 'Mouse::Meta::Role::Composite');
56
57     is($c->name, 'Role::Foo|Role::Bar', '... got the composite role name');
58
59     lives_ok {
60         Mouse::Meta::Role::Application::RoleSummation->new->apply($c);
61     } '... this lives as expected';
62 }
63
64 # test no conflicts w/exclusion
65 {
66     my $c = Mouse::Meta::Role::Composite->new(
67         roles => [
68             Role::Bar->meta,
69             Role::ExcludesFoo->meta,
70         ]
71     );
72     isa_ok($c, 'Mouse::Meta::Role::Composite');
73
74     is($c->name, 'Role::Bar|Role::ExcludesFoo', '... got the composite role name');
75
76     lives_ok {
77         Mouse::Meta::Role::Application::RoleSummation->new->apply($c);
78     } '... this lives as expected';
79
80     is_deeply([$c->get_excluded_roles_list], ['Role::Foo'], '... has excluded roles');
81 }
82
83
84 # test conflict with an "inherited" exclusion
85 dies_ok {
86     Mouse::Meta::Role::Application::RoleSummation->new->apply(
87         Mouse::Meta::Role::Composite->new(
88             roles => [
89                 Role::Foo->meta,
90                 Role::DoesExcludesFoo->meta,
91             ]
92         )
93     );
94
95 } '... this fails as expected';
96
97 # test conflict with an "inherited" exclusion of an "inherited" role
98 dies_ok {
99     Mouse::Meta::Role::Application::RoleSummation->new->apply(
100         Mouse::Meta::Role::Composite->new(
101             roles => [
102                 Role::DoesFoo->meta,
103                 Role::DoesExcludesFoo->meta,
104             ]
105         )
106     );
107 } '... this fails as expected';
108
109