Change the API of generate_role to a hash so we can specify more
[gitmo/MooseX-Role-Parameterized.git] / t / 006-requires.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4 use Test::More tests => 5;
5 use Test::Exception;
6
7 do {
8     package MyRole::Requires;
9     use MooseX::Role::Parameterized;
10
11     parameter requires => (
12         is  => 'rw',
13         isa => 'Str',
14     );
15
16     role {
17         my $p = shift;
18         requires $p->requires;
19     };
20 };
21
22 sub requires_names {
23     map {
24         MyRole::Requires->meta->generate_role(
25             parameters => {
26                 requires => $_,
27             },
28         )->name
29     } @_
30 }
31
32 throws_ok {
33     Moose::Meta::Class->create_anon_class(
34         roles => [ requires_names('alpha') ],
35     );
36 } qr/'Moose::Meta::Role::__ANON__::SERIAL::\d+' requires the method 'alpha' to be implemented by 'Class::MOP::Class::__ANON__::SERIAL::\d+'/;
37
38 lives_ok {
39     Moose::Meta::Class->create_anon_class(
40         methods => {
41             alpha => sub {},
42         },
43         roles => [ requires_names('alpha') ],
44     );
45 };
46
47 throws_ok {
48     Moose::Meta::Class->create_anon_class(
49         methods => {
50             alpha => sub {},
51         },
52         roles => [ requires_names('alpha', 'beta') ],
53     );
54 } qr/'Moose::Meta::Role::__ANON__::SERIAL::\d+\|Moose::Meta::Role::__ANON__::SERIAL::\d+' requires the method 'beta' to be implemented by 'Class::MOP::Class::__ANON__::SERIAL::\d+'/;
55
56 throws_ok {
57     Moose::Meta::Class->create_anon_class(
58         methods => {
59             beta => sub {},
60         },
61         roles => [ requires_names('alpha', 'beta') ],
62     );
63 } qr/'Moose::Meta::Role::__ANON__::SERIAL::\d+\|Moose::Meta::Role::__ANON__::SERIAL::\d+' requires the method 'alpha' to be implemented by 'Class::MOP::Class::__ANON__::SERIAL::\d+'/;
64
65 lives_ok {
66     Moose::Meta::Class->create_anon_class(
67         methods => {
68             alpha => sub {},
69             beta => sub {},
70         },
71         roles => [ requires_names('alpha', 'beta') ],
72     );
73 };
74