The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -wT

use strict;

#use Test::More 'no_plan';
use Test::More tests => 52;
use TAPx::Parser;

use TAPx::Parser::Iterator;

sub array_ref_from {
    my $string = shift;
    my @lines = split /\n/ => $string;
    return \@lines;
}

# we slurp __DATA__ and then reset it so we don't have to duplicate our TAP
my $offset = tell DATA;
my $tap = do { local $/; <DATA> };
seek DATA, $offset, 0;

foreach my $source ( array_ref_from($tap), \*DATA ) {
    ok my $iter = TAPx::Parser::Iterator->new($source),
      'We should be able to create a new iterator';
    isa_ok $iter, 'TAPx::Parser::Iterator', '... and the object it returns';
    my $subclass =
        'ARRAY' eq ref $source
      ? 'TAPx::Parser::Iterator::ARRAY'
      : 'TAPx::Parser::Iterator::FH';
    isa_ok $iter,, $subclass, '... and the object it returns';

    can_ok $iter, 'is_first';
    can_ok $iter, 'is_last';

    foreach my $method (qw<is_first is_last>) {
        ok !$iter->$method,
          "... $method() should not return true for a new iter";
    }

    can_ok $iter, 'exit';
    ok !defined $iter->exit, '... and it should be undef before we are done';

    can_ok $iter, 'next';
    is $iter->next, 'one', 'next() should return the first result';
    ok $iter->is_first, '... and is_first() should now return true';
    ok !$iter->is_last, '... and is_last() should now return false';

    is $iter->next, 'two', 'next() should return the second result';
    ok !$iter->is_first, '... and is_first() should now return false';
    ok !$iter->is_last,  '... and is_last() should now return false';

    is $iter->next, '', 'next() should return the third result';
    ok !$iter->is_first, '... and is_first() should now return false';
    ok !$iter->is_last,  '... and is_last() should now return false';

    is $iter->next, 'three', 'next() should return the fourth result';
    ok !$iter->is_first, '... and is_first() should now return false';
    ok $iter->is_last, '... and is_last() should now return true';

    ok !defined $iter->next, 'next() should return undef after it is empty';
    ok !$iter->is_first, '... and is_first() should now return false';
    ok $iter->is_last, '... and is_last() should now return true';

    is $iter->exit, 0, '... and exit should now return 0';
}

__DATA__
one
two

three