From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!/usr/bin/perl -w
BEGIN {
push @INC, 't/lib';
}
use strict;
use Test::More 'no_plan';
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__";
my $IsVMS = $^O eq 'VMS';
my $IsWin32 = $^O eq 'MSWin32';
my $NoTaintSupport = exists($Config{taint_support}) && !$Config{taint_support};
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,
},
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,
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,
skip_if => sub {$NoTaintSupport},
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 { no warnings; 0 != shift },
TRUE, sub { no warnings; !!shift },
FALSE, sub { no warnings; !shift },
);
my $can_open3 = ( $Config{d_fork} || $IsWin32 ) ? 1 : 0;
for my $hide_fork ( 0 .. $can_open3 ) {
if ($hide_fork) {
no strict 'refs';
no warnings 'redefine';
*{'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 ) {
no warnings 'uninitialized';
$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/#/<hash>/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