The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package t::Util;
use strict;
use warnings;
use utf8;
use parent qw/Exporter/;

use Test::More;
use File::Temp qw/ tempfile /;
use POSIX;
use TAP::Parser;

our @EXPORT = qw/run_test exit_status_is exit_status_isnt parse_tap/;

sub run_test {
    my $path = shift;

    local $ENV{HARNESS_ACTIVE} = 1;
    local $ENV{PERL_TEST_PRETTY_ENABLED} = 1;

    my ($tmp, $filename) = tempfile();
    close $tmp;

    my $pid = fork;
    die $! unless defined $pid;
    if ($pid) {
        waitpid($pid, 0);

        open my $fh, '<', $filename or die $!;
        my $out = do { local $/; <$fh> };
        close $fh;
        note 'x' x 80;
        note $out;
        note 'x' x 80;

        return $out;
    } else {
        # child
        open(STDOUT, ">", $filename) or die "Cannot redirect";
        open(STDERR, ">", $filename) or die "Cannot redirect";
        exec $^X, '-Ilib', '-MTest::Pretty', $path;
        die "Cannot exec";
    }
}

sub exit_status_is {
    my ($expected) = @_;

    if ($^O eq 'MSWin32') {
        is($?, $expected);
    } else {
        ok(POSIX::WIFEXITED($?));
        is(POSIX::WEXITSTATUS($?), $expected);
    }
}

sub exit_status_isnt {
    my ($expected) = @_;

    if ($^O eq 'MSWin32') {
        isnt($?, $expected);
    } else {
        ok(POSIX::WIFEXITED($?));
        isnt(POSIX::WEXITSTATUS($?), $expected);
    }
}

sub parse_tap {
    require Test::Pretty::Parser;
    my $tap = shift;
    my $parser = Test::Pretty::Parser->new({tap => $tap});
    1 while $parser->next;
    return $parser;
}

1;