Part of my current work with TAPx::Parser is to get the TAPx::Harness output as similar to Test::Harness output as I can. This turns out to be annoyingly tricky.
Failed Test Stat Wstat Total Fail List of Failed ------------------------------------------------------------------------------- runtests_example.pl 5 1280 13 5 3 5 10-12 (1 subtest UNEXPECTEDLY SUCCEEDED). Failed 1/1 test scripts. 5/13 subtests failed. Files=1, Tests=13, 0 wallclock secs ( 0.06 cusr + 0.02 csys = 0.08 CPU) Failed 1/1 test programs. 5/13 subtests failed.
Test::Harness uses formats to get this right. While my code doesn't use formats, I have worked on getting the "List of Failed" ranges right with code similar to the following:
#!/usr/bin/perl
use strict;
use warnings;
use Test::More qw/no_plan/;
is join( ', ', range(qw( 33 34 35 37 99 100 101 )) ), '33-35, 37, 99-101';
is join( ', ', range(qw( 1 2 3 4)) ), '1-4';
is join( ', ', range(qw(1 2 5 6 7 9)) ), '1-2, 5-7, 9';
is join( ', ', range(qw(17 19 33)) ), '17, 19, 33';
is join( ', ', range(qw(17 19)) ), '17, 19';
diag balanced_range( 15,
range(qw( 1 2 3 5 7 9 20 33 34 35 37 99 100 101 )) );
sub balanced_range {
my ( $limit, @range ) = @_;
my $lines = "\t";
my $curr = 0;
while (@range) {
if ( $curr < $limit ) {
my $range = ( shift @range ) . ", ";
$lines .= $range;
$curr += length $range;
}
elsif (@range) {
$lines .= "\n\t";
$curr = 0;
}
}
$lines =~ s/, $//;
return $lines;
}
sub range {
my @numbers = @_;
my ( $min, @range );
foreach my $i ( 0 .. $#numbers ) {
my $num = $numbers[$i];
my $next = $numbers[ $i + 1 ];
if ( defined $next && $next == $num + 1 ) {
if ( !defined $min ) {
$min = $num;
}
}
elsif ( defined $min ) {
push @range => "$min-$num";
undef $min;
}
else {
push @range => $num;
}
}
return @range;
}
As a first pass, it's awful, but I'm working on it!
Maybe you can come up with something beautiful that I can steal instead!
Re:Please don't
Ovid on 2007-01-05T07:29:33
Well, I've had a lot of trouble coming up with an exact match (and in any event, it can't match exactly because I have different information I present). However, so far I'm quite satisfied I've come up with something even clunkier and yuckier than Test::Harness. However, it works
:) My thought is fix a couple of minor nits, get --exec nailed down, and release. If I do that, maybe my output will be so ugly I can get suggestions or even patches!