From: Dave Rolsky Date: Sat, 25 Sep 2010 18:26:16 +0000 (-0500) Subject: More tests for Counter trait X-Git-Tag: 1.15~103 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=baf3ece53f84fe47fa8bb1e5872598cc773a9e98;p=gitmo%2FMoose.git More tests for Counter trait --- diff --git a/t/070_native_traits/001_trait_counter.t b/t/070_native_traits/001_trait_counter.t index cce98d2..0fa2c9a 100644 --- a/t/070_native_traits/001_trait_counter.t +++ b/t/070_native_traits/001_trait_counter.t @@ -3,6 +3,7 @@ use strict; use warnings; +use Moose (); use Test::Exception; use Test::More; use Test::Moose; @@ -18,72 +19,105 @@ my %handles = ( ); { + my $name = 'Foo1'; + + sub build_class { + my %attr = @_; + + my $class = Moose::Meta::Class->create( + $name++, + superclasses => ['Moose::Object'], + ); + + $class->add_attribute( + counter => ( + traits => ['Counter'], + is => 'ro', + isa => 'Int', + default => 0, + handles => \%handles, + clearer => '_clear_counter', + %attr, + ), + ); + + return ( $class->name, \%handles ); + } +} - package Foo; - use Moose; - - has 'counter' => ( - traits => ['Counter'], - is => 'ro', - isa => 'Int', - default => 0, - handles => \%handles, - ); +{ + run_tests(build_class); + run_tests(build_class(lazy => 1)); } -can_ok( 'Foo', $_ ) for sort keys %handles; +sub run_tests { + my ( $class, $handles ) = @_; + + can_ok( $class, $_ ) for sort keys %{$handles}; + with_immutable { + my $obj = $class->new(); + + is( $obj->counter, 0, '... got the default value' ); + + $obj->inc_counter; + is( $obj->counter, 1, '... got the incremented value' ); + + $obj->inc_counter; + is( $obj->counter, 2, '... got the incremented value (again)' ); -with_immutable { - my $foo = Foo->new(); + throws_ok { $obj->inc_counter( 1, 2 ) } + qr/Cannot call inc with more than 1 argument/, + 'inc throws an error when two arguments are passed'; - is( $foo->counter, 0, '... got the default value' ); + $obj->dec_counter; + is( $obj->counter, 1, '... got the decremented value' ); - $foo->inc_counter; - is( $foo->counter, 1, '... got the incremented value' ); + throws_ok { $obj->dec_counter( 1, 2 ) } + qr/Cannot call dec with more than 1 argument/, + 'dec throws an error when two arguments are passed'; - $foo->inc_counter; - is( $foo->counter, 2, '... got the incremented value (again)' ); + $obj->reset_counter; + is( $obj->counter, 0, '... got the original value' ); - throws_ok { $foo->inc_counter( 1, 2 ) } - qr/Cannot call inc with more than 1 argument/, - 'inc throws an error when two arguments are passed'; + throws_ok { $obj->reset_counter(2) } + qr/Cannot call reset with any arguments/, + 'reset throws an error when an argument is passed'; - $foo->dec_counter; - is( $foo->counter, 1, '... got the decremented value' ); + $obj->set_counter(5); + is( $obj->counter, 5, '... set the value' ); - throws_ok { $foo->dec_counter( 1, 2 ) } - qr/Cannot call dec with more than 1 argument/, - 'dec throws an error when two arguments are passed'; + throws_ok { $obj->set_counter( 1, 2 ) } + qr/Cannot call set with more than 1 argument/, + 'set throws an error when two arguments are passed'; - $foo->reset_counter; - is( $foo->counter, 0, '... got the original value' ); + $obj->inc_counter(2); + is( $obj->counter, 7, '... increment by arg' ); - throws_ok { $foo->reset_counter(2) } - qr/Cannot call reset with any arguments/, - 'reset throws an error when an argument is passed'; + $obj->dec_counter(5); + is( $obj->counter, 2, '... decrement by arg' ); - $foo->set_counter(5); - is( $foo->counter, 5, '... set the value' ); + $obj->inc_counter_2; + is( $obj->counter, 4, '... curried increment' ); - throws_ok { $foo->set_counter( 1, 2 ) } - qr/Cannot call set with more than 1 argument/, - 'set throws an error when two arguments are passed'; + $obj->dec_counter_2; + is( $obj->counter, 2, '... curried deccrement' ); - $foo->inc_counter(2); - is( $foo->counter, 7, '... increment by arg' ); + $obj->set_counter_42; + is( $obj->counter, 42, '... curried set' ); - $foo->dec_counter(5); - is( $foo->counter, 2, '... decrement by arg' ); + if ( $class->meta->get_attribute('counter')->is_lazy ) { + my $obj = $class->new; - $foo->inc_counter_2; - is( $foo->counter, 4, '... curried increment' ); + $obj->inc_counter; + is( $obj->counter, 1, 'inc increments - with lazy default' ); - $foo->dec_counter_2; - is( $foo->counter, 2, '... curried deccrement' ); + $obj->_clear_counter; - $foo->set_counter_42; - is( $foo->counter, 42, '... curried set' ); + $obj->dec_counter; + is( $obj->counter, -1, 'dec decrements - with lazy default' ); + } + } + $class; } -'Foo'; done_testing;