xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/todo.t (revision 5759b3d249badf144a6240f7eec4dcf9df003e6b)
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