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