Changes for 0.14
[gitmo/MooseX-StrictConstructor.git] / t / basic.t
CommitLineData
32726d88 1use strict;
2use warnings;
3
9b2a8f18 4use Test::Fatal;
40ab99f6 5use Test::Moose qw( with_immutable );
54cc4bad 6use Test::More;
32726d88 7
32726d88 8{
9 package Standard;
10
11 use Moose;
12
13 has 'thing' => ( is => 'rw' );
14}
15
16{
17 package Stricter;
18
3e532dbe 19 use Moose;
32726d88 20 use MooseX::StrictConstructor;
21
22 has 'thing' => ( is => 'rw' );
23}
24
25{
2ffa7b60 26 package Subclass;
27
3e532dbe 28 use Moose;
2ffa7b60 29 use MooseX::StrictConstructor;
30
31 extends 'Stricter';
32
33 has 'size' => ( is => 'rw' );
34}
35
36{
23cfbce9 37 package StrictSubclass;
38
39 use Moose;
40
41 extends 'Stricter';
42
43 has 'size' => ( is => 'rw' );
44}
45
46{
1ac1adaa 47 package OtherStrictSubclass;
48
49 use Moose;
50 use MooseX::StrictConstructor;
51
52 extends 'Standard';
53
54 has 'size' => ( is => 'rw' );
55}
56
57{
32726d88 58 package Tricky;
59
3e532dbe 60 use Moose;
32726d88 61 use MooseX::StrictConstructor;
62
63 has 'thing' => ( is => 'rw' );
64
5a0d4921 65 sub BUILD {
32726d88 66 my $self = shift;
67 my $params = shift;
68
69 delete $params->{spy};
70 }
71}
72
58812bf9 73{
a83dec43 74 package InitArg;
75
3e532dbe 76 use Moose;
a83dec43 77 use MooseX::StrictConstructor;
78
79 has 'thing' => ( is => 'rw', 'init_arg' => 'other' );
80 has 'size' => ( is => 'rw', 'init_arg' => undef );
81}
82
1ac1adaa 83my @classes = qw( Standard Stricter Subclass StrictSubclass OtherStrictSubclass Tricky InitArg );
5a0d4921 84
40ab99f6 85with_immutable {
9b2a8f18 86 is(
87 exception { Standard->new( thing => 1, bad => 99 ) }, undef,
88 'standard Moose class ignores unknown params'
89 );
90
91 like(
92 exception { Stricter->new( thing => 1, bad => 99 ) },
93 qr/unknown attribute.+: bad/,
94 'strict constructor blows up on unknown params'
95 );
96
97 is(
98 exception { Subclass->new( thing => 1, size => 'large' ) }, undef,
99 'subclass constructor handles known attributes correctly'
100 );
101
102 like(
103 exception { Subclass->new( thing => 1, bad => 99 ) },
104 qr/unknown attribute.+: bad/,
105 'subclass correctly recognizes bad attribute'
106 );
107
108 is(
23cfbce9 109 exception { StrictSubclass->new( thing => 1, size => 'large', ) }, undef,
110 'subclass that doesn\'t use strict constructor handles known attributes correctly'
111 );
112
113 like(
114 exception { StrictSubclass->new( thing => 1, bad => 99 ) },
115 qr/unknown attribute.+: bad/,
116 'subclass that doesn\'t use strict correctly recognizes bad attribute'
117 );
118
119 is(
1ac1adaa 120 exception { OtherStrictSubclass->new( thing => 1, size => 'large', ) }, undef,
121 'strict subclass from parent that doesn\'t use strict constructor handles known attributes correctly'
122 );
123
124 like(
125 exception { OtherStrictSubclass->new( thing => 1, bad => 99 ) },
126 qr/unknown attribute.+: bad/,
127 'strict subclass from parent that doesn\'t use strict correctly recognizes bad attribute'
128 );
129
130 is(
9b2a8f18 131 exception { Tricky->new( thing => 1, spy => 99 ) }, undef,
132 'can work around strict constructor by deleting params in BUILD()'
133 );
134
135 like(
136 exception { Tricky->new( thing => 1, agent => 99 ) },
137 qr/unknown attribute.+: agent/,
138 'Tricky still blows up on unknown params other than spy'
139 );
140
141 like(
9b2a8f18 142 exception { InitArg->new( thing => 1 ) },
143 qr/unknown attribute.+: thing/,
144 'InitArg blows up with attribute name'
145 );
146
147 like(
148 exception { InitArg->new( size => 1 ) },
149 qr/unknown attribute.+: size/,
150 'InitArg blows up when given attribute with undef init_arg'
151 );
152
153 is(
154 exception { InitArg->new( other => 1 ) }, undef,
155 'InitArg works when given proper init_arg'
156 );
157}
158@classes;
54cc4bad 159
160done_testing();