Add test for immutable class
[gitmo/MooseX-StrictConstructor.git] / t / basic.t
CommitLineData
32726d88 1use strict;
2use warnings;
3
58812bf9 4use Test::More tests => 7;
32726d88 5
6
7{
8 package Standard;
9
10 use Moose;
11
12 has 'thing' => ( is => 'rw' );
13}
14
15{
16 package Stricter;
17
18 use MooseX::StrictConstructor;
19
20 has 'thing' => ( is => 'rw' );
21}
22
23{
2ffa7b60 24 package Subclass;
25
26 use MooseX::StrictConstructor;
27
28 extends 'Stricter';
29
30 has 'size' => ( is => 'rw' );
31}
32
33{
32726d88 34 package Tricky;
35
36 use MooseX::StrictConstructor;
37
38 has 'thing' => ( is => 'rw' );
39
40 sub BUILD
41 {
42 my $self = shift;
43 my $params = shift;
44
45 delete $params->{spy};
46 }
47}
48
58812bf9 49{
50 package Immutable;
51
52 use MooseX::StrictConstructor;
53
54 has 'thing' => ( is => 'rw' );
55
56 no Moose;
57 __PACKAGE__->meta()->make_immutable();
58}
59
32726d88 60
61eval { Standard->new( thing => 1, bad => 99 ) };
62is( $@, '', 'standard Moose class ignores unknown params' );
63
64eval { Stricter->new( thing => 1, bad => 99 ) };
65like( $@, qr/unknown attribute.+: bad/, 'strict constructor blows up on unknown params' );
66
67eval { Tricky->new( thing => 1, spy => 99 ) };
68is( $@, '', 'can work around strict constructor by deleting params in BUILD()' );
69
70eval { Tricky->new( thing => 1, agent => 99 ) };
71like( $@, qr/unknown attribute.+: agent/, 'Tricky still blows up on unknown params other than spy' );
2ffa7b60 72
73eval { Subclass->new( thing => 1, bad => 99 ) };
74like( $@, qr/unknown attribute.+: bad/, 'subclass constructor blows up on unknown params' );
75
76eval { Subclass->new( thing => 1, size => 'large' ) };
77is( $@, '', 'subclass constructor handles known attributes correctly' );
58812bf9 78
79eval { Immutable->new( thing => 1, bad => 99 ) };
80like( $@, qr/unknown attribute.+: bad/,
81 'strict constructor in immutable class blows up on unknown params' );