#!perl -w use strict; use warnings; BEGIN { use lib 't/lib'; use Handel::Test tests => 52; use Scalar::Util qw/refaddr/; use_ok('Handel::Iterator::List'); use_ok('Handel::Iterator::Results'); use_ok('Handel::Exception', ':try'); }; ## test for exception when no hashref is given { try { local $ENV{'LANGUAGE'} = 'en'; my $iterator = Handel::Iterator::Results->new; fail('no exception thrown'); } catch Handel::Exception::Argument with { pass('Argument exception caught'); like(shift, qr/not a hash ref/i, 'message contains not a hash ref'); } otherwise { fail('Other exception caught'); }; }; ## test for exception when no data is given { try { local $ENV{'LANGUAGE'} = 'en'; my $iterator = Handel::Iterator::Results->new({}); fail('no exception thrown'); } catch Handel::Exception::Argument with { pass('Argument exception caught'); like(shift, qr/data not supplied/i, 'message contains no data'); } otherwise { fail('Other exception caught'); }; }; ## test for exception when a non blessed data is given { try { local $ENV{'LANGUAGE'} = 'en'; my $iterator = Handel::Iterator::Results->new({ data => {} }); fail('no exception thrown'); } catch Handel::Exception::Argument with { pass('Argument exception caught'); like(shift, qr/not an iterator/i, 'not an iterator in message'); } otherwise { fail('Other exception caught'); }; }; ## test for exception when a blessed, non iterator is given { try { local $ENV{'LANGUAGE'} = 'en'; my $data = bless {}, 'Handel::Exception'; my $iterator = Handel::Iterator::Results->new({ data => $data }); fail('no exception thrown'); } catch Handel::Exception::Argument with { pass('Argument exception caught'); like(shift, qr/not an iterator/i, 'not an iterator in message'); } otherwise { fail('Other exception caught'); }; }; ## test for exception when no result class is given { my $storage = bless {}, 'MyStorage'; my $results = Handel::Iterator::List->new({ data => [], result_class => 'MyResults', storage => $storage }); try { local $ENV{'LANGUAGE'} = 'en'; my $iterator = Handel::Iterator::Results->new({ data => $results }); fail('no exception thrown'); } catch Handel::Exception::Argument with { pass('Argument exception caught'); like(shift, qr/result class not supplied/i, 'no result class in message'); } otherwise { fail('Other exception caught'); }; }; ## and da magic happens here SKIP: { eval 'use Test::MockObject 1.07'; skip 'Test::MockObject 1.07 not installed', 39 if $@; Test::MockObject->fake_module('MyResult' => ( create_instance => sub { my $class = shift; return bless {result => shift, storage => shift}, $class; } )); Test::MockObject->fake_module('MyCart' => ( create_instance => sub { my $class = shift; return bless {result => shift}, $class; } )); my $storage = bless {}, 'MyStorage'; my $results = Handel::Iterator::List->new({ data => [qw/a b c/], result_class => 'MyResult', storage => $storage }); isa_ok($results, 'Handel::Iterator::List'); my $iterator = Handel::Iterator::Results->new({ data => $results, result_class => 'MyCart' }); isa_ok($iterator, 'Handel::Iterator::Results'); is($iterator->count, 3, 'returns count of 3'); is($results->count, $iterator->count, 'counts match'); is("$iterator", 3, 'string overloads to count'); is($iterator + 0, 3, 'num overloads to count'); if ($iterator) { pass('bool overloads to count'); } else { fail('bool overloads to count'); }; ## check all my @all = $iterator->all; is(scalar @all, 3, 'three results in all'); isa_ok($all[0], 'MyCart'); is($all[0]->{'result'}->{'result'}, 'a', 'result was stored'); is(refaddr $all[0]->{'result'}->{'storage'}, refaddr $storage, 'storage was stored'); isa_ok($all[1], 'MyCart'); is($all[1]->{'result'}->{'result'}, 'b', 'result was stored'); is(refaddr $all[1]->{'result'}->{'storage'}, refaddr $storage, 'storage was stored'); isa_ok($all[2], 'MyCart'); is($all[2]->{'result'}->{'result'}, 'c', 'result was stored'); is(refaddr $all[2]->{'result'}->{'storage'}, refaddr $storage, 'storage was stored'); ## check first my $first = $iterator->first; isa_ok($first, 'MyCart'); is($first->{'result'}->{'result'}, 'a', 'result was stored'); is(refaddr $first->{'result'}->{'storage'}, refaddr $storage, 'storage was stored'); ## check last my $last = $iterator->last; isa_ok($last, 'MyCart'); is($last->{'result'}->{'result'}, 'c', 'result was stored'); is(refaddr $last->{'result'}->{'storage'}, refaddr $storage, 'storage was stored'); ## check next my $a = $iterator->next; isa_ok($a, 'MyCart'); is($a->{'result'}->{'result'}, 'a', 'result was stored'); is(refaddr $a->{'result'}->{'storage'}, refaddr $storage, 'storage was stored'); my $b = $iterator->next; isa_ok($b, 'MyCart'); is($b->{'result'}->{'result'}, 'b', 'result was stored'); is(refaddr $b->{'result'}->{'storage'}, refaddr $storage, 'storage was stored'); my $c = $iterator->next; isa_ok($c, 'MyCart'); is($c->{'result'}->{'result'}, 'c', 'result was stored'); is(refaddr $c->{'result'}->{'storage'}, refaddr $storage, 'storage was stored'); is($iterator->next, undef, 'iterator returns undef at end'); $iterator->reset; my $d = $iterator->next; isa_ok($d, 'MyCart'); is($d->{'result'}->{'result'}, 'a', 'result was stored'); is(refaddr $d->{'result'}->{'storage'}, refaddr $storage, 'storage was stored'); # check methods with empty list $iterator->{data}->{data} = []; is($iterator->first, undef, 'first returns undef on empty list'); is($iterator->last, undef, 'last returns undef on empty list'); is($iterator->next, undef, 'next returns undef on empty list'); };