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