9bc9ba081edf31b740c200fcaf141a21913340cb
[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(requires => $_)->name
25     } @_
26 }
27
28 throws_ok {
29     Moose::Meta::Class->create_anon_class(
30         roles => [ requires_names('alpha') ],
31     );
32 } qr/'Moose::Meta::Role::__ANON__::SERIAL::\d+' requires the method 'alpha' to be implemented by 'Class::MOP::Class::__ANON__::SERIAL::\d+'/;
33
34 lives_ok {
35     Moose::Meta::Class->create_anon_class(
36         methods => {
37             alpha => sub {},
38         },
39         roles => [ requires_names('alpha') ],
40     );
41 };
42
43 throws_ok {
44     Moose::Meta::Class->create_anon_class(
45         methods => {
46             alpha => sub {},
47         },
48         roles => [ requires_names('alpha', 'beta') ],
49     );
50 } 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+'/;
51
52 throws_ok {
53     Moose::Meta::Class->create_anon_class(
54         methods => {
55             beta => sub {},
56         },
57         roles => [ requires_names('alpha', 'beta') ],
58     );
59 } 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+'/;
60
61 lives_ok {
62     Moose::Meta::Class->create_anon_class(
63         methods => {
64             alpha => sub {},
65             beta => sub {},
66         },
67         roles => [ requires_names('alpha', 'beta') ],
68     );
69 };
70