Make sure this length parameter is r/o
[gitmo/MooseX-Role-Parameterized.git] / t / 001-parameters.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4 use Test::More tests => 13;
5 use Test::Exception;
6
7 use MooseX::Role::Parameterized::Parameters;
8
9 my $p = MooseX::Role::Parameterized::Parameters->new;
10 can_ok($p => 'meta');
11
12 do {
13     package MyRole::NoParameters;
14     use MooseX::Role::Parameterized;
15 };
16
17 my $parameter_metaclass = MyRole::NoParameters->meta->parameter_metaclass;
18 is($parameter_metaclass->get_all_attributes, 0, "no parameters");
19
20 do {
21     package MyRole::LengthParameter;
22     use MooseX::Role::Parameterized;
23
24     parameter length => (
25         is       => 'ro',
26         isa      => 'Int',
27         required => 1,
28     );
29 };
30
31 $parameter_metaclass = MyRole::LengthParameter->meta->parameter_metaclass;
32 is($parameter_metaclass->get_all_attributes, 1, "exactly one parameter");
33
34 my $parameter = ($parameter_metaclass->get_all_attributes)[0];
35 is($parameter->name, 'length', "parameter name");
36 ok($parameter->is_required, "parameter is required");
37
38 throws_ok {
39     MyRole::LengthParameter->meta->construct_parameters;
40 } qr/^Attribute \(length\) is required/;
41
42 $p = MyRole::LengthParameter->meta->construct_parameters(
43     length => 5,
44 );
45
46 is($p->length, 5, "correct length");
47
48 throws_ok {
49     $p->length(10);
50 } qr/^Cannot assign a value to a read-only accessor/;
51
52 do {
53     package MyRole::LengthParameter;
54     use MooseX::Role::Parameterized;
55
56     parameter ['first_name', 'last_name'] => (
57         is  => 'rw',
58         isa => 'Str',
59     );
60 };
61
62 $parameter_metaclass = MyRole::LengthParameter->meta->parameter_metaclass;
63 is($parameter_metaclass->get_all_attributes, 3, "three parameters");
64
65 for my $param_name ('first_name', 'last_name') {
66     my $param = $parameter_metaclass->get_attribute($param_name);
67     is($param->type_constraint, 'Str', "$param_name type constraint");
68     ok(!$param->is_required, "$param_name is optional");
69 }
70