Upgrade Test-Harness from version 3.39 to 3.41
authorTodd Rinaldo <toddr@cpanel.net>
Sun, 18 Mar 2018 20:19:36 +0000 (15:19 -0500)
committerTodd Rinaldo <toddr@cpan.org>
Sun, 18 Mar 2018 22:55:57 +0000 (17:55 -0500)
[DELTA]

3.41    27-02-2018
        - Released 3.40_01 without code modifications

3.40_01 23-07-2017
        - Return handle for pipes and sockets #58 (Erik Huelsmann)
        - TAP v13 plan allows trailing whitespace (Steffen Schwigon)
        - prove: add a --statefile=<path> option to customize the .prove file
          (Ævar Arnfjörð Bjarmason)
        - Avoid non-deterministic source handling, make a SourceHandler tie an
          error. (Michael Schwern, Leon Timmermans)
        - Fix and simplify MSWin32 colorization (Roy Ivy III)
        - Fix file source handler to accept single extensions option (Tomoki Aonuma)
        - Spelling fixes (Brian Wightman)

57 files changed:
MANIFEST
Porting/Maintainers.pl
cpan/Test-Harness/bin/prove
cpan/Test-Harness/lib/App/Prove.pm
cpan/Test-Harness/lib/App/Prove/State.pm
cpan/Test-Harness/lib/App/Prove/State/Result.pm
cpan/Test-Harness/lib/App/Prove/State/Result/Test.pm
cpan/Test-Harness/lib/TAP/Base.pm
cpan/Test-Harness/lib/TAP/Formatter/Base.pm
cpan/Test-Harness/lib/TAP/Formatter/Color.pm
cpan/Test-Harness/lib/TAP/Formatter/Console.pm
cpan/Test-Harness/lib/TAP/Formatter/Console/ParallelSession.pm
cpan/Test-Harness/lib/TAP/Formatter/Console/Session.pm
cpan/Test-Harness/lib/TAP/Formatter/File.pm
cpan/Test-Harness/lib/TAP/Formatter/File/Session.pm
cpan/Test-Harness/lib/TAP/Formatter/Session.pm
cpan/Test-Harness/lib/TAP/Harness.pm
cpan/Test-Harness/lib/TAP/Harness/Env.pm
cpan/Test-Harness/lib/TAP/Object.pm
cpan/Test-Harness/lib/TAP/Parser.pm
cpan/Test-Harness/lib/TAP/Parser/Aggregator.pm
cpan/Test-Harness/lib/TAP/Parser/Grammar.pm
cpan/Test-Harness/lib/TAP/Parser/Iterator.pm
cpan/Test-Harness/lib/TAP/Parser/Iterator/Array.pm
cpan/Test-Harness/lib/TAP/Parser/Iterator/Process.pm
cpan/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm
cpan/Test-Harness/lib/TAP/Parser/IteratorFactory.pm
cpan/Test-Harness/lib/TAP/Parser/Multiplexer.pm
cpan/Test-Harness/lib/TAP/Parser/Result.pm
cpan/Test-Harness/lib/TAP/Parser/Result/Bailout.pm
cpan/Test-Harness/lib/TAP/Parser/Result/Comment.pm
cpan/Test-Harness/lib/TAP/Parser/Result/Plan.pm
cpan/Test-Harness/lib/TAP/Parser/Result/Pragma.pm
cpan/Test-Harness/lib/TAP/Parser/Result/Test.pm
cpan/Test-Harness/lib/TAP/Parser/Result/Unknown.pm
cpan/Test-Harness/lib/TAP/Parser/Result/Version.pm
cpan/Test-Harness/lib/TAP/Parser/Result/YAML.pm
cpan/Test-Harness/lib/TAP/Parser/ResultFactory.pm
cpan/Test-Harness/lib/TAP/Parser/Scheduler.pm
cpan/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm
cpan/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm
cpan/Test-Harness/lib/TAP/Parser/Source.pm
cpan/Test-Harness/lib/TAP/Parser/SourceHandler.pm
cpan/Test-Harness/lib/TAP/Parser/SourceHandler/Executable.pm
cpan/Test-Harness/lib/TAP/Parser/SourceHandler/File.pm
cpan/Test-Harness/lib/TAP/Parser/SourceHandler/Handle.pm
cpan/Test-Harness/lib/TAP/Parser/SourceHandler/Perl.pm
cpan/Test-Harness/lib/TAP/Parser/SourceHandler/RawTAP.pm
cpan/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm
cpan/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm
cpan/Test-Harness/lib/Test/Harness.pm
cpan/Test-Harness/t/env_opts.t [new file with mode: 0644]
cpan/Test-Harness/t/iterator_factory.t
cpan/Test-Harness/t/lib/MyFileSourceHandler.pm
cpan/Test-Harness/t/regression.t
cpan/Test-Harness/t/sample-tests/space_after_plan_v13 [new file with mode: 0644]
cpan/Test-Harness/t/source_tests/test.tap [new file with mode: 0644]

