#!/usr/bin/perl -w use strict; use lib 'lib'; use Test::More tests => 144; use TAPx::Parser::Source; use File::Spec; my $test = File::Spec->catfile( 't', 'source_tests', 'varsource' ); my $perl = $^X; # sub show_state { # my ($stream, $where) = @_; # my $first = $stream->is_first; # my $last = $stream->is_last; # warn "$where, is_first = ", # defined $first ? $first : '(undef)', # ", is_last = ", # defined $last ? $last : '(undef)', # "\n"; # } sub xnor { my ( $a, $b ) = @_; return ( $a && $b ) || ( !$a && !$b ); } ok xnor( undef, undef ), 'xnor undef, undef'; ok xnor( 1, 1 ), 'xnor 1, 1'; ok !xnor( undef, 1 ), 'xnor undef, 1'; ok !xnor( 1, undef ), 'xnor 1, undef'; for ( my $lines = 0; $lines < 5; $lines += 0.5 ) { # warn "$lines lines\n"; ok my $source = TAPx::Parser::Source->new, 'new source made ok'; ok $source->source( [ $perl, '-T', $test, $lines ] ); ok my $stream = $source->get_stream, 'get_stream works'; ok !$stream->is_first, 'is_first false before loop'; ok !$stream->is_last, 'is_last false before loop'; # show_state($stream, 'before loop'); for my $ln ( 1 .. int($lines) ) { my $next = $stream->next; is $next, $ln, 'got correct line'; my $is_first = $ln == 1; my $is_last = $ln == int($lines) && !$is_first; # show_state($stream, "line $ln"); ok xnor( $is_first, $stream->is_first ), "is_first on line $ln"; ok xnor( $is_last, $stream->is_last ), "is_last on line $ln"; } ok !$stream->next, 'finished ok'; if ( $lines == 0.5 ) { # This reflects current behaviour - not sure if it's right # though. ok $stream->is_first, 'is_first false before loop'; ok !$stream->is_last, 'is_last false before loop'; } else { ok !$stream->is_first, 'is_first false before loop'; ok $stream->is_last, 'is_last false before loop'; } # show_state($stream, 'after loop'); }