1*5759b3d2Safresh1#!/usr/bin/perl -w 2*5759b3d2Safresh1 3*5759b3d2Safresh1# Test the use of subtest() to define new test predicates that combine 4*5759b3d2Safresh1# multiple existing predicates. 5*5759b3d2Safresh1 6*5759b3d2Safresh1BEGIN { 7*5759b3d2Safresh1 if( $ENV{PERL_CORE} ) { 8*5759b3d2Safresh1 chdir 't'; 9*5759b3d2Safresh1 @INC = ( '../lib', 'lib' ); 10*5759b3d2Safresh1 } 11*5759b3d2Safresh1 else { 12*5759b3d2Safresh1 unshift @INC, 't/lib'; 13*5759b3d2Safresh1 } 14*5759b3d2Safresh1} 15*5759b3d2Safresh1 16*5759b3d2Safresh1use strict; 17*5759b3d2Safresh1use warnings; 18*5759b3d2Safresh1 19*5759b3d2Safresh1use Test::More tests => 5; 20*5759b3d2Safresh1use Test::Builder; 21*5759b3d2Safresh1use Test::Builder::Tester; 22*5759b3d2Safresh1 23*5759b3d2Safresh1# Formatting may change if we're running under Test::Harness. 24*5759b3d2Safresh1$ENV{HARNESS_ACTIVE} = 0; 25*5759b3d2Safresh1 26*5759b3d2Safresh1our %line; 27*5759b3d2Safresh1 28*5759b3d2Safresh1# Define a new test predicate with Test::More::subtest(), using 29*5759b3d2Safresh1# Test::More predicates as building blocks... 30*5759b3d2Safresh1 31*5759b3d2Safresh1sub foobar_ok ($;$) { 32*5759b3d2Safresh1 my ($value, $name) = @_; 33*5759b3d2Safresh1 $name ||= "foobar_ok"; 34*5759b3d2Safresh1 35*5759b3d2Safresh1 local $Test::Builder::Level = $Test::Builder::Level + 1; 36*5759b3d2Safresh1 subtest $name => sub { 37*5759b3d2Safresh1 plan tests => 2; 38*5759b3d2Safresh1 ok $value =~ /foo/, "foo"; 39*5759b3d2Safresh1 ok $value =~ /bar/, "bar"; BEGIN{ $line{foobar_ok_bar} = __LINE__ } 40*5759b3d2Safresh1 }; 41*5759b3d2Safresh1} 42*5759b3d2Safresh1{ 43*5759b3d2Safresh1 test_out("# Subtest: namehere"); 44*5759b3d2Safresh1 test_out(" 1..2"); 45*5759b3d2Safresh1 test_out(" ok 1 - foo"); 46*5759b3d2Safresh1 test_out(" not ok 2 - bar"); 47*5759b3d2Safresh1 test_err(" # Failed test 'bar'"); 48*5759b3d2Safresh1 test_err(" # at $0 line $line{foobar_ok_bar}."); 49*5759b3d2Safresh1 test_err(" # Looks like you failed 1 test of 2."); 50*5759b3d2Safresh1 test_out("not ok 1 - namehere"); 51*5759b3d2Safresh1 test_err("# Failed test 'namehere'"); 52*5759b3d2Safresh1 test_err("# at $0 line ".(__LINE__+2)."."); 53*5759b3d2Safresh1 54*5759b3d2Safresh1 foobar_ok "foot", "namehere"; 55*5759b3d2Safresh1 56*5759b3d2Safresh1 test_test("foobar_ok failing line numbers"); 57*5759b3d2Safresh1} 58*5759b3d2Safresh1 59*5759b3d2Safresh1# Wrap foobar_ok() to make another new predicate... 60*5759b3d2Safresh1 61*5759b3d2Safresh1sub foobar_ok_2 ($;$) { 62*5759b3d2Safresh1 my ($value, $name) = @_; 63*5759b3d2Safresh1 64*5759b3d2Safresh1 local $Test::Builder::Level = $Test::Builder::Level + 1; 65*5759b3d2Safresh1 foobar_ok($value, $name); 66*5759b3d2Safresh1} 67*5759b3d2Safresh1{ 68*5759b3d2Safresh1 test_out("# Subtest: namehere"); 69*5759b3d2Safresh1 test_out(" 1..2"); 70*5759b3d2Safresh1 test_out(" ok 1 - foo"); 71*5759b3d2Safresh1 test_out(" not ok 2 - bar"); 72*5759b3d2Safresh1 test_err(" # Failed test 'bar'"); 73*5759b3d2Safresh1 test_err(" # at $0 line $line{foobar_ok_bar}."); 74*5759b3d2Safresh1 test_err(" # Looks like you failed 1 test of 2."); 75*5759b3d2Safresh1 test_out("not ok 1 - namehere"); 76*5759b3d2Safresh1 test_err("# Failed test 'namehere'"); 77*5759b3d2Safresh1 test_err("# at $0 line ".(__LINE__+2)."."); 78*5759b3d2Safresh1 79*5759b3d2Safresh1 foobar_ok_2 "foot", "namehere"; 80*5759b3d2Safresh1 81*5759b3d2Safresh1 test_test("foobar_ok_2 failing line numbers"); 82*5759b3d2Safresh1} 83*5759b3d2Safresh1 84*5759b3d2Safresh1# Define another new test predicate, this time using 85*5759b3d2Safresh1# Test::Builder::subtest() rather than Test::More::subtest()... 86*5759b3d2Safresh1 87*5759b3d2Safresh1sub barfoo_ok ($;$) { 88*5759b3d2Safresh1 my ($value, $name) = @_; 89*5759b3d2Safresh1 $name ||= "barfoo_ok"; 90*5759b3d2Safresh1 91*5759b3d2Safresh1 Test::Builder->new->subtest($name => sub { 92*5759b3d2Safresh1 plan tests => 2; 93*5759b3d2Safresh1 ok $value =~ /foo/, "foo"; 94*5759b3d2Safresh1 ok $value =~ /bar/, "bar"; BEGIN{ $line{barfoo_ok_bar} = __LINE__ } 95*5759b3d2Safresh1 }); 96*5759b3d2Safresh1} 97*5759b3d2Safresh1{ 98*5759b3d2Safresh1 test_out("# Subtest: namehere"); 99*5759b3d2Safresh1 test_out(" 1..2"); 100*5759b3d2Safresh1 test_out(" ok 1 - foo"); 101*5759b3d2Safresh1 test_out(" not ok 2 - bar"); 102*5759b3d2Safresh1 test_err(" # Failed test 'bar'"); 103*5759b3d2Safresh1 test_err(" # at $0 line $line{barfoo_ok_bar}."); 104*5759b3d2Safresh1 test_err(" # Looks like you failed 1 test of 2."); 105*5759b3d2Safresh1 test_out("not ok 1 - namehere"); 106*5759b3d2Safresh1 test_err("# Failed test 'namehere'"); 107*5759b3d2Safresh1 test_err("# at $0 line ".(__LINE__+2)."."); 108*5759b3d2Safresh1 109*5759b3d2Safresh1 barfoo_ok "foot", "namehere"; 110*5759b3d2Safresh1 111*5759b3d2Safresh1 test_test("barfoo_ok failing line numbers"); 112*5759b3d2Safresh1} 113*5759b3d2Safresh1 114*5759b3d2Safresh1# Wrap barfoo_ok() to make another new predicate... 115*5759b3d2Safresh1 116*5759b3d2Safresh1sub barfoo_ok_2 ($;$) { 117*5759b3d2Safresh1 my ($value, $name) = @_; 118*5759b3d2Safresh1 119*5759b3d2Safresh1 local $Test::Builder::Level = $Test::Builder::Level + 1; 120*5759b3d2Safresh1 barfoo_ok($value, $name); 121*5759b3d2Safresh1} 122*5759b3d2Safresh1{ 123*5759b3d2Safresh1 test_out("# Subtest: namehere"); 124*5759b3d2Safresh1 test_out(" 1..2"); 125*5759b3d2Safresh1 test_out(" ok 1 - foo"); 126*5759b3d2Safresh1 test_out(" not ok 2 - bar"); 127*5759b3d2Safresh1 test_err(" # Failed test 'bar'"); 128*5759b3d2Safresh1 test_err(" # at $0 line $line{barfoo_ok_bar}."); 129*5759b3d2Safresh1 test_err(" # Looks like you failed 1 test of 2."); 130*5759b3d2Safresh1 test_out("not ok 1 - namehere"); 131*5759b3d2Safresh1 test_err("# Failed test 'namehere'"); 132*5759b3d2Safresh1 test_err("# at $0 line ".(__LINE__+2)."."); 133*5759b3d2Safresh1 134*5759b3d2Safresh1 barfoo_ok_2 "foot", "namehere"; 135*5759b3d2Safresh1 136*5759b3d2Safresh1 test_test("barfoo_ok_2 failing line numbers"); 137*5759b3d2Safresh1} 138*5759b3d2Safresh1 139*5759b3d2Safresh1# A subtest-based predicate called from within a subtest 140*5759b3d2Safresh1{ 141*5759b3d2Safresh1 test_out("# Subtest: outergroup"); 142*5759b3d2Safresh1 test_out(" 1..2"); 143*5759b3d2Safresh1 test_out(" ok 1 - this passes"); 144*5759b3d2Safresh1 test_out(" # Subtest: namehere"); 145*5759b3d2Safresh1 test_out(" 1..2"); 146*5759b3d2Safresh1 test_out(" ok 1 - foo"); 147*5759b3d2Safresh1 test_out(" not ok 2 - bar"); 148*5759b3d2Safresh1 test_err(" # Failed test 'bar'"); 149*5759b3d2Safresh1 test_err(" # at $0 line $line{barfoo_ok_bar}."); 150*5759b3d2Safresh1 test_err(" # Looks like you failed 1 test of 2."); 151*5759b3d2Safresh1 test_out(" not ok 2 - namehere"); 152*5759b3d2Safresh1 test_err(" # Failed test 'namehere'"); 153*5759b3d2Safresh1 test_err(" # at $0 line $line{ipredcall}."); 154*5759b3d2Safresh1 test_err(" # Looks like you failed 1 test of 2."); 155*5759b3d2Safresh1 test_out("not ok 1 - outergroup"); 156*5759b3d2Safresh1 test_err("# Failed test 'outergroup'"); 157*5759b3d2Safresh1 test_err("# at $0 line $line{outercall}."); 158*5759b3d2Safresh1 159*5759b3d2Safresh1 subtest outergroup => sub { 160*5759b3d2Safresh1 plan tests => 2; 161*5759b3d2Safresh1 ok 1, "this passes"; 162*5759b3d2Safresh1 barfoo_ok_2 "foot", "namehere"; BEGIN{ $line{ipredcall} = __LINE__ } 163*5759b3d2Safresh1 }; BEGIN{ $line{outercall} = __LINE__ } 164*5759b3d2Safresh1 165*5759b3d2Safresh1 test_test("outergroup with internal barfoo_ok_2 failing line numbers"); 166*5759b3d2Safresh1} 167