Another team has an issue where they have multiple TAP streams which all need to be integrated into a single stream, but obviously concatenating them won't do the trick. It would fail because you can't have more than one plan in a stream and the test numbers would be out of sequence (though you can turn them off if you're using Test::Builder). In talking with one of their developers, I wrote the following pseudo-code to explain the basic concept.
#!/usr/bin/env perl
use strict;
use warnings;
use TAP::Parser;
my $test_num = 1;
foreach my $stream (get_streams()) {
my $parser = TAP::Parser->new($stream);
while ( my $result = $parser->next ) {
if ( $result->is_plan ) {
# sent to STDOUT to ensure proper synchronization
print '# '.$result->as_string;
}
next unless $result->is_test;
print $result->ok;
print $test_num++;
# don't forget SKIP and TODO
print ' - ',$result->description,$/;
}
# check to see if the parser succeeded
}
print "1..$test_num\n";
sub get_streams {
...
}
When we get nested TAP, ugly hacks like this will go away.