1*5759b3d2Safresh1#!/usr/bin/perl -w 2*5759b3d2Safresh1# Test todo subtests. 3*5759b3d2Safresh1# 4*5759b3d2Safresh1# A subtest in a todo context should have all of its diagnostic output 5*5759b3d2Safresh1# redirected to the todo output destination, but individual tests 6*5759b3d2Safresh1# within the subtest should not become todo tests themselves. 7*5759b3d2Safresh1 8*5759b3d2Safresh1BEGIN { 9*5759b3d2Safresh1 if( $ENV{PERL_CORE} ) { 10*5759b3d2Safresh1 chdir 't'; 11*5759b3d2Safresh1 @INC = ( '../lib', 'lib' ); 12*5759b3d2Safresh1 } 13*5759b3d2Safresh1 else { 14*5759b3d2Safresh1 unshift @INC, 't/lib'; 15*5759b3d2Safresh1 } 16*5759b3d2Safresh1} 17*5759b3d2Safresh1 18*5759b3d2Safresh1use strict; 19*5759b3d2Safresh1use warnings; 20*5759b3d2Safresh1 21*5759b3d2Safresh1use Test::More; 22*5759b3d2Safresh1use Test::Builder; 23*5759b3d2Safresh1use Test::Builder::Tester; 24*5759b3d2Safresh1 25*5759b3d2Safresh1# Formatting may change if we're running under Test::Harness. 26*5759b3d2Safresh1$ENV{HARNESS_ACTIVE} = 0; 27*5759b3d2Safresh1 28*5759b3d2Safresh1our %line; 29*5759b3d2Safresh1 30*5759b3d2Safresh1# Repeat each test for various combinations of the todo reason, 31*5759b3d2Safresh1# the mechanism by which it is set and $Level. 32*5759b3d2Safresh1our @test_combos; 33*5759b3d2Safresh1foreach my $level (1, 2, 3) { 34*5759b3d2Safresh1 push @test_combos, ['$TODO', 'Reason', $level], 35*5759b3d2Safresh1 ['todo_start', 'Reason', $level], 36*5759b3d2Safresh1 ['todo_start', '', $level], 37*5759b3d2Safresh1 ['todo_start', 0, $level]; 38*5759b3d2Safresh1} 39*5759b3d2Safresh1 40*5759b3d2Safresh1plan tests => 8 * @test_combos; 41*5759b3d2Safresh1 42*5759b3d2Safresh1sub test_subtest_in_todo { 43*5759b3d2Safresh1 my ($name, $code, $want_out, $no_tests_run) = @_; 44*5759b3d2Safresh1 45*5759b3d2Safresh1 my $xxx = $no_tests_run ? 'No tests run for subtest "xxx"' : 'xxx'; 46*5759b3d2Safresh1 47*5759b3d2Safresh1 chomp $want_out; 48*5759b3d2Safresh1 my @outlines = split /\n/, $want_out; 49*5759b3d2Safresh1 50*5759b3d2Safresh1 foreach my $combo (@test_combos) { 51*5759b3d2Safresh1 my ($set_via, $todo_reason, $level) = @$combo; 52*5759b3d2Safresh1 53*5759b3d2Safresh1 test_out( map { my $x = $_; $x =~ s/\s+$//g; $x } 54*5759b3d2Safresh1 "# Subtest: xxx", 55*5759b3d2Safresh1 @outlines, 56*5759b3d2Safresh1 "not ok 1 - $xxx # TODO $todo_reason", 57*5759b3d2Safresh1 "# Failed (TODO) test '$xxx'", 58*5759b3d2Safresh1 "# at $0 line $line{xxx}.", 59*5759b3d2Safresh1 "not ok 2 - regular todo test # TODO $todo_reason", 60*5759b3d2Safresh1 "# Failed (TODO) test 'regular todo test'", 61*5759b3d2Safresh1 "# at $0 line $line{reg}.", 62*5759b3d2Safresh1 ); 63*5759b3d2Safresh1 64*5759b3d2Safresh1 { 65*5759b3d2Safresh1 local $TODO = $set_via eq '$TODO' ? $todo_reason : undef; 66*5759b3d2Safresh1 if ($set_via eq 'todo_start') { 67*5759b3d2Safresh1 Test::Builder->new->todo_start($todo_reason); 68*5759b3d2Safresh1 } 69*5759b3d2Safresh1 70*5759b3d2Safresh1 subtest_at_level( 71*5759b3d2Safresh1 'xxx', $code, $level); BEGIN{ $line{xxx} = __LINE__ } 72*5759b3d2Safresh1 ok 0, 'regular todo test'; BEGIN{ $line{reg} = __LINE__ } 73*5759b3d2Safresh1 74*5759b3d2Safresh1 if ($set_via eq 'todo_start') { 75*5759b3d2Safresh1 Test::Builder->new->todo_end; 76*5759b3d2Safresh1 } 77*5759b3d2Safresh1 } 78*5759b3d2Safresh1 79*5759b3d2Safresh1 test_test("$name ($level), todo [$todo_reason] set via $set_via"); 80*5759b3d2Safresh1 } 81*5759b3d2Safresh1} 82*5759b3d2Safresh1 83*5759b3d2Safresh1package Foo; # If several stack frames are in package 'main' then $Level 84*5759b3d2Safresh1 # could be wrong and $main::TODO might still be found. Using 85*5759b3d2Safresh1 # another package makes the tests more sensitive. 86*5759b3d2Safresh1 87*5759b3d2Safresh1sub main::subtest_at_level { 88*5759b3d2Safresh1 my ($name, $code, $level) = @_; 89*5759b3d2Safresh1 90*5759b3d2Safresh1 if ($level > 1) { 91*5759b3d2Safresh1 local $Test::Builder::Level = $Test::Builder::Level + 1; 92*5759b3d2Safresh1 main::subtest_at_level($name, $code, $level-1); 93*5759b3d2Safresh1 } 94*5759b3d2Safresh1 else { 95*5759b3d2Safresh1 Test::Builder->new->subtest($name => $code); 96*5759b3d2Safresh1 } 97*5759b3d2Safresh1} 98*5759b3d2Safresh1 99*5759b3d2Safresh1package main; 100*5759b3d2Safresh1 101*5759b3d2Safresh1test_subtest_in_todo("plan, no tests run", sub { 102*5759b3d2Safresh1 plan tests => 2; 103*5759b3d2Safresh1}, <<END, 1); 104*5759b3d2Safresh1 1..2 105*5759b3d2Safresh1 # No tests run! 106*5759b3d2Safresh1END 107*5759b3d2Safresh1 108*5759b3d2Safresh1test_subtest_in_todo("noplan, no tests run", sub { 109*5759b3d2Safresh1 plan 'no_plan'; 110*5759b3d2Safresh1}, <<END, 1); 111*5759b3d2Safresh1 # No tests run! 112*5759b3d2Safresh1END 113*5759b3d2Safresh1 114*5759b3d2Safresh1test_subtest_in_todo("missingplan, no tests run", sub { 115*5759b3d2Safresh1 1; 116*5759b3d2Safresh1}, <<END, 1); 117*5759b3d2Safresh1 1..0 118*5759b3d2Safresh1 # No tests run! 119*5759b3d2Safresh1END 120*5759b3d2Safresh1 121*5759b3d2Safresh1test_subtest_in_todo("donetesting, no tests run", sub { 122*5759b3d2Safresh1 done_testing; 123*5759b3d2Safresh1}, <<END, 1); 124*5759b3d2Safresh1 1..0 125*5759b3d2Safresh1 # No tests run! 126*5759b3d2Safresh1END 127*5759b3d2Safresh1 128*5759b3d2Safresh1test_subtest_in_todo("1 failed test", sub { 129*5759b3d2Safresh1 ok 0, 'failme'; BEGIN { $line{fail1} = __LINE__ } 130*5759b3d2Safresh1}, <<END); 131*5759b3d2Safresh1 not ok 1 - failme 132*5759b3d2Safresh1 # Failed test 'failme' 133*5759b3d2Safresh1 # at $0 line $line{fail1}. 134*5759b3d2Safresh1 1..1 135*5759b3d2Safresh1 # Looks like you failed 1 test of 1. 136*5759b3d2Safresh1END 137*5759b3d2Safresh1 138*5759b3d2Safresh1test_subtest_in_todo("1fail, wrongplan", sub { 139*5759b3d2Safresh1 plan tests => 17; 140*5759b3d2Safresh1 ok 0, 'failme'; BEGIN { $line{fail2} = __LINE__ } 141*5759b3d2Safresh1}, <<END); 142*5759b3d2Safresh1 1..17 143*5759b3d2Safresh1 not ok 1 - failme 144*5759b3d2Safresh1 # Failed test 'failme' 145*5759b3d2Safresh1 # at $0 line $line{fail2}. 146*5759b3d2Safresh1 # Looks like you planned 17 tests but ran 1. 147*5759b3d2Safresh1 # Looks like you failed 1 test of 1 run. 148*5759b3d2Safresh1END 149*5759b3d2Safresh1 150*5759b3d2Safresh1test_subtest_in_todo("1fail, 1pass", sub { 151*5759b3d2Safresh1 ok 0, 'failme'; BEGIN { $line{fail3} = __LINE__ } 152*5759b3d2Safresh1 ok 1, 'passme'; 153*5759b3d2Safresh1}, <<END); 154*5759b3d2Safresh1 not ok 1 - failme 155*5759b3d2Safresh1 # Failed test 'failme' 156*5759b3d2Safresh1 # at $0 line $line{fail3}. 157*5759b3d2Safresh1 ok 2 - passme 158*5759b3d2Safresh1 1..2 159*5759b3d2Safresh1 # Looks like you failed 1 test of 2. 160*5759b3d2Safresh1END 161*5759b3d2Safresh1 162*5759b3d2Safresh1test_subtest_in_todo("todo tests in the subtest", sub { 163*5759b3d2Safresh1 ok 0, 'inner test 1'; BEGIN{ $line{in1} = __LINE__ } 164*5759b3d2Safresh1 165*5759b3d2Safresh1 TODO: { 166*5759b3d2Safresh1 local $TODO = 'Inner1'; 167*5759b3d2Safresh1 ok 0, 'failing TODO a'; BEGIN{ $line{fta} = __LINE__ } 168*5759b3d2Safresh1 ok 1, 'unexpected pass a'; 169*5759b3d2Safresh1 } 170*5759b3d2Safresh1 171*5759b3d2Safresh1 ok 0, 'inner test 2'; BEGIN{ $line{in2} = __LINE__ } 172*5759b3d2Safresh1 173*5759b3d2Safresh1 Test::Builder->new->todo_start('Inner2'); 174*5759b3d2Safresh1 ok 0, 'failing TODO b'; BEGIN{ $line{ftb} = __LINE__ } 175*5759b3d2Safresh1 ok 1, 'unexpected pass b'; 176*5759b3d2Safresh1 Test::Builder->new->todo_end; 177*5759b3d2Safresh1 178*5759b3d2Safresh1 ok 0, 'inner test 3'; BEGIN{ $line{in3} = __LINE__ } 179*5759b3d2Safresh1}, <<END); 180*5759b3d2Safresh1 not ok 1 - inner test 1 181*5759b3d2Safresh1 # Failed test 'inner test 1' 182*5759b3d2Safresh1 # at $0 line $line{in1}. 183*5759b3d2Safresh1 not ok 2 - failing TODO a # TODO Inner1 184*5759b3d2Safresh1 # Failed (TODO) test 'failing TODO a' 185*5759b3d2Safresh1 # at $0 line $line{fta}. 186*5759b3d2Safresh1 ok 3 - unexpected pass a # TODO Inner1 187*5759b3d2Safresh1 not ok 4 - inner test 2 188*5759b3d2Safresh1 # Failed test 'inner test 2' 189*5759b3d2Safresh1 # at $0 line $line{in2}. 190*5759b3d2Safresh1 not ok 5 - failing TODO b # TODO Inner2 191*5759b3d2Safresh1 # Failed (TODO) test 'failing TODO b' 192*5759b3d2Safresh1 # at $0 line $line{ftb}. 193*5759b3d2Safresh1 ok 6 - unexpected pass b # TODO Inner2 194*5759b3d2Safresh1 not ok 7 - inner test 3 195*5759b3d2Safresh1 # Failed test 'inner test 3' 196*5759b3d2Safresh1 # at $0 line $line{in3}. 197*5759b3d2Safresh1 1..7 198*5759b3d2Safresh1 # Looks like you failed 3 tests of 7. 199*5759b3d2Safresh1END 200