Default parameters to read-only
[gitmo/MooseX-Role-Parameterized.git] / t / 001-parameters.t
CommitLineData
665e848b 1#!/usr/bin/env perl
2use strict;
3use warnings;
d4408bfd 4use Test::More tests => 14;
69d1f098 5use Test::Exception;
6
665e848b 7use MooseX::Role::Parameterized::Parameters;
8
9my $p = MooseX::Role::Parameterized::Parameters->new;
10can_ok($p => 'meta');
11
69d1f098 12do {
13 package MyRole::NoParameters;
14 use MooseX::Role::Parameterized;
15};
16
f8f36548 17my $parameters_metaclass = MyRole::NoParameters->meta->parameters_metaclass;
18is($parameters_metaclass->get_all_attributes, 0, "no parameters");
31fb288b 19
20do {
21 package MyRole::LengthParameter;
22 use MooseX::Role::Parameterized;
23
24 parameter length => (
31fb288b 25 isa => 'Int',
26 required => 1,
27 );
28};
29
f8f36548 30$parameters_metaclass = MyRole::LengthParameter->meta->parameters_metaclass;
31is($parameters_metaclass->get_all_attributes, 1, "exactly one parameter");
31fb288b 32
f8f36548 33my $parameter = ($parameters_metaclass->get_all_attributes)[0];
d4408bfd 34isa_ok($parameter, 'MooseX::Role::Parameterized::Meta::Parameter');
31fb288b 35is($parameter->name, 'length', "parameter name");
36ok($parameter->is_required, "parameter is required");
69d1f098 37
f74750fb 38throws_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
46is($p->length, 5, "correct length");
095cfb3d 47
c627ed85 48throws_ok {
49 $p->length(10);
50} qr/^Cannot assign a value to a read-only accessor/;
51
095cfb3d 52do {
53 package MyRole::LengthParameter;
54 use MooseX::Role::Parameterized;
55
bd3dd853 56 parameter ['first_name', 'last_name'] => (
095cfb3d 57 is => 'rw',
58 isa => 'Str',
59 );
60};
61
f8f36548 62$parameters_metaclass = MyRole::LengthParameter->meta->parameters_metaclass;
63is($parameters_metaclass->get_all_attributes, 3, "three parameters");
095cfb3d 64
bd3dd853 65for my $param_name ('first_name', 'last_name') {
f8f36548 66 my $param = $parameters_metaclass->get_attribute($param_name);
bd3dd853 67 is($param->type_constraint, 'Str', "$param_name type constraint");
68 ok(!$param->is_required, "$param_name is optional");
69}
095cfb3d 70