DBIx-DR

 view release on metacpan or  search on metacpan

t/000-dr-iterator.t  view on Meta::CPAN

    cmp_ok $ss->get('c')->value, 'eq', '3', 'value';
    cmp_ok $ss->get('e')->id, 'eq', 'e', 'id';
    cmp_ok $ss->get('e')->value, 'eq', '3', 'value';
    cmp_ok $ss->{item_class}, 'eq', $aiter->{item_class}, 'Item class';
    cmp_ok $ss->{item_constructor}, 'eq', $aiter->{item_constructor},
        'Item constructor';
}

{

    my ($ss1) = $hiter->grep(value => 3)->all;
    my $ss2 = $hiter->find(value => 3);
    is $ss1->value, $ss2->value, 'find';
}

for my $ss($aiter->grep(id => 2), $aiter->grep(sub { $_[0]->id == 2 })) {
    isa_ok $ss => 'DBIx::DR::Iterator', 'Array subset';
    cmp_ok $ss->count, '==', 1, 'count of elements';
    ok $ss->exists(0), 'element was grepped properly';
    cmp_ok $ss->get(0)->id, '==', 2, 'id';
    cmp_ok $ss->{item_class}, 'eq', $aiter->{item_class}, 'Item class';
    cmp_ok $ss->{item_constructor}, 'eq', $aiter->{item_constructor},
        'Item constructor';
}


ok $item, 'Item extracted';
ok $item->iterator, 'Item has iterator link';
undef $hiter;
ok !$item->iterator,
    'Item has undefined iterator link after iterator was destroyed';

$item = $aiter->next;
ok !$item->is_changed, "Item wasn't changed";
ok !$item->iterator->is_changed, "Iterator wasn't changed";
ok !eval { $item->value; 1 }, 'Unknown method';
ok $item->id(123) == 123, 'Change field';
ok $item->is_changed, 'Field was changed';
ok $item->iterator->is_changed, 'Iterator was changed, too';

my $o = { 1 => 2 };
$item->id($o);
$item->iterator->is_changed(0);
$item->is_changed(0);

# the same object
$item->id($o);
ok !$item->is_changed, "Item wasn't changed";
ok !$item->iterator->is_changed, "Iterator wasn't changed";

$item->id([]);
ok $item->is_changed, 'Field was changed';
ok $item->iterator->is_changed, 'Iterator was changed, too';


{
    {
        package TestItem;
        sub new {
            my ($class, $item) = @_;
            return bless { %$item } => $class;
        }

        package TestItemD;
        sub new {
            my ($class, $item) = @_;
            return undef if @_ > 2;
            goto \&TestItem::new;
        }
    }

    my @items = (
        { a => 'b' },
        { c => 'd' },
        { d => 'e' }
    );

    my $l1 = DBIx::DR::Iterator->new(\@items, -item => 'test_item#new');
    my $l2 = DBIx::DR::Iterator->new(\@items, -item => 'test_item_d#new');
    my $l3 = DBIx::DR::Iterator->new(\@items, -item =>
        'test_item_d#new', -noitem_iter => 1);

    is_deeply [ $l2->all ], [ (undef) x 3 ], 'list2 contains only undef';
    is_deeply [ $l1->all ], [ $l3->all ],
        'Third list did not received iterator';
}

subtest 'iterator push, pop', sub {
    plan tests => 6;
    {
        package TestPushItem;
        sub new {
            my ($class, $item) = @_;
            return bless { %$item } => $class;
        }
    }
    my @items = (
        { a => 'b' },
        { c => 'd' },
        { d => 'e' }
    );

    my $list = DBIx::DR::Iterator->new(
        [@items],
        -item           => 'test_push_item#new',
        -noitem_iter    => 1,
    );

    is_deeply $list->push({ f => 'h' }), TestPushItem->new({ f => 'h' }), 'iterator push';
    is_deeply $list->get(-1), TestPushItem->new({ f => 'h' }), 'added element';
    is $list->count, 4, 'count';

    
    is_deeply $list->pop, TestPushItem->new({ f => 'h' }), 'iterator pop';
    is_deeply $list->get(-1), TestPushItem->new({ d => 'e' }), 'last element';
    is $list->count, 3, 'count';
};

=head1 COPYRIGHT

 Copyright (C) 2011 Dmitry E. Oboukhov <unera@debian.org>
 Copyright (C) 2011 Roman V. Nikolaev <rshadow@rambler.ru>

 This program is free software, you can redistribute it and/or
 modify it under the terms of the Artistic License.

=cut



( run in 1.063 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )