1#!/usr/bin/perl -w 2 3use strict; 4use warnings; 5use lib 't/lib'; 6 7use Test::More qw( no_plan ); 8 9use File::Spec; 10use TAP::Parser; 11use TAP::Parser::Multiplexer; 12use TAP::Parser::Iterator::Process; 13 14my $fork_desc 15 = TAP::Parser::Iterator::Process->_use_open3 16 ? 'fork' 17 : 'nofork'; 18 19my @schedule = ( 20 { name => 'Single non-selectable source', 21 22 # Returns a list of parser, stash pairs. The stash contains the 23 # TAP that we expect from this parser. 24 sources => sub { 25 my @tap = ( 26 '1..1', 27 'ok 1 Just fine' 28 ); 29 30 return [ 31 TAP::Parser->new( { tap => join( "\n", @tap ) . "\n" } ), 32 \@tap, 33 ]; 34 }, 35 }, 36 { name => 'Two non-selectable sources', 37 sources => sub { 38 my @tap = ( 39 [ '1..1', 40 'ok 1 Just fine' 41 ], 42 [ '1..2', 43 'not ok 1 Oh dear', 44 'ok 2 Better' 45 ] 46 ); 47 48 return map { 49 [ TAP::Parser->new( { tap => join( "\n", @$_ ) . "\n" } ), 50 $_ 51 ] 52 } @tap; 53 }, 54 }, 55 { name => 'Single selectable source', 56 sources => sub { 57 return [ 58 TAP::Parser->new( 59 { source => File::Spec->catfile( 60 't', 61 'sample-tests', 62 'simple' 63 ), 64 } 65 ), 66 [ '1..5', 67 'ok 1', 68 'ok 2', 69 'ok 3', 70 'ok 4', 71 'ok 5', 72 ] 73 ]; 74 }, 75 }, 76 { name => 'Three selectable sources', 77 sources => sub { 78 return map { 79 [ TAP::Parser->new( 80 { source => File::Spec->catfile( 81 't', 82 'sample-tests', 83 'simple' 84 ), 85 } 86 ), 87 [ '1..5', 88 'ok 1', 89 'ok 2', 90 'ok 3', 91 'ok 4', 92 'ok 5', 93 ] 94 ] 95 } 1 .. 3; 96 }, 97 }, 98 { name => 'Three selectable sources, two non-selectable sources', 99 sources => sub { 100 my @tap = ( 101 [ '1..1', 102 'ok 1 Just fine' 103 ], 104 [ '1..2', 105 'not ok 1 Oh dear', 106 'ok 2 Better' 107 ] 108 ); 109 110 return ( 111 map { 112 [ TAP::Parser->new( 113 { tap => join( "\n", @$_ ) . "\n" } 114 ), 115 $_ 116 ] 117 } @tap 118 ), 119 ( map { 120 [ TAP::Parser->new( 121 { source => File::Spec->catfile( 122 't', 123 'sample-tests', 124 'simple' 125 ), 126 } 127 ), 128 [ '1..5', 129 'ok 1', 130 'ok 2', 131 'ok 3', 132 'ok 4', 133 'ok 5', 134 ] 135 ] 136 } 1 .. 3 137 ); 138 }, 139 } 140); 141 142for my $test (@schedule) { 143 my $name = "$test->{name} ($fork_desc)"; 144 my @sources = $test->{sources}->(); 145 my $mux = TAP::Parser::Multiplexer->new; 146 147 my $count = @sources; 148 $mux->add(@$_) for @sources; 149 150 is $mux->parsers, $count, "$name: count OK"; 151 152 while ( my ( $parser, $stash, $result ) = $mux->next ) { 153 154 # use Data::Dumper; 155 # diag Dumper( { stash => $stash, result => $result } ); 156 if ( defined $result ) { 157 my $expect = ( shift @$stash ) || ' OOPS '; 158 my $got = $result->raw; 159 is $got, $expect, "$name: '$expect' OK"; 160 } 161 else { 162 ok @$stash == 0, "$name: EOF OK"; 163 164 # Make sure we only get one EOF per stream 165 push @$stash, ' expect no more '; 166 } 167 } 168 is $mux->parsers, 0, "$name: All used up"; 169} 170 1711; 172