#! perl

use Test2::V0;
use Iterator::Flex::Common 'icat';
use experimental 'signatures';

sub iterator {
    icat [ 0, 10, 20 ], [ 30, 40, 50, 60 ];
}

sub test_values ( $iter ) {
    subtest "values" => sub {
        is( [ map { <$iter> } 1 .. 7 ], [ 0, 10, 20, 30, 40, 50, 60 ], "values are correct" );
        is( $iter->next,                U(),                           'beyond is undef' );
        is( $iter->is_exhausted,        T(),                           "iterator exhausted" );
    };
}


my $iter = iterator();

subtest "object properties" => sub {
    isa_ok( $iter, ['Iterator::Flex::Base'], "correct parent class" );
    can_ok( $iter, ['reset'],  'can reset' );
    can_ok( $iter, ['rewind'], 'can rewind' );
};

test_values( $iter );
my $prev = $iter->prev;

subtest "rewind" => sub {
    $iter->rewind;
    is( $iter->prev, $prev, "wrapped prev" );
    test_values( $iter );
};

subtest "reset" => sub {
    $iter->reset;
    is( $iter->prev, U(), "wrapped prev" );
    test_values( $iter );
};



done_testing;