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',
2206 actual_passed => [],
2208 actual_failed => [],
2213 is_good_plan => TRUE,
2220 skip_all => '(no reason given)',
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'],
2250 { is_version => TRUE,
2251 raw => 'TAP version 13',
2256 { is_pragma => TRUE,
2257 raw => 'pragma +strict',
2258 pragmas => ['+strict'],
2260 { is_unknown => TRUE, raw => 'Nonsense!',
2262 { is_pragma => TRUE,
2263 raw => 'pragma -strict',
2264 pragmas => ['-strict'],
2266 { is_unknown => TRUE,
2267 raw => "Doesn't matter.",
2270 raw => 'ok 1 All OK',
2275 actual_passed => [1],
2277 actual_failed => [],
2282 is_good_plan => TRUE,
2285 parse_errors => ['Unknown TAP token: "Nonsense!"'],
2286 'exit' => 0, # TODO: Is this right???
2297 directive => 'SKIP',
2303 actual_passed => [],
2305 actual_failed => [],
2310 is_good_plan => TRUE,
2317 skip_all => '(no reason given)',
2323 tests_planned => TRUE,
2327 { actual_passed => FALSE,
2328 is_actual_ok => FALSE,
2335 description => 'Hamlette # TODOORNOTTODO',
2341 actual_passed => [],
2343 actual_failed => [1],
2348 is_good_plan => TRUE,
2349 tests_planned => TRUE,
2356 shbang_misparse => {
2364 { actual_passed => TRUE,
2365 is_actual_ok => TRUE,
2374 { actual_passed => TRUE,
2375 is_actual_ok => TRUE,
2386 passed => [ 1 .. 2 ],
2387 actual_passed => [ 1 .. 2 ],
2389 actual_failed => [],
2394 is_good_plan => TRUE,
2410 { actual_passed => TRUE,
2411 is_actual_ok => TRUE,
2422 __ARGS__ => { switches => ['-Mstrict'] },
2425 actual_passed => [1],
2427 actual_failed => [],
2432 is_good_plan => TRUE,
2448 { actual_passed => TRUE,
2449 is_actual_ok => TRUE,
2460 __ARGS__ => { switches => ['-Iexamples'] },
2463 actual_passed => [1],
2465 actual_failed => [],
2470 is_good_plan => TRUE,
2478 sequence_misparse => {
2486 { actual_passed => TRUE,
2487 is_actual_ok => TRUE,
2496 { actual_passed => TRUE,
2497 is_actual_ok => TRUE,
2506 { actual_passed => TRUE,
2507 is_actual_ok => TRUE,
2514 description => "\# skipped on foobar system",
2516 { is_comment => TRUE,
2517 comment => '1234567890123456789012345678901234567890',
2519 { actual_passed => TRUE,
2520 is_actual_ok => TRUE,
2529 { is_comment => TRUE,
2530 comment => '1234567890123456789012345678901234567890',
2532 { actual_passed => TRUE,
2533 is_actual_ok => TRUE,
2544 passed => [ 1 .. 5 ],
2545 actual_passed => [ 1 .. 5 ],
2547 actual_failed => [],
2552 is_good_plan => TRUE,
2563 { is_comment => TRUE,
2566 comment => 'comments',
2568 { actual_passed => TRUE,
2569 is_actual_ok => TRUE,
2579 { actual_passed => TRUE,
2580 is_actual_ok => TRUE,
2590 { actual_passed => TRUE,
2591 is_actual_ok => TRUE,
2601 { is_comment => TRUE,
2604 comment => 'comment',
2606 { actual_passed => TRUE,
2607 is_actual_ok => TRUE,
2617 { is_comment => TRUE,
2620 comment => 'more ignored stuff',
2622 { is_comment => TRUE,
2625 comment => 'and yet more',
2635 passed => [ 1 .. 4 ],
2636 actual_passed => [ 1 .. 4 ],
2638 actual_failed => [],
2643 is_good_plan => TRUE,
2653 junk_before_plan => {
2655 { is_unknown => TRUE,
2656 raw => 'this is junk',
2658 { is_comment => TRUE,
2659 comment => "this is a comment",
2667 { actual_passed => TRUE,
2668 is_actual_ok => TRUE,
2678 passed => [ 1 .. 1 ],
2679 actual_passed => [ 1 .. 1 ],
2681 actual_failed => [],
2686 is_good_plan => TRUE,
2696 { is_version => TRUE,
2697 raw => 'TAP version 13',
2705 { actual_passed => TRUE,
2706 is_actual_ok => TRUE,
2715 { actual_passed => TRUE,
2716 is_actual_ok => TRUE,
2725 { actual_passed => TRUE,
2726 is_actual_ok => TRUE,
2735 { actual_passed => TRUE,
2736 is_actual_ok => TRUE,
2745 { actual_passed => TRUE,
2746 is_actual_ok => TRUE,
2757 passed => [ 1 .. 5 ],
2758 actual_passed => [ 1 .. 5 ],
2760 actual_failed => [],
2765 is_good_plan => TRUE,
2775 { is_version => TRUE,
2776 raw => 'TAP version 12',
2784 { actual_passed => TRUE,
2785 is_actual_ok => TRUE,
2794 { actual_passed => TRUE,
2795 is_actual_ok => TRUE,
2804 { actual_passed => TRUE,
2805 is_actual_ok => TRUE,
2814 { actual_passed => TRUE,
2815 is_actual_ok => TRUE,
2824 { actual_passed => TRUE,
2825 is_actual_ok => TRUE,
2836 passed => [ 1 .. 5 ],
2837 actual_passed => [ 1 .. 5 ],
2839 actual_failed => [],
2844 is_good_plan => TRUE,
2848 ['Explicit TAP version must be at least 13. Got version 12'],
2861 { is_version => TRUE,
2862 raw => 'TAP version 13',
2864 { actual_passed => TRUE,
2865 is_actual_ok => TRUE,
2874 { actual_passed => TRUE,
2875 is_actual_ok => TRUE,
2884 { actual_passed => TRUE,
2885 is_actual_ok => TRUE,
2894 { actual_passed => TRUE,
2895 is_actual_ok => TRUE,
2904 { actual_passed => TRUE,
2905 is_actual_ok => TRUE,
2916 passed => [ 1 .. 5 ],
2917 actual_passed => [ 1 .. 5 ],
2919 actual_failed => [],
2924 is_good_plan => TRUE,
2928 ['If TAP version is present it must be the first line of output'],
2942 { actual_passed => TRUE,
2943 is_actual_ok => TRUE,
2945 'Should parse as literal backslash --> \\',
2952 is_unplanned => FALSE,
2954 { actual_passed => TRUE,
2955 is_actual_ok => TRUE,
2962 description => 'Not a continuation line',
2963 is_unplanned => FALSE,
2967 passed => [ 1 .. 2 ],
2968 actual_passed => [ 1 .. 2 ],
2970 actual_failed => [],
2975 is_good_plan => TRUE,
2992 { actual_passed => TRUE,
2993 is_actual_ok => TRUE,
2994 description => 'Not a \\# TODO',
3001 is_unplanned => FALSE,
3003 { actual_passed => TRUE,
3004 is_actual_ok => TRUE,
3011 description => 'Not a \\# SKIP',
3012 is_unplanned => FALSE,
3014 { actual_passed => TRUE,
3015 is_actual_ok => TRUE,
3022 description => 'Escaped \\\\\\#',
3023 is_unplanned => FALSE,
3027 passed => [ 1 .. 3 ],
3028 actual_passed => [ 1 .. 3 ],
3030 actual_failed => [],
3035 is_good_plan => TRUE,
3046 NOT_ZERO, sub { local $^W; 0 != shift },
3047 TRUE, sub { local $^W; !!shift },
3048 FALSE, sub { local $^W; !shift },
3051 my $can_open3 = ( $Config{d_fork} || $IsWin32 ) ? 1 : 0;
3053 for my $hide_fork ( 0 .. $can_open3 ) {
3057 *{'TAP::Parser::Iterator::Process::_use_open3'} = sub {return};
3061 for my $test ( sort keys %samples ) {
3063 #next unless 'empty' eq $test;
3064 my %details = %{ $samples{$test} };
3066 if ( my $skip_if = delete $details{skip_if} ) {
3067 next TEST if $skip_if->();
3070 my $results = delete $details{results};
3071 my $args = delete $details{__ARGS__};
3072 my $need_open3 = delete $details{need_open3};
3074 next TEST if $need_open3 && ( $hide_fork || !$can_open3 );
3076 # the following acrobatics are necessary to make it easy for the
3077 # Test::Builder::failure_output() method to be overridden when
3078 # TAP::Parser is not installed. Otherwise, these tests will fail.
3080 unshift @{ $args->{switches} },
3081 $ENV{PERL_CORE} ? ( map {"-I$_"} @INC ) : ('-It/lib');
3083 $args->{source} = File::Spec->catfile( $SAMPLE_TESTS, $test );
3084 $args->{merge} = !$hide_fork;
3086 my $parser = eval { analyze_test( $test, [@$results], $args ) };
3088 ok !$error, "'$test' should parse successfully"
3093 while ( my ( $method, $answer ) = each %details ) {
3094 $tests += ref $answer ? 2 : 1;
3097 skip "$test did not parse successfully", $tests;
3101 while ( my ( $method, $answer ) = each %details ) {
3102 if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck
3103 ok $handler->( $parser->$method() ),
3104 "... and $method should return a reasonable value ($test)";
3106 elsif ( !ref $answer ) {
3107 local $^W; # uninit warnings
3109 $answer = _vmsify_answer( $method, $answer );
3111 is $parser->$method(), $answer,
3112 "... and $method should equal $answer ($test)";
3115 is scalar $parser->$method(), scalar @$answer,
3116 "... and $method should be the correct amount ($test)";
3117 is_deeply [ $parser->$method() ], $answer,
3118 "... and $method should be the correct values ($test)";
3125 my %Unix2VMS_Exit_Codes = ( 1 => 4, );
3127 sub _vmsify_answer {
3128 my ( $method, $answer ) = @_;
3130 return $answer unless $IsVMS;
3132 if ( $method eq 'exit'
3133 and exists $Unix2VMS_Exit_Codes{$answer} )
3135 $answer = $Unix2VMS_Exit_Codes{$answer};
3142 my ( $test, $results, $args ) = @_;
3144 my $parser = TAP::Parser->new($args);
3146 while ( defined( my $result = $parser->next ) ) {
3148 my $expected = shift @$results;
3151 ? $result->description
3153 $desc = $result->plan
3154 if $result->is_plan && $desc =~ /SKIP/i;
3155 $desc =~ s/#/<hash>/g;
3156 $desc =~ s/\s+/ /g; # Drop newlines
3157 ok defined $expected,
3158 "$test/$count We should have a result for $desc";
3159 while ( my ( $method, $answer ) = each %$expected ) {
3161 if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck
3162 ok $handler->( $result->$method() ),
3163 "... and $method should return a reasonable value ($test/$count)";
3165 elsif ( ref $answer ) {
3166 is_deeply scalar( $result->$method() ), $answer,
3167 "... and $method should return the correct structure ($test/$count)";
3170 is $result->$method(), $answer,
3171 "... and $method should return the correct answer ($test/$count)";
3177 "... and we should have the correct number of results ($test)";