#!/usr/bin/perl -w
unshift @INC, 't/lib';
use strict;
#use Test::More tests => 2567;
use Test::More 'no_plan';
use File::Spec;
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 $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,
},
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,
},
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,
},
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,
},
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' => 1,
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' => 1,
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' => 1,
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 # skip: 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,
},
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,
},
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 => '-Iwe_added_this_lib', },
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,
},
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,
},
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,
},
);
my %HANDLER_FOR = (
NOT_ZERO, sub { local $^W; 0 != shift },
TRUE, sub { local $^W; !!shift },
FALSE, sub { local $^W; !shift },
);
foreach my $test ( sort keys %samples ) {
#next unless 'duplicates' eq $test;
my $details = $samples{$test};
my $results = delete $details->{results};
my $args = delete $details->{__ARGS__} || { switches => '' };
# 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.
my @switches
= 'ARRAY' eq ref $args->{switches}
? @{ $args->{switches} }
: $args->{switches};
$args->{switches} = [ '-Ilib', @switches ];
$args->{source} = File::Spec->catfile( $SAMPLE_TESTS, $test );
$args->{merge} = 1;
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
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 the correct values ($test)";
}
}
}
}
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";
$count++;
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)";
}
elsif ( ref $answer ) {
is_deeply $result->$method(), $answer,
"... and $method should return the correct answer ($test)";
}
else {
is $result->$method(), $answer,
"... and $method should return the correct answer ($test)";
}
}
}
ok !@$results,
"... and we should have the correct number of results ($test)";
return $parser;
}
# vms_nit