xref: /openbsd-src/gnu/usr.bin/perl/cpan/CPAN-Meta-YAML/t/lib/SubtestCompat.pm (revision b8851fcc53cbe24fd20b090f26dd149e353f6174)
1*b8851fccSafresh1use 5.008001;
2*b8851fccSafresh1use strict;
3*b8851fccSafresh1use warnings;
4*b8851fccSafresh1
5*b8851fccSafresh1package SubtestCompat;
6*b8851fccSafresh1
7*b8851fccSafresh1# XXX must be used with no_plan or done_testing
8*b8851fccSafresh1use Test::More 0.88;
9*b8851fccSafresh1
10*b8851fccSafresh1use base 'Exporter';
11*b8851fccSafresh1our @EXPORT;
12*b8851fccSafresh1
13*b8851fccSafresh1our $INDENT = -2;
14*b8851fccSafresh1
15*b8851fccSafresh1# intercept 'skip_all' in subtest and turn into a regular skip
16*b8851fccSafresh1sub _fake_plan {
17*b8851fccSafresh1    my ( $self, $cmd, $arg ) = @_;
18*b8851fccSafresh1
19*b8851fccSafresh1    return unless $cmd;
20*b8851fccSafresh1
21*b8851fccSafresh1    if ( $cmd eq 'skip_all' ) {
22*b8851fccSafresh1        die bless { reason => $arg }, "Subtest::SKIP";
23*b8851fccSafresh1    }
24*b8851fccSafresh1    else {
25*b8851fccSafresh1        goto &Test::Builder::plan;
26*b8851fccSafresh1    }
27*b8851fccSafresh1}
28*b8851fccSafresh1
29*b8851fccSafresh1unless ( Test::More->can("subtest") ) {
30*b8851fccSafresh1    *subtest = sub {
31*b8851fccSafresh1        my ( $label, $code ) = @_;
32*b8851fccSafresh1        local $Test::Builder::Level = $Test::Builder::Level + 1;
33*b8851fccSafresh1
34*b8851fccSafresh1        local $INDENT = $INDENT + 2;
35*b8851fccSafresh1
36*b8851fccSafresh1        $label = "TEST: $label";
37*b8851fccSafresh1        my $sep_len = 60 - length($label);
38*b8851fccSafresh1
39*b8851fccSafresh1        note( " " x $INDENT . "$label { " . ( " " x ($sep_len-$INDENT-2) ) );
40*b8851fccSafresh1        eval {
41*b8851fccSafresh1            no warnings 'redefine';
42*b8851fccSafresh1            local *Test::Builder::plan = \&_fake_plan;
43*b8851fccSafresh1            # only want subtest error reporting to look up to the code ref
44*b8851fccSafresh1            # for where test was called, not further up to *our* callers,
45*b8851fccSafresh1            # so we *reset* the Level, rather than increment it
46*b8851fccSafresh1            local $Test::Builder::Level = 1;
47*b8851fccSafresh1            $code->();
48*b8851fccSafresh1        };
49*b8851fccSafresh1        if ( my $err = $@ ) {
50*b8851fccSafresh1            if ( ref($err) eq 'Subtest::SKIP' ) {
51*b8851fccSafresh1                SKIP: {
52*b8851fccSafresh1                    skip $err->{reason}, 1;
53*b8851fccSafresh1                }
54*b8851fccSafresh1            }
55*b8851fccSafresh1            else {
56*b8851fccSafresh1                fail("SUBTEST: $label");
57*b8851fccSafresh1                diag("Caught exception: $err");
58*b8851fccSafresh1                die "$err\n";
59*b8851fccSafresh1            }
60*b8851fccSafresh1        }
61*b8851fccSafresh1        note( " " x $INDENT . "}" );
62*b8851fccSafresh1    };
63*b8851fccSafresh1    push @EXPORT, 'subtest';
64*b8851fccSafresh1}
65*b8851fccSafresh1
66*b8851fccSafresh11;
67