#!/usr/bin/perl -w BEGIN { push @INC, 't/lib'; } use strict; use Test::More 'no_plan'; use File::Spec; use Config; use constant TRUE => "__TRUE__"; use constant FALSE => "__FALSE__"; # if wait() is non-zero, we cannot reliably predict its value use constant NOT_ZERO => "__NOT_ZERO__"; use TAP::Parser; my $IsVMS = $^O eq 'VMS'; my $IsWin32 = $^O eq 'MSWin32'; my $SAMPLE_TESTS = File::Spec->catdir( File::Spec->curdir, 't', 'sample-tests' ); my %deprecated = map { $_ => 1 } qw( TAP::Parser::good_plan TAP::Parser::Result::Plan::passed TAP::Parser::Result::Test::passed TAP::Parser::Result::Test::actual_passed TAP::Parser::Result::passed ); $SIG{__WARN__} = sub { if ( $_[0] =~ /is deprecated/ ) { my @caller = caller(1); my $sub = $caller[3]; ok exists $deprecated{$sub}, "... we should get a deprecated warning for $sub"; } else { CORE::warn @_; } }; # the %samples keys are the names of test scripts in t/sample-tests my %samples = ( descriptive => { results => [ { is_plan => TRUE, raw => '1..5', tests_planned => 5, passed => TRUE, is_ok => TRUE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => "Interlock activated", passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => "Megathrusters are go", is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => "Head formed", is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => "Blazing sword formed", is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 5, description => "Robeast destroyed", is_unplanned => FALSE, } ], 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 => 12, }, descriptive_trailing => { results => [ { actual_passed => TRUE, is_actual_ok => TRUE, description => "Interlock activated", passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => "Megathrusters are go", is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => "Head formed", is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => "Blazing sword formed", is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 5, description => "Robeast destroyed", is_unplanned => FALSE, }, { is_plan => TRUE, raw => '1..5', tests_planned => 5, passed => TRUE, is_ok => TRUE, }, ], 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 => 12, }, empty => { results => [], plan => '', passed => [], actual_passed => [], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => FALSE, is_good_plan => FALSE, tests_planned => undef, tests_run => 0, parse_errors => ['No plan found in TAP output'], 'exit' => 0, wait => 0, version => 12, }, simple => { results => [ { 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 => 12, }, space_after_plan => { results => [ { 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 => 12, }, simple_yaml => { 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 => "", }, { is_yaml => TRUE, data => [ { 'fnurk' => 'skib', 'ponk' => 'gleeb' }, { 'bar' => 'krup', 'foo' => 'plink' } ], raw => " ---\n -\n fnurk: skib\n ponk: gleeb\n -\n bar: krup\n foo: plink\n ...", }, { 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 => "", }, { is_yaml => TRUE, data => { 'got' => [ '1', 'pong', '4' ], 'expected' => [ '1', '2', '4' ] }, raw => " ---\n expected:\n - 1\n - 2\n - 4\n got:\n - 1\n - pong\n - 4\n ...", }, { 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_fail => { results => [ { 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 => FALSE, is_actual_ok => FALSE, passed => FALSE, is_ok => FALSE, 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 => FALSE, is_actual_ok => FALSE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 5, description => "", }, ], plan => '1..5', passed => [ 1, 3, 4 ], actual_passed => [ 1, 3, 4 ], failed => [ 2, 5 ], actual_failed => [ 2, 5 ], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 5, tests_run => 5, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, skip => { results => [ { 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 => TRUE, has_todo => FALSE, number => 2, description => "", explanation => 'rain delay', }, { 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 => [2], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 5, tests_run => 5, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, skip_nomsg => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..1', tests_planned => 1, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => TRUE, has_todo => FALSE, number => 1, description => "", explanation => '', }, ], plan => '1..1', passed => [1], actual_passed => [1], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [1], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 1, tests_run => TRUE, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, todo_inline => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..3', tests_planned => 3, }, { actual_passed => FALSE, is_actual_ok => FALSE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => TRUE, number => 1, description => "- Foo", explanation => 'Just testing the todo interface.', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => TRUE, number => 2, description => "- Unexpected success", explanation => 'Just testing the todo interface.', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => "- This is not todo", explanation => '', }, ], plan => '1..3', passed => [ 1, 2, 3 ], actual_passed => [ 2, 3 ], failed => [], actual_failed => [1], todo => [ 1, 2 ], todo_passed => [2], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 3, tests_run => 3, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, todo => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..5 todo 3 2;', tests_planned => 5, todo_list => [ 3, 2 ], }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => "", explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => TRUE, number => 2, description => "", explanation => '', }, { actual_passed => FALSE, is_actual_ok => FALSE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => TRUE, number => 3, description => "", explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => "", explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 5, description => "", explanation => '', }, ], plan => '1..5', passed => [ 1, 2, 3, 4, 5 ], actual_passed => [ 1, 2, 4, 5 ], failed => [], actual_failed => [3], todo => [ 2, 3 ], todo_passed => [2], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 5, tests_run => 5, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, duplicates => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..10', tests_planned => 10, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 5, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 6, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 7, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 8, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 9, description => '', explanation => '', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 10, description => '', explanation => '', is_unplanned => TRUE, }, ], plan => '1..10', passed => [ 1 .. 4, 4 .. 9 ], actual_passed => [ 1 .. 4, 4 .. 10 ], failed => [10], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => FALSE, tests_planned => 10, tests_run => 11, parse_errors => [ 'Tests out of sequence. Found (4) but expected (5)', 'Tests out of sequence. Found (5) but expected (6)', 'Tests out of sequence. Found (6) but expected (7)', 'Tests out of sequence. Found (7) but expected (8)', 'Tests out of sequence. Found (8) but expected (9)', 'Tests out of sequence. Found (9) but expected (10)', 'Tests out of sequence. Found (10) but expected (11)', 'Bad plan. You planned 10 tests but ran 11.', ], 'exit' => 0, wait => 0, }, no_nums => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..5', tests_planned => 5, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => "", passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, }, { 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 => FALSE, is_actual_ok => FALSE, passed => FALSE, is_ok => FALSE, 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, 2, 4, 5 ], actual_passed => [ 1, 2, 4, 5 ], failed => [3], actual_failed => [3], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 5, tests_run => 5, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, bailout => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..5', tests_planned => 5, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => "", passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, }, { 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 => "", }, { is_bailout => TRUE, explanation => "GERONIMMMOOOOOO!!!", }, { 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 => 12, }, no_output => { results => [], plan => '', passed => [], actual_passed => [], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => FALSE, tests_planned => undef, tests_run => 0, parse_errors => [ 'No plan found in TAP output', ], 'exit' => 0, wait => 0, }, too_many => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..3', tests_planned => 3, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => "", passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => "", is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => "", is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => "", is_unplanned => TRUE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 5, description => "", is_unplanned => TRUE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 6, description => "", is_unplanned => TRUE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 7, description => "", is_unplanned => TRUE, }, ], plan => '1..3', passed => [ 1 .. 3 ], actual_passed => [ 1 .. 7 ], failed => [ 4 .. 7 ], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => FALSE, tests_planned => 3, tests_run => 7, parse_errors => ['Bad plan. You planned 3 tests but ran 7.'], 'exit' => 4, wait => NOT_ZERO, skip_if => sub {$IsVMS}, }, taint => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..1', tests_planned => TRUE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => "- -T honored", passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, }, ], plan => '1..1', passed => [ 1 .. 1 ], actual_passed => [ 1 .. 1 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => TRUE, tests_run => TRUE, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, 'die' => { results => [], plan => '', passed => [], actual_passed => [], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => FALSE, tests_planned => undef, tests_run => 0, parse_errors => [ 'No plan found in TAP output', ], 'exit' => NOT_ZERO, wait => NOT_ZERO, }, die_head_end => { results => [ { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => '', explanation => '', }, ], plan => '', passed => [ 1 .. 4 ], actual_passed => [ 1 .. 4 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => FALSE, tests_planned => undef, tests_run => 4, parse_errors => [ 'No plan found in TAP output', ], 'exit' => NOT_ZERO, wait => NOT_ZERO, }, die_last_minute => { results => [ { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => '', explanation => '', }, { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..4', tests_planned => 4, }, ], plan => '1..4', passed => [ 1 .. 4 ], actual_passed => [ 1 .. 4 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 4, tests_run => 4, parse_errors => [], 'exit' => NOT_ZERO, wait => NOT_ZERO, }, bignum => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..2', tests_planned => 2, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 136211425, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 136211426, description => '', explanation => '', }, ], plan => '1..2', passed => [ 1, 2 ], actual_passed => [ 1, 2, 136211425, 136211426 ], failed => [ 136211425, 136211426 ], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => FALSE, tests_planned => 2, tests_run => 4, parse_errors => [ 'Tests out of sequence. Found (136211425) but expected (3)', 'Tests out of sequence. Found (136211426) but expected (4)', 'Bad plan. You planned 2 tests but ran 4.' ], 'exit' => 0, wait => 0, }, bignum_many => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..2', tests_planned => 2, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 99997, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 99998, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 99999, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 100000, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 100001, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 100002, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 100003, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 100004, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 100005, description => '', explanation => '', }, ], plan => '1..2', passed => [ 1, 2 ], actual_passed => [ 1, 2, 99997 .. 100005 ], failed => [ 99997 .. 100005 ], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => FALSE, tests_planned => 2, tests_run => 11, parse_errors => [ 'Tests out of sequence. Found (99997) but expected (3)', 'Tests out of sequence. Found (99998) but expected (4)', 'Tests out of sequence. Found (99999) but expected (5)', 'Tests out of sequence. Found (100000) but expected (6)', 'Tests out of sequence. Found (100001) but expected (7)', 'Tests out of sequence. Found (100002) but expected (8)', 'Tests out of sequence. Found (100003) but expected (9)', 'Tests out of sequence. Found (100004) but expected (10)', 'Tests out of sequence. Found (100005) but expected (11)', 'Bad plan. You planned 2 tests but ran 11.' ], 'exit' => 0, wait => 0, }, combined => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..10', tests_planned => 10, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => 'basset hounds got long ears', explanation => '', }, { actual_passed => FALSE, is_actual_ok => FALSE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => 'all hell broke loose', explanation => '', }, { actual_passed => FALSE, is_actual_ok => FALSE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => TRUE, number => 4, description => '', explanation => 'if I heard a voice from heaven ...', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 5, description => 'say "live without loving",', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 6, description => "I'd beg off.", explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => '1', has_todo => FALSE, number => 7, description => '', explanation => 'contract negotiations', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 8, description => 'Girls are such exquisite hell', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => TRUE, number => 9, description => 'Elegy 9B', explanation => '', }, { actual_passed => FALSE, is_actual_ok => FALSE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 10, description => '', explanation => '', }, ], plan => '1..10', passed => [ 1 .. 2, 4 .. 9 ], actual_passed => [ 1 .. 2, 5 .. 9 ], failed => [ 3, 10 ], actual_failed => [ 3, 4, 10 ], todo => [ 4, 9 ], todo_passed => [9], skipped => [7], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 10, tests_run => 10, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, head_end => { results => [ { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'comments', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => '', explanation => '', }, { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'comment', }, { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..4', tests_planned => 4, }, { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'more ignored stuff', }, { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'and yet more', }, ], plan => '1..4', passed => [ 1 .. 4 ], actual_passed => [ 1 .. 4 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 4, tests_run => 4, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, head_fail => { results => [ { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'comments', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', }, { actual_passed => FALSE, is_actual_ok => FALSE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => '', explanation => '', }, { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'comment', }, { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..4', tests_planned => 4, }, { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'more ignored stuff', }, { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'and yet more', }, ], plan => '1..4', passed => [ 1, 3, 4 ], actual_passed => [ 1, 3, 4 ], failed => [2], actual_failed => [2], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 4, tests_run => 4, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, out_of_order => { results => [ { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => '- Test that argument passing works', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => '- Test that passing arguments as references work', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => '- Test a normal sub', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 6, description => '- Detach test', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 8, description => '- Nested thread test', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 9, description => '- Nested thread test', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 10, description => '- Wanted 7, got 7', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 11, description => '- Wanted 7, got 7', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 12, description => '- Wanted 8, got 8', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 13, description => '- Wanted 8, got 8', explanation => '', }, { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..15', tests_planned => 15, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 5, description => '- Check that Config::threads is true', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 7, description => '- Detach test', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 14, description => '- Check so that tid for threads work for main thread', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 15, description => '- Check so that tid for threads work for main thread', explanation => '', }, ], plan => '1..15', passed => [ 2 .. 4, 6, 8 .. 13, 1, 5, 7, 14, 15 ], actual_passed => [ 2 .. 4, 6, 8 .. 13, 1, 5, 7, 14, 15 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], is_good_plan => FALSE, tests_planned => 15, tests_run => 15, # Note that tests 14 and 15 *are* in the correct sequence. parse_errors => [ 'Tests out of sequence. Found (2) but expected (1)', 'Tests out of sequence. Found (3) but expected (2)', 'Tests out of sequence. Found (4) but expected (3)', 'Tests out of sequence. Found (6) but expected (4)', 'Tests out of sequence. Found (8) but expected (5)', 'Tests out of sequence. Found (9) but expected (6)', 'Tests out of sequence. Found (10) but expected (7)', 'Tests out of sequence. Found (11) but expected (8)', 'Tests out of sequence. Found (12) but expected (9)', 'Tests out of sequence. Found (13) but expected (10)', 'Plan (1..15) must be at the beginning or end of the TAP output', 'Tests out of sequence. Found (1) but expected (11)', 'Tests out of sequence. Found (5) but expected (12)', 'Tests out of sequence. Found (7) but expected (13)', ], 'exit' => 0, wait => 0, }, skipall => { results => [ { is_plan => TRUE, raw => '1..0 # skipping: rope', tests_planned => 0, passed => TRUE, is_ok => TRUE, directive => 'SKIP', explanation => 'rope' }, ], plan => '1..0', passed => [], actual_passed => [], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 0, tests_run => 0, parse_errors => [], 'exit' => 0, wait => 0, version => 12, skip_all => 'rope', }, skipall_v13 => { results => [ { is_version => TRUE, raw => 'TAP version 13', }, { is_unknown => TRUE, raw => '1..0 # skipping: rope', }, ], plan => '', passed => [], actual_passed => [], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => FALSE, is_good_plan => FALSE, tests_planned => FALSE, tests_run => 0, parse_errors => ['No plan found in TAP output'], 'exit' => 0, wait => 0, version => 13, }, strict => { results => [ { is_version => TRUE, raw => 'TAP version 13', }, { is_plan => TRUE, raw => '1..1', }, { is_pragma => TRUE, raw => 'pragma +strict', pragmas => ['+strict'], }, { is_unknown => TRUE, raw => 'Nonsense!', }, { is_pragma => TRUE, raw => 'pragma -strict', pragmas => ['-strict'], }, { is_unknown => TRUE, raw => "Doesn't matter.", }, { is_test => TRUE, raw => 'ok 1 All OK', } ], plan => '1..1', passed => [1], actual_passed => [1], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 1, tests_run => 1, parse_errors => ['Unknown TAP token: "Nonsense!"'], 'exit' => 0, # TODO: Is this right??? wait => 0, version => 13, }, skipall_nomsg => { results => [ { is_plan => TRUE, raw => '1..0', tests_planned => 0, passed => TRUE, is_ok => TRUE, directive => 'SKIP', explanation => '' }, ], plan => '1..0', passed => [], actual_passed => [], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 0, tests_run => 0, parse_errors => [], 'exit' => 0, wait => 0, version => 12, skip_all => '(no reason given)', }, todo_misparse => { results => [ { is_plan => TRUE, raw => '1..1', tests_planned => TRUE, passed => TRUE, is_ok => TRUE, }, { actual_passed => FALSE, is_actual_ok => FALSE, passed => FALSE, is_ok => FALSE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => 'Hamlette # TODOORNOTTODO', explanation => '', }, ], plan => '1..1', passed => [], actual_passed => [], failed => [1], actual_failed => [1], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => TRUE, tests_run => 1, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, shbang_misparse => { results => [ { is_plan => TRUE, raw => '1..2', tests_planned => 2, passed => TRUE, is_ok => TRUE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => "", passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => "", }, ], plan => '1..2', passed => [ 1 .. 2 ], actual_passed => [ 1 .. 2 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 2, tests_run => 2, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, switches => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..1', tests_planned => 1, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => "", explanation => '', }, ], __ARGS__ => { switches => ['-Mstrict'] }, plan => '1..1', passed => [1], actual_passed => [1], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 1, tests_run => TRUE, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, inc_taint => { results => [ { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..1', tests_planned => 1, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => "", explanation => '', }, ], __ARGS__ => { switches => ['-Iexamples'] }, plan => '1..1', passed => [1], actual_passed => [1], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 1, tests_run => TRUE, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, sequence_misparse => { results => [ { 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 => "\# skipped on foobar system", }, { is_comment => TRUE, comment => '1234567890123456789012345678901234567890', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => "", }, { is_comment => TRUE, comment => '1234567890123456789012345678901234567890', }, { 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 => 12, }, # For some reason mixing stdout with stderr is unreliable on Windows ( $IsWin32 ? () : ( stdout_stderr => { results => [ { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'comments', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => '', explanation => '', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => '', explanation => '', }, { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'comment', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 4, description => '', explanation => '', }, { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'more ignored stuff', }, { is_comment => TRUE, passed => TRUE, is_ok => TRUE, comment => 'and yet more', }, { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..4', tests_planned => 4, }, ], plan => '1..4', passed => [ 1 .. 4 ], actual_passed => [ 1 .. 4 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 4, tests_run => 4, parse_errors => [], 'exit' => 0, wait => 0, version => 12, need_open3 => 1, } ) ), junk_before_plan => { results => [ { is_unknown => TRUE, raw => 'this is junk', }, { is_comment => TRUE, comment => "this is a comment", }, { is_plan => TRUE, passed => TRUE, is_ok => TRUE, raw => '1..1', tests_planned => 1, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, }, ], plan => '1..1', passed => [ 1 .. 1 ], actual_passed => [ 1 .. 1 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 1, tests_run => 1, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, version_good => { 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, }, version_old => { results => [ { is_version => TRUE, raw => 'TAP version 12', }, { 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 => ['Explicit TAP version must be at least 13. Got version 12'], 'exit' => 0, wait => 0, version => 12, }, version_late => { results => [ { is_plan => TRUE, raw => '1..5', tests_planned => 5, passed => TRUE, is_ok => TRUE, }, { is_version => TRUE, raw => 'TAP version 13', }, { 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 => ['If TAP version is present it must be the first line of output'], 'exit' => 0, wait => 0, version => 12, }, escape_eol => { results => [ { is_plan => TRUE, raw => '1..2', tests_planned => 2, passed => TRUE, is_ok => TRUE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => 'Should parse as literal backslash --> \\', passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => 'Not a continuation line', is_unplanned => FALSE, }, ], plan => '1..2', passed => [ 1 .. 2 ], actual_passed => [ 1 .. 2 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 2, tests_run => 2, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, escape_hash => { results => [ { is_plan => TRUE, raw => '1..3', tests_planned => 3, passed => TRUE, is_ok => TRUE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => 'Not a \\# TODO', passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => 'Not a \\# SKIP', is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => 'Escaped \\\\\\#', is_unplanned => FALSE, }, ], plan => '1..3', passed => [ 1 .. 3 ], actual_passed => [ 1 .. 3 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 3, tests_run => 3, parse_errors => [], 'exit' => 0, wait => 0, version => 12, }, zero_valid => { results => [ { is_plan => TRUE, raw => '1..5', tests_planned => 5, passed => TRUE, is_ok => TRUE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => '- One', passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => '- Two', passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => '- Three', passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => '- Four', passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 0, is_unplanned => FALSE, }, { actual_passed => TRUE, is_actual_ok => TRUE, description => '- Five', passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 5, is_unplanned => FALSE, }, ], plan => '1..5', passed => [ 1 .. 3, 0, 5 ], actual_passed => [ 1 .. 3, 0, 5 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 5, tests_run => 5, parse_errors => [ 'Tests out of sequence. Found (0) but expected (4)', ], 'exit' => 0, wait => 0, version => 12, }, yaml_late_plan => { results => [ { is_version => TRUE, raw => 'TAP version 13', }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 1, description => "- test suite started", }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 2, description => "- bogomips", }, { is_yaml => TRUE, data => { 'Bogomips' => '5226.88' }, raw => " ---\n Bogomips: 5226.88\n ...", }, { actual_passed => TRUE, is_actual_ok => TRUE, passed => TRUE, is_ok => TRUE, is_test => TRUE, has_skip => FALSE, has_todo => FALSE, number => 3, description => "- test suite finished", }, { is_plan => TRUE, raw => '1..3', tests_planned => 3, passed => TRUE, is_ok => TRUE, }, ], plan => '1..3', passed => [ 1 .. 3 ], actual_passed => [ 1 .. 3 ], failed => [], actual_failed => [], todo => [], todo_passed => [], skipped => [], good_plan => TRUE, is_good_plan => TRUE, tests_planned => 3, tests_run => 3, parse_errors => [], 'exit' => 0, wait => 0, version => 13, }, ); my %HANDLER_FOR = ( NOT_ZERO, sub { local $^W; 0 != shift }, TRUE, sub { local $^W; !!shift }, FALSE, sub { local $^W; !shift }, ); my $can_open3 = ( $Config{d_fork} || $IsWin32 ) ? 1 : 0; for my $hide_fork ( 0 .. $can_open3 ) { if ($hide_fork) { no strict 'refs'; local $^W = 0; *{'TAP::Parser::Iterator::Process::_use_open3'} = sub {return}; } TEST: for my $test ( sort keys %samples ) { #next unless 'empty' eq $test; my %details = %{ $samples{$test} }; if ( my $skip_if = delete $details{skip_if} ) { next TEST if $skip_if->(); } my $results = delete $details{results}; my $args = delete $details{__ARGS__}; my $need_open3 = delete $details{need_open3}; next TEST if $need_open3 && ( $hide_fork || !$can_open3 ); # the following acrobatics are necessary to make it easy for the # Test::Builder::failure_output() method to be overridden when # TAP::Parser is not installed. Otherwise, these tests will fail. unshift @{ $args->{switches} }, $ENV{PERL_CORE} ? ( map {"-I$_"} @INC ) : ('-It/lib'); $args->{source} = File::Spec->catfile( $SAMPLE_TESTS, $test ); $args->{merge} = !$hide_fork; my $parser = eval { analyze_test( $test, [@$results], $args ) }; my $error = $@; ok !$error, "'$test' should parse successfully" or diag $error; if ($error) { my $tests = 0; while ( my ( $method, $answer ) = each %details ) { $tests += ref $answer ? 2 : 1; } SKIP: { skip "$test did not parse successfully", $tests; } } else { while ( my ( $method, $answer ) = each %details ) { if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck ok $handler->( $parser->$method() ), "... and $method should return a reasonable value ($test)"; } elsif ( !ref $answer ) { local $^W; # uninit warnings $answer = _vmsify_answer( $method, $answer ); is $parser->$method(), $answer, "... and $method should equal $answer ($test)"; } else { is scalar $parser->$method(), scalar @$answer, "... and $method should be the correct amount ($test)"; is_deeply [ $parser->$method() ], $answer, "... and $method should be the correct values ($test)"; } } } } } my %Unix2VMS_Exit_Codes = ( 1 => 4, ); sub _vmsify_answer { my ( $method, $answer ) = @_; return $answer unless $IsVMS; if ( $method eq 'exit' and exists $Unix2VMS_Exit_Codes{$answer} ) { $answer = $Unix2VMS_Exit_Codes{$answer}; } return $answer; } sub analyze_test { my ( $test, $results, $args ) = @_; my $parser = TAP::Parser->new($args); my $count = 1; while ( defined( my $result = $parser->next ) ) { my $expected = shift @$results; my $desc = $result->is_test ? $result->description : $result->raw; $desc = $result->plan if $result->is_plan && $desc =~ /SKIP/i; $desc =~ s/#//g; $desc =~ s/\s+/ /g; # Drop newlines ok defined $expected, "$test/$count We should have a result for $desc"; while ( my ( $method, $answer ) = each %$expected ) { if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck ok $handler->( $result->$method() ), "... and $method should return a reasonable value ($test/$count)"; } elsif ( ref $answer ) { is_deeply scalar( $result->$method() ), $answer, "... and $method should return the correct structure ($test/$count)"; } else { is $result->$method(), $answer, "... and $method should return the correct answer ($test/$count)"; } } $count++; } is @$results, 0, "... and we should have the correct number of results ($test)"; return $parser; } # vms_nit