X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F003_basic_hash.t;h=5f66998180dee7286d9d185e399055212fd81125;hb=3dd561ff2fe24585d80d1f9c88db2a42f0191897;hp=7f784dfbde4ceb55044c7f3e7562d76acc8c7ed3;hpb=d26633fcee47dfa1bc7349c67f7a586febf50f7a;p=gitmo%2FMooseX-AttributeHelpers.git diff --git a/t/003_basic_hash.t b/t/003_basic_hash.t index 7f784df..5f66998 100644 --- a/t/003_basic_hash.t +++ b/t/003_basic_hash.t @@ -3,24 +3,38 @@ use strict; use warnings; -use Test::More no_plan => 1; +use Test::More tests => 48; +use Test::Exception; BEGIN { - use_ok('MooseX::AttributeHelpers'); + use_ok('MooseX::AttributeHelpers'); } { package Stuff; use Moose; + use MooseX::AttributeHelpers; has 'options' => ( metaclass => 'Collection::Hash', is => 'ro', - isa => 'HashRef', + isa => 'HashRef[Str]', default => sub { {} }, provides => { - 'set' => 'set_option', - 'get' => 'get_option', + 'set' => 'set_option', + 'get' => 'get_option', + 'empty' => 'has_options', + 'count' => 'num_options', + 'clear' => 'clear_options', + 'delete' => 'delete_option', + 'exists' => 'has_option', + 'defined' => 'is_defined', + 'accessor' => 'option_accessor', + }, + curries => { + 'accessor' => { + quantity => ['quantity'], + }, } ); } @@ -28,15 +42,125 @@ BEGIN { my $stuff = Stuff->new(); isa_ok($stuff, 'Stuff'); +can_ok($stuff, $_) for qw[ + set_option + get_option + has_options + num_options + delete_option + clear_options + is_defined + has_option + quantity + option_accessor +]; + +ok(!$stuff->has_options, '... we have no options'); +is($stuff->num_options, 0, '... we have no options'); + is_deeply($stuff->options, {}, '... no options yet'); +ok(!$stuff->has_option('foo'), '... we have no foo option'); + +lives_ok { + $stuff->set_option(foo => 'bar'); +} '... set the option okay'; + +ok($stuff->is_defined('foo'), '... foo is defined'); -$stuff->set_option(foo => 'bar'); +ok($stuff->has_options, '... we have options'); +is($stuff->num_options, 1, '... we have 1 option(s)'); +ok($stuff->has_option('foo'), '... we have a foo option'); is_deeply($stuff->options, { foo => 'bar' }, '... got options now'); -$stuff->set_option(bar => 'baz'); +lives_ok { + $stuff->set_option(bar => 'baz'); +} '... set the option okay'; + +is($stuff->num_options, 2, '... we have 2 option(s)'); is_deeply($stuff->options, { foo => 'bar', bar => 'baz' }, '... got more options now'); is($stuff->get_option('foo'), 'bar', '... got the right option'); +is_deeply([ $stuff->get_option(qw(foo bar)) ], [qw(bar baz)], "get multiple options at once"); + +lives_ok { + $stuff->set_option(oink => "blah", xxy => "flop"); +} '... set the option okay'; + +is($stuff->num_options, 4, "4 options"); +is_deeply([ $stuff->get_option(qw(foo bar oink xxy)) ], [qw(bar baz blah flop)], "get multiple options at once"); + +lives_ok { + $stuff->delete_option('bar'); +} '... deleted the option okay'; + +lives_ok { + $stuff->delete_option('oink'); +} '... deleted the option okay'; + +lives_ok { + $stuff->delete_option('xxy'); +} '... deleted the option okay'; + +is($stuff->num_options, 1, '... we have 1 option(s)'); +is_deeply($stuff->options, { foo => 'bar' }, '... got more options now'); + +$stuff->clear_options; + +is_deeply($stuff->options, { }, "... cleared options" ); + +lives_ok { + $stuff->quantity(4); +} '... options added okay with defaults'; + +is($stuff->quantity, 4, 'reader part of curried accessor works'); + +is_deeply($stuff->options, {quantity => 4}, '... returns what we expect'); + +lives_ok { + Stuff->new(options => { foo => 'BAR' }); +} '... good constructor params'; + +## check some errors + +dies_ok { + $stuff->set_option(bar => {}); +} '... could not add a hash ref where an string is expected'; + +dies_ok { + Stuff->new(options => { foo => [] }); +} '... bad constructor params'; + +dies_ok { + my $stuff = Stuff->new; + $stuff->option_accessor(); +} '... accessor dies on 0 args'; + +dies_ok { + my $stuff = Stuff->new; + $stuff->option_accessor(1 => 2, 3); +} '... accessor dies on 3 args'; + +dies_ok { + my $stuff = Stuff->new; + $stuff->option_accessor(1 => 2, 3 => 4); +} '... accessor dies on 4 args'; + +## test the meta + +my $options = $stuff->meta->get_attribute('options'); +isa_ok($options, 'MooseX::AttributeHelpers::Collection::Hash'); +is_deeply($options->provides, { + 'set' => 'set_option', + 'get' => 'get_option', + 'empty' => 'has_options', + 'count' => 'num_options', + 'clear' => 'clear_options', + 'delete' => 'delete_option', + 'defined' => 'is_defined', + 'exists' => 'has_option', + 'accessor' => 'option_accessor', +}, '... got the right provides mapping'); +is($options->type_constraint->type_parameter, 'Str', '... got the right container type');