5 use Test::Moose qw( with_immutable );
13 has 'thing' => ( is => 'rw' );
20 use MooseX::StrictConstructor;
22 has 'thing' => ( is => 'rw' );
29 use MooseX::StrictConstructor;
33 has 'size' => ( is => 'rw' );
37 package StrictSubclass;
43 has 'size' => ( is => 'rw' );
50 use MooseX::StrictConstructor;
52 has 'thing' => ( is => 'rw' );
58 delete $params->{spy};
66 use MooseX::StrictConstructor;
68 has 'thing' => ( is => 'rw', 'init_arg' => 'other' );
69 has 'size' => ( is => 'rw', 'init_arg' => undef );
72 my @classes = qw( Standard Stricter Subclass StrictSubclass Tricky InitArg );
76 exception { Standard->new( thing => 1, bad => 99 ) }, undef,
77 'standard Moose class ignores unknown params'
81 exception { Stricter->new( thing => 1, bad => 99 ) },
82 qr/unknown attribute.+: bad/,
83 'strict constructor blows up on unknown params'
87 exception { Subclass->new( thing => 1, size => 'large' ) }, undef,
88 'subclass constructor handles known attributes correctly'
92 exception { Subclass->new( thing => 1, bad => 99 ) },
93 qr/unknown attribute.+: bad/,
94 'subclass correctly recognizes bad attribute'
98 exception { StrictSubclass->new( thing => 1, size => 'large', ) }, undef,
99 'subclass that doesn\'t use strict constructor handles known attributes correctly'
103 exception { StrictSubclass->new( thing => 1, bad => 99 ) },
104 qr/unknown attribute.+: bad/,
105 'subclass that doesn\'t use strict correctly recognizes bad attribute'
109 exception { Tricky->new( thing => 1, spy => 99 ) }, undef,
110 'can work around strict constructor by deleting params in BUILD()'
114 exception { Tricky->new( thing => 1, agent => 99 ) },
115 qr/unknown attribute.+: agent/,
116 'Tricky still blows up on unknown params other than spy'
120 exception { InitArg->new( thing => 1 ) },
121 qr/unknown attribute.+: thing/,
122 'InitArg blows up with attribute name'
126 exception { InitArg->new( size => 1 ) },
127 qr/unknown attribute.+: size/,
128 'InitArg blows up when given attribute with undef init_arg'
132 exception { InitArg->new( other => 1 ) }, undef,
133 'InitArg works when given proper init_arg'