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