X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fbasic.t;h=81f0f6b6aec193017fd6da81657a70f18b93e3c9;hb=d78f8e746b0fc4ab8e44dfa9ea7dcc8f28cce880;hp=d91d3c93d279d68760b81ce4c65be240a5b8b7b0;hpb=32726d885ed56a2628ec0eccf18b2e898d1ca8ca;p=gitmo%2FMooseX-StrictConstructor.git diff --git a/t/basic.t b/t/basic.t index d91d3c9..81f0f6b 100644 --- a/t/basic.t +++ b/t/basic.t @@ -1,8 +1,9 @@ use strict; use warnings; -use Test::More tests => 4; - +use Test::Exception; +use Test::Moose qw( with_immutable ); +use Test::More; { package Standard; @@ -15,20 +16,32 @@ use Test::More tests => 4; { package Stricter; + use Moose; use MooseX::StrictConstructor; has 'thing' => ( is => 'rw' ); } { + package Subclass; + + use Moose; + use MooseX::StrictConstructor; + + extends 'Stricter'; + + has 'size' => ( is => 'rw' ); +} + +{ package Tricky; + use Moose; use MooseX::StrictConstructor; has 'thing' => ( is => 'rw' ); - sub BUILD - { + sub BUILD { my $self = shift; my $params = shift; @@ -36,15 +49,54 @@ use Test::More tests => 4; } } +{ + package InitArg; + + use Moose; + use MooseX::StrictConstructor; + + has 'thing' => ( is => 'rw', 'init_arg' => 'other' ); + has 'size' => ( is => 'rw', 'init_arg' => undef ); +} + +my @classes = qw( Standard Stricter Subclass Tricky InitArg ); + +with_immutable { + lives_ok { Standard->new( thing => 1, bad => 99 ) } + 'standard Moose class ignores unknown params'; + + throws_ok { Stricter->new( thing => 1, bad => 99 ) } + qr/unknown attribute.+: bad/, + 'strict constructor blows up on unknown params'; + + lives_ok { Subclass->new( thing => 1, size => 'large' ) } + 'subclass constructor handles known attributes correctly'; + + throws_ok { Subclass->new( thing => 1, bad => 99 ) } + qr/unknown attribute.+: bad/, + 'subclass correctly recognizes bad attribute'; + + lives_ok { Tricky->new( thing => 1, spy => 99 ) } + 'can work around strict constructor by deleting params in BUILD()'; + + throws_ok { Tricky->new( thing => 1, agent => 99 ) } + qr/unknown attribute.+: agent/, + 'Tricky still blows up on unknown params other than spy'; + + throws_ok { Subclass->new( thing => 1, bad => 99 ) } + qr/unknown attribute.+: bad/, + 'subclass constructor blows up on unknown params'; -eval { Standard->new( thing => 1, bad => 99 ) }; -is( $@, '', 'standard Moose class ignores unknown params' ); + throws_ok { InitArg->new( thing => 1 ) } + qr/unknown attribute.+: thing/, + 'InitArg blows up with attribute name'; -eval { Stricter->new( thing => 1, bad => 99 ) }; -like( $@, qr/unknown attribute.+: bad/, 'strict constructor blows up on unknown params' ); + throws_ok { InitArg->new( size => 1 ) } + qr/unknown attribute.+: size/, + 'InitArg blows up when given attribute with undef init_arg'; -eval { Tricky->new( thing => 1, spy => 99 ) }; -is( $@, '', 'can work around strict constructor by deleting params in BUILD()' ); + lives_ok { InitArg->new( other => 1 ) } + 'InitArg works when given proper init_arg'; +} @classes; -eval { Tricky->new( thing => 1, agent => 99 ) }; -like( $@, qr/unknown attribute.+: agent/, 'Tricky still blows up on unknown params other than spy' ); +done_testing();