added tests for composite role application
[gitmo/MooseX-Role-Parameterized.git] / t / 150-composite-role-application.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4
5 use Test::More tests => 9;
6
7 do {
8     package MyCompositeRoleA;
9     use MooseX::Role::Parameterized;
10
11     parameter attribute => (
12         isa => 'Str',
13         required => 1,
14     );
15
16     role {
17         my $p = shift;
18
19         has $p->attribute => (
20             is => 'Int',
21         );
22     };
23 };
24
25 do {
26     package MyCompositeRoleB;
27     use MooseX::Role::Parameterized;
28
29     parameter accessor => (
30         isa => 'Str',
31         required => 1,
32     );
33
34     role {
35         my $p = shift;
36
37         has $p->accessor => (
38             is => 'rw',
39             isa => 'Int',
40         );
41     };
42 };
43
44 do {
45     package MyDoubleConsumer;
46     use Moose;
47     with MyCompositeRoleA => { attribute => 'foo' },
48          MyCompositeRoleB => { accessor  => 'bar' };
49 };
50
51 local $@;
52 eval {
53     ok(MyDoubleConsumer->can('foo'), 'first role in composite applied successfully');
54     ok(MyDoubleConsumer->can('bar'), 'second role in composite applied successfully');
55 }; 
56 ok !$@, 'testing composite roles lived';
57
58 do {
59     package MyExtendingRole;
60     use MooseX::Role::Parameterized;
61
62     parameter foo => (
63         isa => 'Int',
64     );
65
66     role {
67         my $p = shift;
68
69         with 'MyCompositeRoleA', { attribute => 'bar' };
70
71         has foo => (
72             is => 'rw',
73             default => sub { $p->foo },
74         );
75     };
76 };
77
78 do {
79     package MyExtendedConsumer;
80     use Moose;
81     with MyCompositeRoleA => { attribute => 'bar' },
82          MyExtendingRole  => { foo => 23 };
83 };
84
85 local $@;
86 eval {
87     ok(MyExtendedConsumer->can('bar'), 'role composed through other role applied successfully');
88     is(MyExtendedConsumer->new->foo, 23, 'role composing other role applied successfully');
89 };
90 ok !$@, 'testing role through application through other role lived';
91
92 do {
93     package MyRoleProxy;
94     use MooseX::Role::Parameterized;
95
96     parameter rolename   => (isa => "Str");
97     parameter roleparams => (isa => "HashRef");
98
99     role {
100         my $p = shift;
101
102         with $p->rolename, $p->roleparams;
103     };
104 };
105
106 do {
107     package MyProxyConsumer;
108     use Moose;
109     with(
110         MyRoleProxy => { 
111             rolename   => 'MyCompositeRoleA',
112             roleparams => { attribute => 'baz' },
113         },
114         MyCompositeRoleB => {
115             accessor => 'qux',
116         },
117     );
118 };
119
120 local $@;
121 eval {
122     ok(MyProxyConsumer->can('baz'), 'proxied role got applied successfully');
123     ok(MyProxyConsumer->can('qux'), 'other role besides proxied one got applied successfully');
124 };
125 ok !$@, 'testing proxied roles lived';
126