#!/usr/bin/perl -w

BEGIN {
    push @INC, 't/lib';
}

use strict;
use warnings;

use Test::More 'no_plan';

use File::Spec;
use Config;

use constant TRUE  => "__TRUE__";
use constant FALSE => "__FALSE__";

# if wait() is non-zero, we cannot reliably predict its value
use constant NOT_ZERO => "__NOT_ZERO__";

use TAP::Parser;

my $IsVMS          = $^O eq 'VMS';
my $IsWin32        = $^O eq 'MSWin32';
my $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
