4 if ( $ENV{PERL_CORE} ) {
15 use Test::More 'no_plan';
20 use constant TRUE => "__TRUE__";
21 use constant FALSE => "__FALSE__";
23 # if wait() is non-zero, we cannot reliably predict its value
24 use constant NOT_ZERO => "__NOT_ZERO__";
28 my $IsVMS = $^O eq 'VMS';
29 my $IsWin32 = $^O eq 'MSWin32';
31 my $SAMPLE_TESTS = File::Spec->catdir(
33 ( $ENV{PERL_CORE} ? 'lib' : 't' ),
37 my %deprecated = map { $_ => 1 } qw(
38 TAP::Parser::good_plan
39 TAP::Parser::Result::Plan::passed
40 TAP::Parser::Result::Test::passed
41 TAP::Parser::Result::Test::actual_passed
42 TAP::Parser::Result::passed
44 $SIG{__WARN__} = sub {
45 if ( $_[0] =~ /is deprecated/ ) {
46 my @caller = caller(1);
48 ok exists $deprecated{$sub},
49 "... we should get a deprecated warning for $sub";
56 # the %samples keys are the names of test scripts in t/sample-tests
66 { actual_passed => TRUE,
68 description => "Interlock activated",
75 is_unplanned => FALSE,
77 { actual_passed => TRUE,
85 description => "Megathrusters are go",
86 is_unplanned => FALSE,
88 { actual_passed => TRUE,
96 description => "Head formed",
97 is_unplanned => FALSE,
99 { actual_passed => TRUE,
100 is_actual_ok => TRUE,
107 description => "Blazing sword formed",
108 is_unplanned => FALSE,
110 { actual_passed => TRUE,
111 is_actual_ok => TRUE,
118 description => "Robeast destroyed",
119 is_unplanned => FALSE,
123 passed => [ 1 .. 5 ],
124 actual_passed => [ 1 .. 5 ],
131 is_good_plan => TRUE,
139 descriptive_trailing => {
141 { actual_passed => TRUE,
142 is_actual_ok => TRUE,
143 description => "Interlock activated",
150 is_unplanned => FALSE,
152 { actual_passed => TRUE,
153 is_actual_ok => TRUE,
160 description => "Megathrusters are go",
161 is_unplanned => FALSE,
163 { actual_passed => TRUE,
164 is_actual_ok => TRUE,
171 description => "Head formed",
172 is_unplanned => FALSE,
174 { actual_passed => TRUE,
175 is_actual_ok => TRUE,
182 description => "Blazing sword formed",
183 is_unplanned => FALSE,
185 { actual_passed => TRUE,
186 is_actual_ok => TRUE,
193 description => "Robeast destroyed",
194 is_unplanned => FALSE,
204 passed => [ 1 .. 5 ],
205 actual_passed => [ 1 .. 5 ],
212 is_good_plan => TRUE,
231 is_good_plan => FALSE,
232 tests_planned => undef,
234 parse_errors => ['No plan found in TAP output'],
247 { actual_passed => TRUE,
248 is_actual_ok => TRUE,
257 { actual_passed => TRUE,
258 is_actual_ok => TRUE,
267 { actual_passed => TRUE,
268 is_actual_ok => TRUE,
277 { actual_passed => TRUE,
278 is_actual_ok => TRUE,
287 { actual_passed => TRUE,
288 is_actual_ok => TRUE,
299 passed => [ 1 .. 5 ],
300 actual_passed => [ 1 .. 5 ],
307 is_good_plan => TRUE,
315 space_after_plan => {
323 { actual_passed => TRUE,
324 is_actual_ok => TRUE,
333 { actual_passed => TRUE,
334 is_actual_ok => TRUE,
343 { actual_passed => TRUE,
344 is_actual_ok => TRUE,
353 { actual_passed => TRUE,
354 is_actual_ok => TRUE,
363 { actual_passed => TRUE,
364 is_actual_ok => TRUE,
375 passed => [ 1 .. 5 ],
376 actual_passed => [ 1 .. 5 ],
383 is_good_plan => TRUE,
393 { is_version => TRUE,
394 raw => 'TAP version 13',
402 { actual_passed => TRUE,
403 is_actual_ok => TRUE,
412 { actual_passed => TRUE,
413 is_actual_ok => TRUE,
424 { 'fnurk' => 'skib', 'ponk' => 'gleeb' },
425 { 'bar' => 'krup', 'foo' => 'plink' }
428 " ---\n -\n fnurk: skib\n ponk: gleeb\n -\n bar: krup\n foo: plink\n ...",
430 { actual_passed => TRUE,
431 is_actual_ok => TRUE,
440 { actual_passed => TRUE,
441 is_actual_ok => TRUE,
452 'got' => [ '1', 'pong', '4' ],
453 'expected' => [ '1', '2', '4' ]
456 " ---\n expected:\n - 1\n - 2\n - 4\n got:\n - 1\n - pong\n - 4\n ...",
458 { actual_passed => TRUE,
459 is_actual_ok => TRUE,
470 passed => [ 1 .. 5 ],
471 actual_passed => [ 1 .. 5 ],
478 is_good_plan => TRUE,
494 { actual_passed => TRUE,
495 is_actual_ok => TRUE,
504 { actual_passed => FALSE,
505 is_actual_ok => FALSE,
514 { actual_passed => TRUE,
515 is_actual_ok => TRUE,
524 { actual_passed => TRUE,
525 is_actual_ok => TRUE,
534 { actual_passed => FALSE,
535 is_actual_ok => FALSE,
546 passed => [ 1, 3, 4 ],
547 actual_passed => [ 1, 3, 4 ],
549 actual_failed => [ 2, 5 ],
554 is_good_plan => TRUE,
570 { actual_passed => TRUE,
571 is_actual_ok => TRUE,
580 { actual_passed => TRUE,
581 is_actual_ok => TRUE,
589 explanation => 'rain delay',
591 { actual_passed => TRUE,
592 is_actual_ok => TRUE,
601 { actual_passed => TRUE,
602 is_actual_ok => TRUE,
611 { actual_passed => TRUE,
612 is_actual_ok => TRUE,
623 passed => [ 1 .. 5 ],
624 actual_passed => [ 1 .. 5 ],
631 is_good_plan => TRUE,
647 { actual_passed => TRUE,
648 is_actual_ok => TRUE,
661 actual_passed => [1],
668 is_good_plan => TRUE,
684 { actual_passed => FALSE,
685 is_actual_ok => FALSE,
692 description => "- Foo",
693 explanation => 'Just testing the todo interface.',
695 { actual_passed => TRUE,
696 is_actual_ok => TRUE,
703 description => "- Unexpected success",
704 explanation => 'Just testing the todo interface.',
706 { actual_passed => TRUE,
707 is_actual_ok => TRUE,
714 description => "- This is not todo",
719 passed => [ 1, 2, 3 ],
720 actual_passed => [ 2, 3 ],
722 actual_failed => [1],
727 is_good_plan => TRUE,
740 raw => '1..5 todo 3 2;',
742 todo_list => [ 3, 2 ],
744 { actual_passed => TRUE,
745 is_actual_ok => TRUE,
755 { actual_passed => TRUE,
756 is_actual_ok => TRUE,
766 { actual_passed => FALSE,
767 is_actual_ok => FALSE,
777 { actual_passed => TRUE,
778 is_actual_ok => TRUE,
788 { actual_passed => TRUE,
789 is_actual_ok => TRUE,
801 passed => [ 1, 2, 3, 4, 5 ],
802 actual_passed => [ 1, 2, 4, 5 ],
804 actual_failed => [3],
809 is_good_plan => TRUE,
825 { actual_passed => TRUE,
826 is_actual_ok => TRUE,
835 is_unplanned => FALSE,
837 { actual_passed => TRUE,
838 is_actual_ok => TRUE,
847 is_unplanned => FALSE,
849 { actual_passed => TRUE,
850 is_actual_ok => TRUE,
859 is_unplanned => FALSE,
861 { actual_passed => TRUE,
862 is_actual_ok => TRUE,
871 is_unplanned => FALSE,
873 { actual_passed => TRUE,
874 is_actual_ok => TRUE,
883 is_unplanned => FALSE,
885 { actual_passed => TRUE,
886 is_actual_ok => TRUE,
895 is_unplanned => FALSE,
897 { actual_passed => TRUE,
898 is_actual_ok => TRUE,
907 is_unplanned => FALSE,
909 { actual_passed => TRUE,
910 is_actual_ok => TRUE,
919 is_unplanned => FALSE,
921 { actual_passed => TRUE,
922 is_actual_ok => TRUE,
931 is_unplanned => FALSE,
933 { actual_passed => TRUE,
934 is_actual_ok => TRUE,
943 is_unplanned => FALSE,
945 { actual_passed => TRUE,
946 is_actual_ok => TRUE,
955 is_unplanned => TRUE,
959 passed => [ 1 .. 4, 4 .. 9 ],
960 actual_passed => [ 1 .. 4, 4 .. 10 ],
970 'Tests out of sequence. Found (4) but expected (5)',
971 'Tests out of sequence. Found (5) but expected (6)',
972 'Tests out of sequence. Found (6) but expected (7)',
973 'Tests out of sequence. Found (7) but expected (8)',
974 'Tests out of sequence. Found (8) but expected (9)',
975 'Tests out of sequence. Found (9) but expected (10)',
976 'Tests out of sequence. Found (10) but expected (11)',
977 'Bad plan. You planned 10 tests but ran 11.',
990 { actual_passed => TRUE,
991 is_actual_ok => TRUE,
1000 { actual_passed => TRUE,
1001 is_actual_ok => TRUE,
1010 { actual_passed => FALSE,
1011 is_actual_ok => FALSE,
1020 { actual_passed => TRUE,
1021 is_actual_ok => TRUE,
1030 { actual_passed => TRUE,
1031 is_actual_ok => TRUE,
1042 passed => [ 1, 2, 4, 5 ],
1043 actual_passed => [ 1, 2, 4, 5 ],
1045 actual_failed => [3],
1050 is_good_plan => TRUE,
1066 { actual_passed => TRUE,
1067 is_actual_ok => TRUE,
1076 { actual_passed => TRUE,
1077 is_actual_ok => TRUE,
1086 { actual_passed => TRUE,
1087 is_actual_ok => TRUE,
1096 { is_bailout => TRUE,
1097 explanation => "GERONIMMMOOOOOO!!!",
1099 { actual_passed => TRUE,
1100 is_actual_ok => TRUE,
1109 { actual_passed => TRUE,
1110 is_actual_ok => TRUE,
1121 passed => [ 1 .. 5 ],
1122 actual_passed => [ 1 .. 5 ],
1124 actual_failed => [],
1129 is_good_plan => TRUE,
1141 actual_passed => [],
1143 actual_failed => [],
1148 tests_planned => undef,
1150 parse_errors => [ 'No plan found in TAP output', ],
1162 { actual_passed => TRUE,
1163 is_actual_ok => TRUE,
1171 is_unplanned => FALSE,
1173 { actual_passed => TRUE,
1174 is_actual_ok => TRUE,
1182 is_unplanned => FALSE,
1184 { actual_passed => TRUE,
1185 is_actual_ok => TRUE,
1193 is_unplanned => FALSE,
1195 { actual_passed => TRUE,
1196 is_actual_ok => TRUE,
1204 is_unplanned => TRUE,
1206 { actual_passed => TRUE,
1207 is_actual_ok => TRUE,
1215 is_unplanned => TRUE,
1217 { actual_passed => TRUE,
1218 is_actual_ok => TRUE,
1226 is_unplanned => TRUE,
1228 { actual_passed => TRUE,
1229 is_actual_ok => TRUE,
1237 is_unplanned => TRUE,
1241 passed => [ 1 .. 3 ],
1242 actual_passed => [ 1 .. 7 ],
1243 failed => [ 4 .. 7 ],
1244 actual_failed => [],
1251 parse_errors => ['Bad plan. You planned 3 tests but ran 7.'],
1254 skip_if => sub {$IsVMS},
1262 tests_planned => TRUE,
1264 { actual_passed => TRUE,
1265 is_actual_ok => TRUE,
1266 description => "- -T honored",
1276 passed => [ 1 .. 1 ],
1277 actual_passed => [ 1 .. 1 ],
1279 actual_failed => [],
1284 is_good_plan => TRUE,
1285 tests_planned => TRUE,
1296 actual_passed => [],
1298 actual_failed => [],
1303 tests_planned => undef,
1305 parse_errors => [ 'No plan found in TAP output', ],
1311 { actual_passed => TRUE,
1312 is_actual_ok => TRUE,
1322 { actual_passed => TRUE,
1323 is_actual_ok => TRUE,
1333 { actual_passed => TRUE,
1334 is_actual_ok => TRUE,
1344 { actual_passed => TRUE,
1345 is_actual_ok => TRUE,
1357 passed => [ 1 .. 4 ],
1358 actual_passed => [ 1 .. 4 ],
1360 actual_failed => [],
1365 tests_planned => undef,
1367 parse_errors => [ 'No plan found in TAP output', ],
1371 die_last_minute => {
1373 { actual_passed => TRUE,
1374 is_actual_ok => TRUE,
1384 { actual_passed => TRUE,
1385 is_actual_ok => TRUE,
1395 { actual_passed => TRUE,
1396 is_actual_ok => TRUE,
1406 { actual_passed => TRUE,
1407 is_actual_ok => TRUE,
1425 passed => [ 1 .. 4 ],
1426 actual_passed => [ 1 .. 4 ],
1428 actual_failed => [],
1433 is_good_plan => TRUE,
1448 { actual_passed => TRUE,
1449 is_actual_ok => TRUE,
1459 { actual_passed => TRUE,
1460 is_actual_ok => TRUE,
1470 { actual_passed => TRUE,
1471 is_actual_ok => TRUE,
1477 number => 136211425,
1481 { actual_passed => TRUE,
1482 is_actual_ok => TRUE,
1488 number => 136211426,
1495 actual_passed => [ 1, 2, 136211425, 136211426 ],
1496 failed => [ 136211425, 136211426 ],
1497 actual_failed => [],
1505 'Tests out of sequence. Found (136211425) but expected (3)',
1506 'Tests out of sequence. Found (136211426) but expected (4)',
1507 'Bad plan. You planned 2 tests but ran 4.'
1520 { actual_passed => TRUE,
1521 is_actual_ok => TRUE,
1531 { actual_passed => TRUE,
1532 is_actual_ok => TRUE,
1542 { actual_passed => TRUE,
1543 is_actual_ok => TRUE,
1553 { actual_passed => TRUE,
1554 is_actual_ok => TRUE,
1564 { actual_passed => TRUE,
1565 is_actual_ok => TRUE,
1575 { actual_passed => TRUE,
1576 is_actual_ok => TRUE,
1586 { actual_passed => TRUE,
1587 is_actual_ok => TRUE,
1597 { actual_passed => TRUE,
1598 is_actual_ok => TRUE,
1608 { actual_passed => TRUE,
1609 is_actual_ok => TRUE,
1619 { actual_passed => TRUE,
1620 is_actual_ok => TRUE,
1630 { actual_passed => TRUE,
1631 is_actual_ok => TRUE,
1644 actual_passed => [ 1, 2, 99997 .. 100005 ],
1645 failed => [ 99997 .. 100005 ],
1646 actual_failed => [],
1654 'Tests out of sequence. Found (99997) but expected (3)',
1655 'Tests out of sequence. Found (99998) but expected (4)',
1656 'Tests out of sequence. Found (99999) but expected (5)',
1657 'Tests out of sequence. Found (100000) but expected (6)',
1658 'Tests out of sequence. Found (100001) but expected (7)',
1659 'Tests out of sequence. Found (100002) but expected (8)',
1660 'Tests out of sequence. Found (100003) but expected (9)',
1661 'Tests out of sequence. Found (100004) but expected (10)',
1662 'Tests out of sequence. Found (100005) but expected (11)',
1663 'Bad plan. You planned 2 tests but ran 11.'
1674 tests_planned => 10,
1676 { actual_passed => TRUE,
1677 is_actual_ok => TRUE,
1687 { actual_passed => TRUE,
1688 is_actual_ok => TRUE,
1695 description => 'basset hounds got long ears',
1698 { actual_passed => FALSE,
1699 is_actual_ok => FALSE,
1706 description => 'all hell broke loose',
1709 { actual_passed => FALSE,
1710 is_actual_ok => FALSE,
1718 explanation => 'if I heard a voice from heaven ...',
1720 { actual_passed => TRUE,
1721 is_actual_ok => TRUE,
1728 description => 'say "live without loving",',
1731 { actual_passed => TRUE,
1732 is_actual_ok => TRUE,
1739 description => "I'd beg off.",
1742 { actual_passed => TRUE,
1743 is_actual_ok => TRUE,
1751 explanation => 'contract negotiations',
1753 { actual_passed => TRUE,
1754 is_actual_ok => TRUE,
1761 description => 'Girls are such exquisite hell',
1764 { actual_passed => TRUE,
1765 is_actual_ok => TRUE,
1772 description => 'Elegy 9B',
1775 { actual_passed => FALSE,
1776 is_actual_ok => FALSE,
1788 passed => [ 1 .. 2, 4 .. 9 ],
1789 actual_passed => [ 1 .. 2, 5 .. 9 ],
1790 failed => [ 3, 10 ],
1791 actual_failed => [ 3, 4, 10 ],
1796 is_good_plan => TRUE,
1797 tests_planned => 10,
1806 { is_comment => TRUE,
1809 comment => 'comments',
1811 { actual_passed => TRUE,
1812 is_actual_ok => TRUE,
1822 { actual_passed => TRUE,
1823 is_actual_ok => TRUE,
1833 { actual_passed => TRUE,
1834 is_actual_ok => TRUE,
1844 { actual_passed => TRUE,
1845 is_actual_ok => TRUE,
1855 { is_comment => TRUE,
1858 comment => 'comment',
1866 { is_comment => TRUE,
1869 comment => 'more ignored stuff',
1871 { is_comment => TRUE,
1874 comment => 'and yet more',
1878 passed => [ 1 .. 4 ],
1879 actual_passed => [ 1 .. 4 ],
1881 actual_failed => [],
1886 is_good_plan => TRUE,
1896 { is_comment => TRUE,
1899 comment => 'comments',
1901 { actual_passed => TRUE,
1902 is_actual_ok => TRUE,
1912 { actual_passed => FALSE,
1913 is_actual_ok => FALSE,
1923 { actual_passed => TRUE,
1924 is_actual_ok => TRUE,
1934 { actual_passed => TRUE,
1935 is_actual_ok => TRUE,
1945 { is_comment => TRUE,
1948 comment => 'comment',
1956 { is_comment => TRUE,
1959 comment => 'more ignored stuff',
1961 { is_comment => TRUE,
1964 comment => 'and yet more',
1968 passed => [ 1, 3, 4 ],
1969 actual_passed => [ 1, 3, 4 ],
1971 actual_failed => [2],
1976 is_good_plan => TRUE,
1986 { actual_passed => TRUE,
1987 is_actual_ok => TRUE,
1994 description => '- Test that argument passing works',
1997 { actual_passed => TRUE,
1998 is_actual_ok => TRUE,
2006 '- Test that passing arguments as references work',
2009 { actual_passed => TRUE,
2010 is_actual_ok => TRUE,
2017 description => '- Test a normal sub',
2020 { actual_passed => TRUE,
2021 is_actual_ok => TRUE,
2028 description => '- Detach test',
2031 { actual_passed => TRUE,
2032 is_actual_ok => TRUE,
2039 description => '- Nested thread test',
2042 { actual_passed => TRUE,
2043 is_actual_ok => TRUE,
2050 description => '- Nested thread test',
2053 { actual_passed => TRUE,
2054 is_actual_ok => TRUE,
2061 description => '- Wanted 7, got 7',
2064 { actual_passed => TRUE,
2065 is_actual_ok => TRUE,
2072 description => '- Wanted 7, got 7',
2075 { actual_passed => TRUE,
2076 is_actual_ok => TRUE,
2083 description => '- Wanted 8, got 8',
2086 { actual_passed => TRUE,
2087 is_actual_ok => TRUE,
2094 description => '- Wanted 8, got 8',
2101 tests_planned => 15,
2103 { actual_passed => TRUE,
2104 is_actual_ok => TRUE,
2114 { actual_passed => TRUE,
2115 is_actual_ok => TRUE,
2122 description => '- Check that Config::threads is true',
2125 { actual_passed => TRUE,
2126 is_actual_ok => TRUE,
2133 description => '- Detach test',
2136 { actual_passed => TRUE,
2137 is_actual_ok => TRUE,
2145 '- Check so that tid for threads work for main thread',
2148 { actual_passed => TRUE,
2149 is_actual_ok => TRUE,
2157 '- Check so that tid for threads work for main thread',
2162 passed => [ 2 .. 4, 6, 8 .. 13, 1, 5, 7, 14, 15 ],
2163 actual_passed => [ 2 .. 4, 6, 8 .. 13, 1, 5, 7, 14, 15 ],
2165 actual_failed => [],
2169 is_good_plan => FALSE,
2170 tests_planned => 15,
2173 # Note that tests 14 and 15 *are* in the correct sequence.
2175 'Tests out of sequence. Found (2) but expected (1)',
2176 'Tests out of sequence. Found (3) but expected (2)',
2177 'Tests out of sequence. Found (4) but expected (3)',
2178 'Tests out of sequence. Found (6) but expected (4)',
2179 'Tests out of sequence. Found (8) but expected (5)',
2180 'Tests out of sequence. Found (9) but expected (6)',
2181 'Tests out of sequence. Found (10) but expected (7)',
2182 'Tests out of sequence. Found (11) but expected (8)',
2183 'Tests out of sequence. Found (12) but expected (9)',
2184 'Tests out of sequence. Found (13) but expected (10)',
2185 'Plan (1..15) must be at the beginning or end of the TAP output',
2186 'Tests out of sequence. Found (1) but expected (11)',
2187 'Tests out of sequence. Found (5) but expected (12)',
2188 'Tests out of sequence. Found (7) but expected (13)',
2196 raw => '1..0 # skipping: rope',
2200 directive => 'SKIP',
2201 explanation => 'rope'
2206 actual_passed => [],
2208 actual_failed => [],
2213 is_good_plan => TRUE,
2224 { is_version => TRUE,
2225 raw => 'TAP version 13',
2227 { is_unknown => TRUE,
2228 raw => '1..0 # skipping: rope',
2233 actual_passed => [],
2235 actual_failed => [],
2240 is_good_plan => FALSE,
2241 tests_planned => FALSE,
2243 parse_errors => ['No plan found in TAP output'],
2255 directive => 'SKIP',
2261 actual_passed => [],
2263 actual_failed => [],
2268 is_good_plan => TRUE,
2275 skip_all => '(no reason given)',
2281 tests_planned => TRUE,
2285 { actual_passed => FALSE,
2286 is_actual_ok => FALSE,
2293 description => 'Hamlette # TODOORNOTTODO',
2299 actual_passed => [],
2301 actual_failed => [1],
2306 is_good_plan => TRUE,
2307 tests_planned => TRUE,
2314 shbang_misparse => {
2322 { actual_passed => TRUE,
2323 is_actual_ok => TRUE,
2332 { actual_passed => TRUE,
2333 is_actual_ok => TRUE,
2344 passed => [ 1 .. 2 ],
2345 actual_passed => [ 1 .. 2 ],
2347 actual_failed => [],
2352 is_good_plan => TRUE,
2368 { actual_passed => TRUE,
2369 is_actual_ok => TRUE,
2380 __ARGS__ => { switches => ['-Mstrict'] },
2383 actual_passed => [1],
2385 actual_failed => [],
2390 is_good_plan => TRUE,
2406 { actual_passed => TRUE,
2407 is_actual_ok => TRUE,
2418 __ARGS__ => { switches => ['-Iexamples'] },
2421 actual_passed => [1],
2423 actual_failed => [],
2428 is_good_plan => TRUE,
2436 sequence_misparse => {
2444 { actual_passed => TRUE,
2445 is_actual_ok => TRUE,
2454 { actual_passed => TRUE,
2455 is_actual_ok => TRUE,
2464 { actual_passed => TRUE,
2465 is_actual_ok => TRUE,
2472 description => "\# skipped on foobar system",
2474 { is_comment => TRUE,
2475 comment => '1234567890123456789012345678901234567890',
2477 { actual_passed => TRUE,
2478 is_actual_ok => TRUE,
2487 { is_comment => TRUE,
2488 comment => '1234567890123456789012345678901234567890',
2490 { actual_passed => TRUE,
2491 is_actual_ok => TRUE,
2502 passed => [ 1 .. 5 ],
2503 actual_passed => [ 1 .. 5 ],
2505 actual_failed => [],
2510 is_good_plan => TRUE,
2521 { is_comment => TRUE,
2524 comment => 'comments',
2526 { actual_passed => TRUE,
2527 is_actual_ok => TRUE,
2537 { actual_passed => TRUE,
2538 is_actual_ok => TRUE,
2548 { actual_passed => TRUE,
2549 is_actual_ok => TRUE,
2559 { is_comment => TRUE,
2562 comment => 'comment',
2564 { actual_passed => TRUE,
2565 is_actual_ok => TRUE,
2575 { is_comment => TRUE,
2578 comment => 'more ignored stuff',
2580 { is_comment => TRUE,
2583 comment => 'and yet more',
2593 passed => [ 1 .. 4 ],
2594 actual_passed => [ 1 .. 4 ],
2596 actual_failed => [],
2601 is_good_plan => TRUE,
2611 junk_before_plan => {
2613 { is_unknown => TRUE,
2614 raw => 'this is junk',
2616 { is_comment => TRUE,
2617 comment => "this is a comment",
2625 { actual_passed => TRUE,
2626 is_actual_ok => TRUE,
2636 passed => [ 1 .. 1 ],
2637 actual_passed => [ 1 .. 1 ],
2639 actual_failed => [],
2644 is_good_plan => TRUE,
2654 { is_version => TRUE,
2655 raw => 'TAP version 13',
2663 { actual_passed => TRUE,
2664 is_actual_ok => TRUE,
2673 { actual_passed => TRUE,
2674 is_actual_ok => TRUE,
2683 { actual_passed => TRUE,
2684 is_actual_ok => TRUE,
2693 { actual_passed => TRUE,
2694 is_actual_ok => TRUE,
2703 { actual_passed => TRUE,
2704 is_actual_ok => TRUE,
2715 passed => [ 1 .. 5 ],
2716 actual_passed => [ 1 .. 5 ],
2718 actual_failed => [],
2723 is_good_plan => TRUE,
2733 { is_version => TRUE,
2734 raw => 'TAP version 12',
2742 { actual_passed => TRUE,
2743 is_actual_ok => TRUE,
2752 { actual_passed => TRUE,
2753 is_actual_ok => TRUE,
2762 { actual_passed => TRUE,
2763 is_actual_ok => TRUE,
2772 { actual_passed => TRUE,
2773 is_actual_ok => TRUE,
2782 { actual_passed => TRUE,
2783 is_actual_ok => TRUE,
2794 passed => [ 1 .. 5 ],
2795 actual_passed => [ 1 .. 5 ],
2797 actual_failed => [],
2802 is_good_plan => TRUE,
2806 [ 'Explicit TAP version must be at least 13. Got version 12' ],
2819 { is_version => TRUE,
2820 raw => 'TAP version 13',
2822 { actual_passed => TRUE,
2823 is_actual_ok => TRUE,
2832 { actual_passed => TRUE,
2833 is_actual_ok => TRUE,
2842 { actual_passed => TRUE,
2843 is_actual_ok => TRUE,
2852 { actual_passed => TRUE,
2853 is_actual_ok => TRUE,
2862 { actual_passed => TRUE,
2863 is_actual_ok => TRUE,
2874 passed => [ 1 .. 5 ],
2875 actual_passed => [ 1 .. 5 ],
2877 actual_failed => [],
2882 is_good_plan => TRUE,
2886 [ 'If TAP version is present it must be the first line of output' ],
2900 { actual_passed => TRUE,
2901 is_actual_ok => TRUE,
2903 'Should parse as literal backslash --> \\',
2910 is_unplanned => FALSE,
2912 { actual_passed => TRUE,
2913 is_actual_ok => TRUE,
2920 description => 'Not a continuation line',
2921 is_unplanned => FALSE,
2925 passed => [ 1 .. 2 ],
2926 actual_passed => [ 1 .. 2 ],
2928 actual_failed => [],
2933 is_good_plan => TRUE,
2950 { actual_passed => TRUE,
2951 is_actual_ok => TRUE,
2952 description => 'Not a \\# TODO',
2959 is_unplanned => FALSE,
2961 { actual_passed => TRUE,
2962 is_actual_ok => TRUE,
2969 description => 'Not a \\# SKIP',
2970 is_unplanned => FALSE,
2972 { actual_passed => TRUE,
2973 is_actual_ok => TRUE,
2980 description => 'Escaped \\\\\\#',
2981 is_unplanned => FALSE,
2985 passed => [ 1 .. 3 ],
2986 actual_passed => [ 1 .. 3 ],
2988 actual_failed => [],
2993 is_good_plan => TRUE,
3004 NOT_ZERO, sub { local $^W; 0 != shift },
3005 TRUE, sub { local $^W; !!shift },
3006 FALSE, sub { local $^W; !shift },
3009 my $can_open3 = ( $Config{d_fork} || $IsWin32 ) ? 1 : 0;
3011 for my $hide_fork ( 0 .. $can_open3 ) {
3015 *{'TAP::Parser::Iterator::Process::_use_open3'} = sub {return};
3019 for my $test ( sort keys %samples ) {
3021 #next unless 'empty' eq $test;
3022 my %details = %{ $samples{$test} };
3024 if ( my $skip_if = delete $details{skip_if} ) {
3025 next TEST if $skip_if->();
3028 my $results = delete $details{results};
3029 my $args = delete $details{__ARGS__};
3030 my $need_open3 = delete $details{need_open3};
3032 next TEST if $need_open3 && ( $hide_fork || !$can_open3 );
3034 # the following acrobatics are necessary to make it easy for the
3035 # Test::Builder::failure_output() method to be overridden when
3036 # TAP::Parser is not installed. Otherwise, these tests will fail.
3038 unshift @{ $args->{switches} },
3039 $ENV{PERL_CORE} ? ( map {"-I$_"} @INC ) : ('-It/lib');
3041 $args->{source} = File::Spec->catfile( $SAMPLE_TESTS, $test );
3042 $args->{merge} = !$hide_fork;
3044 my $parser = eval { analyze_test( $test, [@$results], $args ) };
3046 ok !$error, "'$test' should parse successfully"
3051 while ( my ( $method, $answer ) = each %details ) {
3052 $tests += ref $answer ? 2 : 1;
3055 skip "$test did not parse successfully", $tests;
3059 while ( my ( $method, $answer ) = each %details ) {
3060 if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck
3061 ok $handler->( $parser->$method() ),
3062 "... and $method should return a reasonable value ($test)";
3064 elsif ( !ref $answer ) {
3065 local $^W; # uninit warnings
3067 $answer = _vmsify_answer( $method, $answer );
3069 is $parser->$method(), $answer,
3070 "... and $method should equal $answer ($test)";
3073 is scalar $parser->$method(), scalar @$answer,
3074 "... and $method should be the correct amount ($test)";
3075 is_deeply [ $parser->$method() ], $answer,
3076 "... and $method should be the correct values ($test)";
3083 my %Unix2VMS_Exit_Codes = ( 1 => 4, );
3085 sub _vmsify_answer {
3086 my ( $method, $answer ) = @_;
3088 return $answer unless $IsVMS;
3090 if ( $method eq 'exit'
3091 and exists $Unix2VMS_Exit_Codes{$answer} )
3093 $answer = $Unix2VMS_Exit_Codes{$answer};
3100 my ( $test, $results, $args ) = @_;
3102 my $parser = TAP::Parser->new($args);
3104 while ( defined( my $result = $parser->next ) ) {
3106 my $expected = shift @$results;
3109 ? $result->description
3111 $desc = $result->plan
3112 if $result->is_plan && $desc =~ /SKIP/i;
3113 $desc =~ s/#/<hash>/g;
3114 $desc =~ s/\s+/ /g; # Drop newlines
3115 ok defined $expected,
3116 "$test/$count We should have a result for $desc";
3117 while ( my ( $method, $answer ) = each %$expected ) {
3119 if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck
3120 ok $handler->( $result->$method() ),
3121 "... and $method should return a reasonable value ($test/$count)";
3123 elsif ( ref $answer ) {
3124 is_deeply $result->$method(), $answer,
3125 "... and $method should return the correct structure ($test/$count)";
3128 is $result->$method(), $answer,
3129 "... and $method should return the correct answer ($test/$count)";
3135 "... and we should have the correct number of results ($test)";