index 819daf0..449e5a9 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -2122,6 +2122,7 @@ cpan/Test-Harness/t/console.t                             Test::Harness test
 cpan/Test-Harness/t/data/catme.1                       Test data for Test::Harness
 cpan/Test-Harness/t/data/proverc                       Test data for Test::Harness
 cpan/Test-Harness/t/data/sample.yml                    Test data for Test::Harness
+cpan/Test-Harness/t/env_opts.t
 cpan/Test-Harness/t/errors.t                           Test::Harness test
 cpan/Test-Harness/t/file.t                             Test::Harness test
 cpan/Test-Harness/t/glob-to-regexp.t                   Test::Harness test
@@ -2207,6 +2208,7 @@ cpan/Test-Harness/t/sample-tests/skipall          Test data for Test::Harness
 cpan/Test-Harness/t/sample-tests/skipall_nomsg         Test data for Test::Harness
 cpan/Test-Harness/t/sample-tests/skipall_v13           Test data for Test::Harness
 cpan/Test-Harness/t/sample-tests/space_after_plan      Test data for Test::Harness
+cpan/Test-Harness/t/sample-tests/space_after_plan_v13
 cpan/Test-Harness/t/sample-tests/stdout_stderr         Test data for Test::Harness
 cpan/Test-Harness/t/sample-tests/strict                        Test data for Test::Harness
 cpan/Test-Harness/t/sample-tests/switches              Test data for Test::Harness
@@ -2240,6 +2242,7 @@ cpan/Test-Harness/t/source_tests/source.sh                                Test::Harness test
 cpan/Test-Harness/t/source_tests/source.t                              Test::Harness test
 cpan/Test-Harness/t/source_tests/source.tap                            Test::Harness test
 cpan/Test-Harness/t/source_tests/source_args.sh                                Test::Harness test
+cpan/Test-Harness/t/source_tests/test.tap
 cpan/Test-Harness/t/spool.t                            Test::Harness test
 cpan/Test-Harness/t/state.t                            Test::Harness test
 cpan/Test-Harness/t/state_results.t                    Test::Harness test
