#!/usr/bin/perl -wT
use strict;
use lib 'lib';
use TAP::Parser::Iterator;
use Test::More tests => 47;
use TAP::Parser;
use TAP::Parser::Iterator;
my ( $STREAMED, $ITER ) = ( 'TAP::Parser', 'TAP::Parser::Iterator' );
my $ITER_FH = "${ITER}::Stream";
my $ITER_ARRAY = "${ITER}::Array";
my $stream = TAP::Parser::Iterator->new( \*DATA );
ok my $parser = TAP::Parser->new( { stream => $stream } ),
'... and creating a streamed parser should succeed';
isa_ok $parser, 'TAP::Parser', '... and the object it returns';
can_ok $parser, '_stream';
is ref $parser->_stream, $ITER_FH,
'... and it should return the proper iterator';
can_ok $parser, 'next';
is $parser->next->as_string, '1..5',
'... and the plan should parse correctly';
is $parser->next->as_string, 'ok 1 - input file opened',
'... and the first test should parse correctly';
is $parser->next->as_string, '... this is junk',
'... and junk should parse correctly';
is $parser->next->as_string,
'not ok 2 first line of the input valid # TODO some data',
'... and the second test should parse correctly';
is $parser->next->as_string, '# this is a comment',
'... and comments should parse correctly';
is $parser->next->as_string, 'ok 3 - read the rest of the file',
'... and the third test should parse correctly';
is $parser->next->as_string, 'not ok 4 - this is a real failure',
'... and the fourth test should parse correctly';
is $parser->next->as_string, 'ok 5 # SKIP we have no description',
'... and fifth test should parse correctly';
ok !$parser->parse_errors, '... and we should have no parse errors';
# plan at end
my $tap = <<'END_TAP';
ok 1 - input file opened
... this is junk
not ok first line of the input valid # todo some data
# this is a comment
ok 3 - read the rest of the file
not ok 4 - this is a real failure
ok 5 # skip we have no description
1..5
END_TAP
$stream = $ITER->new( [ split /\n/ => $tap ] );
ok $parser = TAP::Parser->new( { stream => $stream } ),
'Now we create a parser with the plan at the end';
isa_ok $parser->_stream, $ITER_ARRAY,
'... and now we should have an array iterator';
is $parser->next->as_string, 'ok 1 - input file opened',
'... and the first test should parse correctly';
is $parser->next->as_string, '... this is junk',
'... and junk should parse correctly';
is $parser->next->as_string,
'not ok 2 first line of the input valid # TODO some data',
'... and the second test should parse correctly';
is $parser->next->as_string, '# this is a comment',
'... and comments should parse correctly';
is $parser->next->as_string, 'ok 3 - read the rest of the file',
'... and the third test should parse correctly';
is $parser->next->as_string, 'not ok 4 - this is a real failure',
'... and the fourth test should parse correctly';
is $parser->next->as_string, 'ok 5 # SKIP we have no description',
'... and fifth test should parse correctly';
is $parser->next->as_string, '1..5',
'... and the plan should parse correctly';
ok !$parser->parse_errors, '... and we should have no parse errors';
# misplaced plan (and one-off errors)
$tap = <<'END_TAP';
ok 1 - input file opened
1..5
... this is junk
not ok first line of the input valid # todo some data
# this is a comment
ok 3 - read the rest of the file
not ok 4 - this is a real failure
ok 5 # skip we have no description
END_TAP
$stream = $ITER->new( [ split /\n/ => $tap ] );
ok $parser = TAP::Parser->new( { stream => $stream } ),
'Now we create a parser with a plan as the second line';
is $parser->next->as_string, 'ok 1 - input file opened',
'... and the first test should parse correctly';
is $parser->next->as_string, '1..5',
'... and the plan should parse correctly';
is $parser->next->as_string, '... this is junk',
'... and junk should parse correctly';
is $parser->next->as_string,
'not ok 2 first line of the input valid # TODO some data',
'... and the second test should parse correctly';
is $parser->next->as_string, '# this is a comment',
'... and comments should parse correctly';
is $parser->next->as_string, 'ok 3 - read the rest of the file',
'... and the third test should parse correctly';
is $parser->next->as_string, 'not ok 4 - this is a real failure',
'... and the fourth test should parse correctly';
is $parser->next->as_string, 'ok 5 # SKIP we have no description',
'... and fifth test should parse correctly';
ok $parser->parse_errors, '... and we should have one parse error';
is + ( $parser->parse_errors )[0],
'Plan (1..5) must be at the beginning or end of the TAP output',
'... telling us that our plan went awry';
$tap = <<'END_TAP';
ok 1 - input file opened
... this is junk
not ok first line of the input valid # todo some data
# this is a comment
ok 3 - read the rest of the file
not ok 4 - this is a real failure
1..5
ok 5 # skip we have no description
END_TAP
$stream = $ITER->new( [ split /\n/ => $tap ] );
ok $parser = TAP::Parser->new( { stream => $stream } ),
'Now we create a parser with the plan as the second to last line';
is $parser->next->as_string, 'ok 1 - input file opened',
'... and the first test should parse correctly';
is $parser->next->as_string, '... this is junk',
'... and junk should parse correctly';
is $parser->next->as_string,
'not ok 2 first line of the input valid # TODO some data',
'... and the second test should parse correctly';
is $parser->next->as_string, '# this is a comment',
'... and comments should parse correctly';
is $parser->next->as_string, 'ok 3 - read the rest of the file',
'... and the third test should parse correctly';
is $parser->next->as_string, 'not ok 4 - this is a real failure',
'... and the fourth test should parse correctly';
is $parser->next->as_string, '1..5',
'... and the plan should parse correctly';
is $parser->next->as_string, 'ok 5 # SKIP we have no description',
'... and fifth test should parse correctly';
ok $parser->parse_errors, '... and we should have one parse error';
is + ( $parser->parse_errors )[0],
'Plan (1..5) must be at the beginning or end of the TAP output',
'... telling us that our plan went awry';
__DATA__
1..5
ok 1 - input file opened
... this is junk
not ok first line of the input valid # todo some data
# this is a comment
ok 3 - read the rest of the file
not ok 4 - this is a real failure
ok 5 # skip we have no description