index 19d977b..54154fa 100755 (executable)
@@ -1066,7 +1066,7 @@ use File::Glob qw(:case);
     },
 
     'Test::Harness' => {
-        'DISTRIBUTION' => 'LEONT/Test-Harness-3.39.tar.gz',
+        'DISTRIBUTION' => 'LEONT/Test-Harness-3.41.tar.gz',
         'FILES'        => q[cpan/Test-Harness],
         'EXCLUDED'     => [
             qr{^examples/},
index d71b238..3d41db0 100644 (file)
@@ -72,6 +72,7 @@ Options that take arguments:
  -a,  --archive out.tgz Store the resulting TAP in an archive file.
  -j,  --jobs N          Run N test jobs in parallel (try 9.)
       --state=opts      Control prove's persistent state.
+      --statefile=file  Use `file` instead of `.prove` for state
       --rc=rcfile       Process options from rcfile
       --rules           Rules for parallel vs sequential processing.
 
@@ -109,12 +110,12 @@ matching the pattern C<t/*.t>.
 
 =head2 Colored Test Output
 
-Colored test output using L<TAP::Formatter::Color> is the default, but 
-if output is not to a terminal, color is disabled. You can override this by 
+Colored test output using L<TAP::Formatter::Color> is the default, but
+if output is not to a terminal, color is disabled. You can override this by
 adding the C<--color> switch.
 
-Color support requires L<Term::ANSIColor> on Unix-like platforms and
-L<Win32::Console> on windows. If the necessary module is not installed
+Color support requires L<Term::ANSIColor> and, on windows platforms, also
+L<Win32::Console::ANSI>. If the necessary module(s) are not installed
 colored output will not be available.
 
 =head2 Exit Code
index a98d631..30c4d7e 100644 (file)
@@ -18,11 +18,11 @@ App::Prove - Implements the C<prove> command.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
@@ -59,6 +59,7 @@ BEGIN {
       verbose warnings_fail warnings_warn show_help show_man show_version
       state_class test_args state dry extensions ignore_exit rules state_manager
       normalize sources tapversion trap
+      statefile
     );
     __PACKAGE__->mk_methods(@ATTR);
 }
@@ -229,6 +230,7 @@ sub process_args {
             'M=s@'         => $self->{modules},
             'P=s@'         => $self->{plugins},
             'state=s@'     => $self->{state},
+            'statefile=s'  => \$self->{statefile},
             'directives'   => \$self->{directives},
             'h|help|?'     => \$self->{show_help},
             'H|man'        => \$self->{show_man},
@@ -279,7 +281,7 @@ sub _help {
 sub _color_default {
     my $self = shift;
 
-    return -t STDOUT && !$ENV{HARNESS_NOTTY} && !IS_WIN32;
+    return -t STDOUT && !$ENV{HARNESS_NOTTY};
 }
 
 sub _get_args {
@@ -479,7 +481,7 @@ sub run {
 
     unless ( $self->state_manager ) {
         $self->state_manager(
-            $self->state_class->new( { store => STATE_FILE } ) );
+            $self->state_class->new( { store => $self->statefile || STATE_FILE } ) );
     }
 
     if ( $self->show_help ) {
index 0b1baf1..a4d696d 100644 (file)
@@ -25,11 +25,11 @@ App::Prove::State - State storage for the C<prove> command.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 5813341..a36db7f 100644 (file)
@@ -14,11 +14,11 @@ App::Prove::State::Result - Individual test suite results.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 22a0d09..bf6160b 100644 (file)
@@ -9,11 +9,11 @@ App::Prove::State::Result::Test - Individual test results.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 1d8b2da..a6eac06 100644 (file)
@@ -12,11 +12,11 @@ and L<TAP::Harness>
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 use constant GOT_TIME_HIRES => do {
     eval 'use Time::HiRes qw(time);';
index d44dcf5..1248934 100644 (file)
@@ -58,11 +58,11 @@ TAP::Formatter::Base - Base class for harness output delegates
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 060d77a..15886f1 100644 (file)
@@ -12,56 +12,24 @@ my $NO_COLOR;
 BEGIN {
     $NO_COLOR = 0;
 
+    eval 'require Term::ANSIColor';
+    if ($@) {
+        $NO_COLOR = $@;
+    };
     if (IS_WIN32) {
-        eval 'use Win32::Console';
+        eval 'use Win32::Console::ANSI';
         if ($@) {
             $NO_COLOR = $@;
         }
-        else {
-            my $console = Win32::Console->new( STD_OUTPUT_HANDLE() );
-
-            # eval here because we might not know about these variables
-            my $fg = eval '$FG_LIGHTGRAY';
-            my $bg = eval '$BG_BLACK';
-
-            *set_color = sub {
-                my ( $self, $output, $color ) = @_;
-
-                my $var;
-                if ( $color eq 'reset' ) {
-                    $fg = eval '$FG_LIGHTGRAY';
-                    $bg = eval '$BG_BLACK';
-                }
-                elsif ( $color =~ /^on_(.+)$/ ) {
-                    $bg = eval '$BG_' . uc($1);
-                }
-                else {
-                    $fg = eval '$FG_' . uc($color);
-                }
-
-                # In case of colors that aren't defined
-                $self->set_color('reset')
-                  unless defined $bg && defined $fg;
-
-                $console->Attr( $bg | $fg );
-            };
-        }
-    }
-    else {
-        eval 'use Term::ANSIColor';
-        if ($@) {
-            $NO_COLOR = $@;
-        }
-        else {
-            *set_color = sub {
-                my ( $self, $output, $color ) = @_;
-                $output->( color($color) );
-            };
-        }
-    }
+    };
 
     if ($NO_COLOR) {
         *set_color = sub { };
+    } else {
+        *set_color = sub {
+            my ( $self, $output, $color ) = @_;
+            $output->( Term::ANSIColor::color($color) );
+        };
     }
 }
 
@@ -71,11 +39,11 @@ TAP::Formatter::Color - Run Perl test scripts with color
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
@@ -87,7 +55,7 @@ in color.  Passing tests are printed in green.  Failing tests are in red.
 Skipped tests are blue on a white background and TODO tests are printed in
 white.
 
-If L<Term::ANSIColor> cannot be found (or L<Win32::Console> if running
+If L<Term::ANSIColor> cannot be found (and L<Win32::Console::ANSI> if running
 under Windows) tests will be run without color.
 
 =head1 SYNOPSIS
index a48068e..0d0c2fa 100644 (file)
@@ -11,11 +11,11 @@ TAP::Formatter::Console - Harness output delegate for default console output
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index ec5e5ff..82bf44e 100644 (file)
@@ -41,11 +41,11 @@ TAP::Formatter::Console::ParallelSession - Harness output delegate for parallel
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index df17420..14ad21f 100644 (file)
@@ -26,11 +26,11 @@ TAP::Formatter::Console::Session - Harness output delegate for default console o
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index bc8d2e8..0baa745 100644 (file)
@@ -13,11 +13,11 @@ TAP::Formatter::File - Harness output delegate for file output
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 524054a..ad116db 100644 (file)
@@ -10,11 +10,11 @@ TAP::Formatter::File::Session - Harness output delegate for file output
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 0918e81..df58247 100644 (file)
@@ -23,11 +23,11 @@ TAP::Formatter::Session - Abstract base class for harness output delegate
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 METHODS
 
index 65fd672..4e3c612 100644 (file)
@@ -16,11 +16,11 @@ TAP::Harness - Run test scripts with statistics
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 $ENV{HARNESS_ACTIVE}  = 1;
 $ENV{HARNESS_VERSION} = $VERSION;
index 722b056..4ef003a 100644 (file)
@@ -7,7 +7,7 @@ use constant IS_VMS => ( $^O eq 'VMS' );
 use TAP::Object;
 use Text::ParseWords qw/shellwords/;
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 # Get the parts of @INC which are changed from the stock list AND
 # preserve reordering of stock directories.
@@ -126,7 +126,7 @@ TAP::Harness::Env - Parsing harness related environmental variables where approp
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =head1 SYNOPSIS
 
index 486e83b..ea71571 100644 (file)
@@ -9,11 +9,11 @@ TAP::Object - Base class that provides common functionality to all C<TAP::*> mod
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index a5c7cb0..34e86f6 100644 (file)
@@ -27,11 +27,11 @@ TAP::Parser - Parse L<TAP|Test::Harness::TAP> output
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 my $DEFAULT_TAP_VERSION = 12;
 my $MAX_TAP_VERSION     = 13;
index 0c9f245..e0dc60b 100644 (file)
@@ -12,11 +12,11 @@ TAP::Parser::Aggregator - Aggregate TAP::Parser results
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index d69797c..264d2ca 100644 (file)
@@ -14,11 +14,11 @@ TAP::Parser::Grammar - A grammar for the Test Anything Protocol.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
@@ -178,7 +178,7 @@ my %language_for;
     my %v13 = (
         %v12,
         plan => {
-            syntax  => qr/^1\.\.(\d+)(?:\s*#\s*SKIP\b(.*))?\z/i,
+            syntax  => qr/^1\.\.(\d+)\s*(?:\s*#\s*SKIP\b(.*))?\z/i,
             handler => sub {
                 my ( $self, $line ) = @_;
                 my ( $tests_planned, $explanation ) = ( $1, $2 );
index 50d5708..79d527a 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Iterator - Base class for TAP source iterators
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index 666e115..2642f53 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Iterator::Array - Iterator for array-based TAP sources
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index 76f6a03..978e903 100644 (file)
@@ -16,11 +16,11 @@ TAP::Parser::Iterator::Process - Iterator for process-based TAP sources
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index ee14f6c..626df9a 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Iterator::Stream - Iterator for filehandle-based TAP sources
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
@@ -90,6 +90,16 @@ sub _finish {
     close delete $self->{fh};
 }
 
+sub get_select_handles {
+    my $self = shift;
+
+    # return our handle in case it's a socket or pipe (select()-able)
+    return ( $self->{fh}, )
+        if (-S $self->{fh} || -p $self->{fh});
+
+    return;
+}
+
 1;
 
 =head1 ATTRIBUTION
index dd0cc0f..0ab84c5 100644 (file)
@@ -16,11 +16,11 @@ TAP::Parser::IteratorFactory - Figures out which SourceHandler objects to use fo
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
@@ -243,19 +243,14 @@ sub detect_source {
     confess('no raw source ref defined!') unless defined $source->raw;
 
     # find a list of handlers that can handle this source:
-    my %handlers;
-    for my $dclass ( @{ $self->handlers } ) {
-        my $confidence = $dclass->can_handle($source);
-
-        # warn "handler: $dclass: $confidence\n";
-        $handlers{$dclass} = $confidence if $confidence;
+    my %confidence_for;
+    for my $handler ( @{ $self->handlers } ) {
+        my $confidence = $handler->can_handle($source);
+        # warn "handler: $handler: $confidence\n";
+        $confidence_for{$handler} = $confidence if $confidence;
     }
 
-    if ( !%handlers ) {
-
-        # use Data::Dump qw( pp );
-        # warn pp( $meta );
-
+    if ( !%confidence_for ) {
         # error: can't detect source
         my $raw_source_short = substr( ${ $source->raw }, 0, 50 );
         confess("Cannot detect source of '$raw_source_short'!");
@@ -263,23 +258,30 @@ sub detect_source {
     }
 
     # if multiple handlers can handle it, choose the most confident one
-    my @handlers = (
-        map    {$_}
-          sort { $handlers{$a} cmp $handlers{$b} }
-          keys %handlers
-    );
+    my @handlers =
+          sort { $confidence_for{$b} <=> $confidence_for{$a} }
+          keys %confidence_for;
+
+    # Check for a tie.
+    if( @handlers > 1 &&
+        $confidence_for{$handlers[0]} == $confidence_for{$handlers[1]}
+    ) {
+        my $filename = $source->meta->{file}{basename};
+        die("There is a tie between $handlers[0] and $handlers[1].\n".
+            "Both voted $confidence_for{$handlers[0]} on $filename.\n");
+    }
 
     # this is really useful for debugging handlers:
     if ( $ENV{TAP_HARNESS_SOURCE_FACTORY_VOTES} ) {
         warn(
             "votes: ",
-            join( ', ', map {"$_: $handlers{$_}"} @handlers ),
+            join( ', ', map {"$_: $confidence_for{$_}"} @handlers ),
             "\n"
         );
     }
 
     # return 1st
-    return pop @handlers;
+    return $handlers[0];
 }
 
 1;
index b583d44..d04e3ca 100644 (file)
@@ -17,11 +17,11 @@ TAP::Parser::Multiplexer - Multiplex multiple TAP::Parsers
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index e67276a..26d5f9d 100644 (file)
@@ -24,11 +24,11 @@ TAP::Parser::Result - Base class for TAP::Parser output objects
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index df64056..8f85f36 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Result::Bailout - Bailout result token.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index e9e4eb6..6f8c5a0 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Result::Comment - Comment result token.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 44e3011..8e6884c 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Result::Plan - Plan result token.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 2942b53..0700034 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Result::Pragma - TAP pragma token.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 34219bc..be8fb55 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Result::Test - Test result token.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 1cfd5df..64896e1 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Result::Unknown - Unknown result token.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index 18a1312..6714b77 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Result::Version - TAP syntax version token.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index bfe4ee4..4d95042 100644 (file)
@@ -11,11 +11,11 @@ TAP::Parser::Result::YAML - YAML result token.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 DESCRIPTION
 
index df06989..18a24bd 100644 (file)
@@ -29,11 +29,11 @@ TAP::Parser::ResultFactory - Factory for creating TAP::Parser output objects
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head2 DESCRIPTION
 
index 28a5b1d..e43a149 100644 (file)
@@ -13,11 +13,11 @@ TAP::Parser::Scheduler - Schedule tests during parallel testing
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
@@ -87,7 +87,7 @@ Here are some examples:
                ],
     }
 
-    # Run some  startup tests in sequence, then some parallel tests than some
+    # Run some  startup tests in sequence, then some parallel tests then some
     # teardown tests in sequence.
     {
         seq => [
index 42a6fae..12f3dcc 100644 (file)
@@ -10,11 +10,11 @@ TAP::Parser::Scheduler::Job - A single testing job.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index 8649077..9d5ab1d 100644 (file)
@@ -10,11 +10,11 @@ TAP::Parser::Scheduler::Spinner - A no-op job.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index a00e2aa..3e47f7c 100644 (file)
@@ -14,11 +14,11 @@ TAP::Parser::Source - a TAP source & meta data about it
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index a6ce2a0..7b10ae0 100644 (file)
@@ -12,11 +12,11 @@ TAP::Parser::SourceHandler - Base class for different TAP source handlers
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index 51bab09..71caad8 100644 (file)
@@ -16,11 +16,11 @@ TAP::Parser::SourceHandler::Executable - Stream output from an executable TAP so
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index 536fbcb..0d8066a 100644 (file)
@@ -16,11 +16,11 @@ TAP::Parser::SourceHandler::File - Stream TAP from a text file.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
@@ -71,7 +71,8 @@ sub can_handle {
     return 0.9 if $file->{lc_ext} eq '.tap';
 
     if ( my $exts = $config->{extensions} ) {
-        return 0.9 if grep { lc($_) eq $file->{lc_ext} } @$exts;
+        my @exts = ref $exts eq 'ARRAY' ? @$exts : $exts;
+        return 0.9 if grep { lc($_) eq $file->{lc_ext} } @exts;
     }
 
     return 0;
index 009578b..244b273 100644 (file)
@@ -16,11 +16,11 @@ TAP::Parser::SourceHandler::Handle - Stream TAP from an IO::Handle or a GLOB.
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index b662900..981935b 100644 (file)
@@ -21,11 +21,11 @@ TAP::Parser::SourceHandler::Perl - Stream TAP from a Perl executable
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index cfec463..e6dbfef 100644 (file)
@@ -16,11 +16,11 @@ TAP::Parser::SourceHandler::RawTAP - Stream output from raw TAP in a scalar/arra
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 =head1 SYNOPSIS
 
index 5a7cc4d..4d3df9b 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 use base 'TAP::Object';
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 # TODO:
 #   Handle blessed object syntax
@@ -269,7 +269,7 @@ TAP::Parser::YAMLish::Reader - Read YAMLish data from iterator
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =head1 SYNOPSIS
 
index f66563a..cddac04 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 use base 'TAP::Object';
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 my $ESCAPE_CHAR = qr{ [ \x00-\x1f \" ] }x;
 my $ESCAPE_KEY  = qr{ (?: ^\W ) | $ESCAPE_CHAR }x;
@@ -146,7 +146,7 @@ TAP::Parser::YAMLish::Writer - Write YAMLish data
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =head1 SYNOPSIS
 
index b126f44..581d788 100644 (file)
@@ -31,11 +31,11 @@ Test::Harness - Run Perl standard test scripts with statistics
 
 =head1 VERSION
 
-Version 3.39
+Version 3.41
 
 =cut
 
-our $VERSION = '3.39';
+our $VERSION = '3.41';
 
 # Backwards compatibility for exportable variable names.
 *verbose  = *Verbose;
diff --git a/cpan/Test-Harness/t/env_opts.t b/cpan/Test-Harness/t/env_opts.t
new file mode 100644 (file)
index 0000000..24b7c4e
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More tests => 16;
+
+use TAP::Harness::Env;
+
+sub _has_module {
+    my $module = shift;
+    eval "use $module";
+    return $@ ? 0 : 1;
+}
+
+{
+
+    # Should add a fake home dir? to test the rc stuff..
+    local $ENV{HARNESS_OPTIONS} = 'j4:c';
+
+    ok my $harness = TAP::Harness::Env->create, 'made harness';
+    is( $harness->color, 1, "set color correctly" );
+    is( $harness->jobs,  4, "set jobs correctly" );
+}
+SKIP: {
+    skip "requires TAP::Formatter::HTML", 4
+      unless _has_module('TAP::Formatter::HTML');
+    skip "requires TAP::Formatter::HTML 0.10 or higher", 4
+        unless TAP::Formatter::HTML->VERSION >= .10;
+
+    local $ENV{HARNESS_OPTIONS} = 'j4:c:fTAP-Formatter-HTML';
+
+    ok my $harness = TAP::Harness::Env->create, 'made harness';
+    is( $harness->color, 1, "set color correctly" );
+    is( $harness->jobs,  4, "set jobs correctly" );
+    is( $harness->formatter_class, "TAP::Formatter::HTML",
+        "correct formatter" );
+
+}
+SKIP: {
+    skip "requires TAP::Harness::Archive", 5
+      unless _has_module('TAP::Harness::Archive');
+
+    # Test archive
+    local $ENV{HARNESS_OPTIONS} = 'j4:c:a/archive.tgz';
+
+    ok my $harness = TAP::Harness::Env->create, 'made harness';
+    is( $harness->color, 1, "set color correctly" );
+    is( $harness->jobs,  4, "set jobs correctly" );
+    isa_ok( $harness, "TAP::Harness::Archive", "correct harness subclass" );
+
+    # XXX: this is nasty :(
+    is( $harness->{__archive_file}, "/archive.tgz", "correct archive found" );
+
+}
+
+{
+    local $ENV{HARNESS_TIMER} = 0;
+    ok my $harness = TAP::Harness::Env->create, 'made harness';
+    ok !$harness->timer, 'timer set via HARNESS_TIMER';
+}
+
+{
+    local $ENV{HARNESS_TIMER} = 1;
+    ok my $harness = TAP::Harness::Env->create, 'made harness';
+    ok $harness->timer, 'timer set via HARNESS_TIMER';
+}
index 4e16201..85cc233 100644 (file)
@@ -10,7 +10,7 @@ BEGIN {
 use strict;
 use warnings;
 
-use Test::More tests => 42;
+use Test::More tests => 44;
 
 use IO::File;
 use File::Spec;
@@ -124,6 +124,9 @@ my @sources = (
         handler  => 'TAP::Parser::SourceHandler::Handle',
         iterator => 'TAP::Parser::Iterator::Stream',
     },
+    {   file     => 'test.tap',
+        tie      => 1,
+    },
 );
 
 for my $test (@sources) {
@@ -141,10 +144,18 @@ for my $test (@sources) {
     my $source   = TAP::Parser::Source->new->raw( ref($raw) ? $raw : \$raw );
     my $iterator = eval { $sf->make_iterator($source) };
     my $error    = $@;
-    ok( !$error, "$name: no error on make_iterator" );
-    diag($error) if $error;
 
-    #    isa_ok( $iterator, $test->{iterator}, $name );
+    if( $test->{tie} ) {
+        like(
+            $error, qr{^There is a tie.*Both voted .* on $test->{file}}ms,
+            "$name: votes tied"
+        )
+    }
+    else {
+        ok( !$error, "$name: no error on make_iterator" );
+        diag($error) if $error;
+    }
+
     is( $sf->_last_handler, $test->{handler}, $name );
 }
 
index f8899a5..6cef9f1 100644 (file)
@@ -20,7 +20,7 @@ sub can_handle {
     my $class = shift;
     $class->SUPER::can_handle(@_);
     $CAN_HANDLE++;
-    return $class;
+    return 1;
 }
 
 sub make_iterator {
index 7e1388e..2daa375 100644 (file)
@@ -383,6 +383,85 @@ my %samples = (
         wait          => 0,
         version       => 12,
     },
+    space_after_plan_v13 => {
+        results => [
+            {   is_version => TRUE,
+                raw        => 'TAP version 13',
+            },
+            {   is_plan       => TRUE,
+                raw           => '1..5 ',
+                tests_planned => 5,
+                passed        => TRUE,
+                is_ok         => TRUE,
+            },
+            {   actual_passed => TRUE,
+                is_actual_ok  => TRUE,
+                passed        => TRUE,
+                is_ok         => TRUE,
+                is_test       => TRUE,
+                has_skip      => FALSE,
+                has_todo      => FALSE,
+                number        => 1,
+                description   => "",
+            },
+            {   actual_passed => TRUE,
+                is_actual_ok  => TRUE,
+                passed        => TRUE,
+                is_ok         => TRUE,
+                is_test       => TRUE,
+                has_skip      => FALSE,
+                has_todo      => FALSE,
+                number        => 2,
+                description   => "",
+            },
+            {   actual_passed => TRUE,
+                is_actual_ok  => TRUE,
+                passed        => TRUE,
+                is_ok         => TRUE,
+                is_test       => TRUE,
+                has_skip      => FALSE,
+                has_todo      => FALSE,
+                number        => 3,
+                description   => "",
+            },
+            {   actual_passed => TRUE,
+                is_actual_ok  => TRUE,
+                passed        => TRUE,
+                is_ok         => TRUE,
+                is_test       => TRUE,
+                has_skip      => FALSE,
+                has_todo      => FALSE,
+                number        => 4,
+                description   => "",
+            },
+            {   actual_passed => TRUE,
+                is_actual_ok  => TRUE,
+                passed        => TRUE,
+                is_ok         => TRUE,
+                is_test       => TRUE,
+                has_skip      => FALSE,
+                has_todo      => FALSE,
+                number        => 5,
+                description   => "",
+            },
+        ],
+        plan          => '1..5',
+        passed        => [ 1 .. 5 ],
+        actual_passed => [ 1 .. 5 ],
+        failed        => [],
+        actual_failed => [],
+        todo          => [],
+        todo_passed   => [],
+        skipped       => [],
+        good_plan     => TRUE,
+        is_good_plan  => TRUE,
+        tests_planned => 5,
+        tests_run     => 5,
+        parse_errors  => [],
+        'exit'        => 0,
+        wait          => 0,
+        version       => 13,
+    },
     simple_yaml => {
         results => [
             {   is_version => TRUE,
diff --git a/cpan/Test-Harness/t/sample-tests/space_after_plan_v13 b/cpan/Test-Harness/t/sample-tests/space_after_plan_v13
new file mode 100644 (file)
index 0000000..18bee2c
--- /dev/null
@@ -0,0 +1,4 @@
+# gforth TAP generates a space after the plan. Should probably be allowed.
+print "TAP version 13\n";
+print "1..5 \n";
+print "ok $_ \n" for 1..5;
diff --git a/cpan/Test-Harness/t/source_tests/test.tap b/cpan/Test-Harness/t/source_tests/test.tap
new file mode 100644 (file)
index 0000000..03fd894
--- /dev/null
@@ -0,0 +1,8 @@
+#!/usr/bin/perl
+
+# This looks equally like a TAP file and a Perl executable.
+
+print <<'END_TESTS';
+1..1
+ok 1 - source.pl
+END_TESTS