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(
34 ? ( File::Spec->updir(), 'ext', 'Test-Harness' )
41 my %deprecated = map { $_ => 1 } qw(
42 TAP::Parser::good_plan
43 TAP::Parser::Result::Plan::passed
44 TAP::Parser::Result::Test::passed
45 TAP::Parser::Result::Test::actual_passed
46 TAP::Parser::Result::passed
48 $SIG{__WARN__} = sub {
49 if ( $_[0] =~ /is deprecated/ ) {
50 my @caller = caller(1);
52 ok exists $deprecated{$sub},
53 "... we should get a deprecated warning for $sub";
60 # the %samples keys are the names of test scripts in t/sample-tests
70 { actual_passed => TRUE,
72 description => "Interlock activated",
79 is_unplanned => FALSE,
81 { actual_passed => TRUE,
89 description => "Megathrusters are go",
90 is_unplanned => FALSE,
92 { actual_passed => TRUE,
100 description => "Head formed",
101 is_unplanned => FALSE,
103 { actual_passed => TRUE,
104 is_actual_ok => TRUE,
111 description => "Blazing sword formed",
112 is_unplanned => FALSE,
114 { actual_passed => TRUE,
115 is_actual_ok => TRUE,
122 description => "Robeast destroyed",
123 is_unplanned => FALSE,
127 passed => [ 1 .. 5 ],
128 actual_passed => [ 1 .. 5 ],
135 is_good_plan => TRUE,
143 descriptive_trailing => {
145 { actual_passed => TRUE,
146 is_actual_ok => TRUE,
147 description => "Interlock activated",
154 is_unplanned => FALSE,
156 { actual_passed => TRUE,
157 is_actual_ok => TRUE,
164 description => "Megathrusters are go",
165 is_unplanned => FALSE,
167 { actual_passed => TRUE,
168 is_actual_ok => TRUE,
175 description => "Head formed",
176 is_unplanned => FALSE,
178 { actual_passed => TRUE,
179 is_actual_ok => TRUE,
186 description => "Blazing sword formed",
187 is_unplanned => FALSE,
189 { actual_passed => TRUE,
190 is_actual_ok => TRUE,
197 description => "Robeast destroyed",
198 is_unplanned => FALSE,
208 passed => [ 1 .. 5 ],
209 actual_passed => [ 1 .. 5 ],
216 is_good_plan => TRUE,
235 is_good_plan => FALSE,
236 tests_planned => undef,
238 parse_errors => ['No plan found in TAP output'],
251 { actual_passed => TRUE,
252 is_actual_ok => TRUE,
261 { actual_passed => TRUE,
262 is_actual_ok => TRUE,
271 { actual_passed => TRUE,
272 is_actual_ok => TRUE,
281 { actual_passed => TRUE,
282 is_actual_ok => TRUE,
291 { actual_passed => TRUE,
292 is_actual_ok => TRUE,
303 passed => [ 1 .. 5 ],
304 actual_passed => [ 1 .. 5 ],
311 is_good_plan => TRUE,
319 space_after_plan => {
327 { actual_passed => TRUE,
328 is_actual_ok => TRUE,
337 { actual_passed => TRUE,
338 is_actual_ok => TRUE,
347 { actual_passed => TRUE,
348 is_actual_ok => TRUE,
357 { actual_passed => TRUE,
358 is_actual_ok => TRUE,
367 { actual_passed => TRUE,
368 is_actual_ok => TRUE,
379 passed => [ 1 .. 5 ],
380 actual_passed => [ 1 .. 5 ],
387 is_good_plan => TRUE,
397 { is_version => TRUE,
398 raw => 'TAP version 13',
406 { actual_passed => TRUE,
407 is_actual_ok => TRUE,
416 { actual_passed => TRUE,
417 is_actual_ok => TRUE,
428 { 'fnurk' => 'skib', 'ponk' => 'gleeb' },
429 { 'bar' => 'krup', 'foo' => 'plink' }
432 " ---\n -\n fnurk: skib\n ponk: gleeb\n -\n bar: krup\n foo: plink\n ...",
434 { actual_passed => TRUE,
435 is_actual_ok => TRUE,
444 { actual_passed => TRUE,
445 is_actual_ok => TRUE,
456 'got' => [ '1', 'pong', '4' ],
457 'expected' => [ '1', '2', '4' ]
460 " ---\n expected:\n - 1\n - 2\n - 4\n got:\n - 1\n - pong\n - 4\n ...",
462 { actual_passed => TRUE,
463 is_actual_ok => TRUE,
474 passed => [ 1 .. 5 ],
475 actual_passed => [ 1 .. 5 ],
482 is_good_plan => TRUE,
498 { actual_passed => TRUE,
499 is_actual_ok => TRUE,
508 { actual_passed => FALSE,
509 is_actual_ok => FALSE,
518 { actual_passed => TRUE,
519 is_actual_ok => TRUE,
528 { actual_passed => TRUE,
529 is_actual_ok => TRUE,
538 { actual_passed => FALSE,
539 is_actual_ok => FALSE,
550 passed => [ 1, 3, 4 ],
551 actual_passed => [ 1, 3, 4 ],
553 actual_failed => [ 2, 5 ],
558 is_good_plan => TRUE,
574 { actual_passed => TRUE,
575 is_actual_ok => TRUE,
584 { actual_passed => TRUE,
585 is_actual_ok => TRUE,
593 explanation => 'rain delay',
595 { actual_passed => TRUE,
596 is_actual_ok => TRUE,
605 { actual_passed => TRUE,
606 is_actual_ok => TRUE,
615 { actual_passed => TRUE,
616 is_actual_ok => TRUE,
627 passed => [ 1 .. 5 ],
628 actual_passed => [ 1 .. 5 ],
635 is_good_plan => TRUE,
651 { actual_passed => TRUE,
652 is_actual_ok => TRUE,
665 actual_passed => [1],
672 is_good_plan => TRUE,
688 { actual_passed => FALSE,
689 is_actual_ok => FALSE,
696 description => "- Foo",
697 explanation => 'Just testing the todo interface.',
699 { actual_passed => TRUE,
700 is_actual_ok => TRUE,
707 description => "- Unexpected success",
708 explanation => 'Just testing the todo interface.',
710 { actual_passed => TRUE,
711 is_actual_ok => TRUE,
718 description => "- This is not todo",
723 passed => [ 1, 2, 3 ],
724 actual_passed => [ 2, 3 ],
726 actual_failed => [1],
731 is_good_plan => TRUE,
744 raw => '1..5 todo 3 2;',
746 todo_list => [ 3, 2 ],
748 { actual_passed => TRUE,
749 is_actual_ok => TRUE,
759 { actual_passed => TRUE,
760 is_actual_ok => TRUE,
770 { actual_passed => FALSE,
771 is_actual_ok => FALSE,
781 { actual_passed => TRUE,
782 is_actual_ok => TRUE,
792 { actual_passed => TRUE,
793 is_actual_ok => TRUE,
805 passed => [ 1, 2, 3, 4, 5 ],
806 actual_passed => [ 1, 2, 4, 5 ],
808 actual_failed => [3],
813 is_good_plan => TRUE,
829 { actual_passed => TRUE,
830 is_actual_ok => TRUE,
839 is_unplanned => FALSE,
841 { actual_passed => TRUE,
842 is_actual_ok => TRUE,
851 is_unplanned => FALSE,
853 { actual_passed => TRUE,
854 is_actual_ok => TRUE,
863 is_unplanned => FALSE,
865 { actual_passed => TRUE,
866 is_actual_ok => TRUE,
875 is_unplanned => FALSE,
877 { actual_passed => TRUE,
878 is_actual_ok => TRUE,
887 is_unplanned => FALSE,
889 { actual_passed => TRUE,
890 is_actual_ok => TRUE,
899 is_unplanned => FALSE,
901 { actual_passed => TRUE,
902 is_actual_ok => TRUE,
911 is_unplanned => FALSE,
913 { actual_passed => TRUE,
914 is_actual_ok => TRUE,
923 is_unplanned => FALSE,
925 { actual_passed => TRUE,
926 is_actual_ok => TRUE,
935 is_unplanned => FALSE,
937 { actual_passed => TRUE,
938 is_actual_ok => TRUE,
947 is_unplanned => FALSE,
949 { actual_passed => TRUE,
950 is_actual_ok => TRUE,
959 is_unplanned => TRUE,
963 passed => [ 1 .. 4, 4 .. 9 ],
964 actual_passed => [ 1 .. 4, 4 .. 10 ],
974 'Tests out of sequence. Found (4) but expected (5)',
975 'Tests out of sequence. Found (5) but expected (6)',
976 'Tests out of sequence. Found (6) but expected (7)',
977 'Tests out of sequence. Found (7) but expected (8)',
978 'Tests out of sequence. Found (8) but expected (9)',
979 'Tests out of sequence. Found (9) but expected (10)',
980 'Tests out of sequence. Found (10) but expected (11)',
981 'Bad plan. You planned 10 tests but ran 11.',
994 { actual_passed => TRUE,
995 is_actual_ok => TRUE,
1004 { actual_passed => TRUE,
1005 is_actual_ok => TRUE,
1014 { actual_passed => FALSE,
1015 is_actual_ok => FALSE,
1024 { actual_passed => TRUE,
1025 is_actual_ok => TRUE,
1034 { actual_passed => TRUE,
1035 is_actual_ok => TRUE,
1046 passed => [ 1, 2, 4, 5 ],
1047 actual_passed => [ 1, 2, 4, 5 ],
1049 actual_failed => [3],
1054 is_good_plan => TRUE,
1070 { actual_passed => TRUE,
1071 is_actual_ok => TRUE,
1080 { actual_passed => TRUE,
1081 is_actual_ok => TRUE,
1090 { actual_passed => TRUE,
1091 is_actual_ok => TRUE,
1100 { is_bailout => TRUE,
1101 explanation => "GERONIMMMOOOOOO!!!",
1103 { actual_passed => TRUE,
1104 is_actual_ok => TRUE,
1113 { actual_passed => TRUE,
1114 is_actual_ok => TRUE,
1125 passed => [ 1 .. 5 ],
1126 actual_passed => [ 1 .. 5 ],
1128 actual_failed => [],
1133 is_good_plan => TRUE,
1145 actual_passed => [],
1147 actual_failed => [],
1152 tests_planned => undef,
1154 parse_errors => [ 'No plan found in TAP output', ],
1166 { actual_passed => TRUE,
1167 is_actual_ok => TRUE,
1175 is_unplanned => FALSE,
1177 { actual_passed => TRUE,
1178 is_actual_ok => TRUE,
1186 is_unplanned => FALSE,
1188 { actual_passed => TRUE,
1189 is_actual_ok => TRUE,
1197 is_unplanned => FALSE,
1199 { actual_passed => TRUE,
1200 is_actual_ok => TRUE,
1208 is_unplanned => TRUE,
1210 { actual_passed => TRUE,
1211 is_actual_ok => TRUE,
1219 is_unplanned => TRUE,
1221 { actual_passed => TRUE,
1222 is_actual_ok => TRUE,
1230 is_unplanned => TRUE,
1232 { actual_passed => TRUE,
1233 is_actual_ok => TRUE,
1241 is_unplanned => TRUE,
1245 passed => [ 1 .. 3 ],
1246 actual_passed => [ 1 .. 7 ],
1247 failed => [ 4 .. 7 ],
1248 actual_failed => [],
1255 parse_errors => ['Bad plan. You planned 3 tests but ran 7.'],
1258 skip_if => sub {$IsVMS},
1266 tests_planned => TRUE,
1268 { actual_passed => TRUE,
1269 is_actual_ok => TRUE,
1270 description => "- -T honored",
1280 passed => [ 1 .. 1 ],
1281 actual_passed => [ 1 .. 1 ],
1283 actual_failed => [],
1288 is_good_plan => TRUE,
1289 tests_planned => TRUE,
1300 actual_passed => [],
1302 actual_failed => [],
1307 tests_planned => undef,
1309 parse_errors => [ 'No plan found in TAP output', ],
1315 { actual_passed => TRUE,
1316 is_actual_ok => TRUE,
1326 { actual_passed => TRUE,
1327 is_actual_ok => TRUE,
1337 { actual_passed => TRUE,
1338 is_actual_ok => TRUE,
1348 { actual_passed => TRUE,
1349 is_actual_ok => TRUE,
1361 passed => [ 1 .. 4 ],
1362 actual_passed => [ 1 .. 4 ],
1364 actual_failed => [],
1369 tests_planned => undef,
1371 parse_errors => [ 'No plan found in TAP output', ],
1375 die_last_minute => {
1377 { actual_passed => TRUE,
1378 is_actual_ok => TRUE,
1388 { actual_passed => TRUE,
1389 is_actual_ok => TRUE,
1399 { actual_passed => TRUE,
1400 is_actual_ok => TRUE,
1410 { actual_passed => TRUE,
1411 is_actual_ok => TRUE,
1429 passed => [ 1 .. 4 ],
1430 actual_passed => [ 1 .. 4 ],
1432 actual_failed => [],
1437 is_good_plan => TRUE,
1452 { actual_passed => TRUE,
1453 is_actual_ok => TRUE,
1463 { actual_passed => TRUE,
1464 is_actual_ok => TRUE,
1474 { actual_passed => TRUE,
1475 is_actual_ok => TRUE,
1481 number => 136211425,
1485 { actual_passed => TRUE,
1486 is_actual_ok => TRUE,
1492 number => 136211426,
1499 actual_passed => [ 1, 2, 136211425, 136211426 ],
1500 failed => [ 136211425, 136211426 ],
1501 actual_failed => [],
1509 'Tests out of sequence. Found (136211425) but expected (3)',
1510 'Tests out of sequence. Found (136211426) but expected (4)',
1511 'Bad plan. You planned 2 tests but ran 4.'
1524 { actual_passed => TRUE,
1525 is_actual_ok => TRUE,
1535 { actual_passed => TRUE,
1536 is_actual_ok => TRUE,
1546 { actual_passed => TRUE,
1547 is_actual_ok => TRUE,
1557 { actual_passed => TRUE,
1558 is_actual_ok => TRUE,
1568 { actual_passed => TRUE,
1569 is_actual_ok => TRUE,
1579 { actual_passed => TRUE,
1580 is_actual_ok => TRUE,
1590 { actual_passed => TRUE,
1591 is_actual_ok => TRUE,
1601 { actual_passed => TRUE,
1602 is_actual_ok => TRUE,
1612 { actual_passed => TRUE,
1613 is_actual_ok => TRUE,
1623 { actual_passed => TRUE,
1624 is_actual_ok => TRUE,
1634 { actual_passed => TRUE,
1635 is_actual_ok => TRUE,
1648 actual_passed => [ 1, 2, 99997 .. 100005 ],
1649 failed => [ 99997 .. 100005 ],
1650 actual_failed => [],
1658 'Tests out of sequence. Found (99997) but expected (3)',
1659 'Tests out of sequence. Found (99998) but expected (4)',
1660 'Tests out of sequence. Found (99999) but expected (5)',
1661 'Tests out of sequence. Found (100000) but expected (6)',
1662 'Tests out of sequence. Found (100001) but expected (7)',
1663 'Tests out of sequence. Found (100002) but expected (8)',
1664 'Tests out of sequence. Found (100003) but expected (9)',
1665 'Tests out of sequence. Found (100004) but expected (10)',
1666 'Tests out of sequence. Found (100005) but expected (11)',
1667 'Bad plan. You planned 2 tests but ran 11.'
1678 tests_planned => 10,
1680 { actual_passed => TRUE,
1681 is_actual_ok => TRUE,
1691 { actual_passed => TRUE,
1692 is_actual_ok => TRUE,
1699 description => 'basset hounds got long ears',
1702 { actual_passed => FALSE,
1703 is_actual_ok => FALSE,
1710 description => 'all hell broke loose',
1713 { actual_passed => FALSE,
1714 is_actual_ok => FALSE,
1722 explanation => 'if I heard a voice from heaven ...',
1724 { actual_passed => TRUE,
1725 is_actual_ok => TRUE,
1732 description => 'say "live without loving",',
1735 { actual_passed => TRUE,
1736 is_actual_ok => TRUE,
1743 description => "I'd beg off.",
1746 { actual_passed => TRUE,
1747 is_actual_ok => TRUE,
1755 explanation => 'contract negotiations',
1757 { actual_passed => TRUE,
1758 is_actual_ok => TRUE,
1765 description => 'Girls are such exquisite hell',
1768 { actual_passed => TRUE,
1769 is_actual_ok => TRUE,
1776 description => 'Elegy 9B',
1779 { actual_passed => FALSE,
1780 is_actual_ok => FALSE,
1792 passed => [ 1 .. 2, 4 .. 9 ],
1793 actual_passed => [ 1 .. 2, 5 .. 9 ],
1794 failed => [ 3, 10 ],
1795 actual_failed => [ 3, 4, 10 ],
1800 is_good_plan => TRUE,
1801 tests_planned => 10,
1810 { is_comment => TRUE,
1813 comment => 'comments',
1815 { actual_passed => TRUE,
1816 is_actual_ok => TRUE,
1826 { actual_passed => TRUE,
1827 is_actual_ok => TRUE,
1837 { actual_passed => TRUE,
1838 is_actual_ok => TRUE,
1848 { actual_passed => TRUE,
1849 is_actual_ok => TRUE,
1859 { is_comment => TRUE,
1862 comment => 'comment',
1870 { is_comment => TRUE,
1873 comment => 'more ignored stuff',
1875 { is_comment => TRUE,
1878 comment => 'and yet more',
1882 passed => [ 1 .. 4 ],
1883 actual_passed => [ 1 .. 4 ],
1885 actual_failed => [],
1890 is_good_plan => TRUE,
1900 { is_comment => TRUE,
1903 comment => 'comments',
1905 { actual_passed => TRUE,
1906 is_actual_ok => TRUE,
1916 { actual_passed => FALSE,
1917 is_actual_ok => FALSE,
1927 { actual_passed => TRUE,
1928 is_actual_ok => TRUE,
1938 { actual_passed => TRUE,
1939 is_actual_ok => TRUE,
1949 { is_comment => TRUE,
1952 comment => 'comment',
1960 { is_comment => TRUE,
1963 comment => 'more ignored stuff',
1965 { is_comment => TRUE,
1968 comment => 'and yet more',
1972 passed => [ 1, 3, 4 ],
1973 actual_passed => [ 1, 3, 4 ],
1975 actual_failed => [2],
1980 is_good_plan => TRUE,
1990 { actual_passed => TRUE,
1991 is_actual_ok => TRUE,
1998 description => '- Test that argument passing works',
2001 { actual_passed => TRUE,
2002 is_actual_ok => TRUE,
2010 '- Test that passing arguments as references work',
2013 { actual_passed => TRUE,
2014 is_actual_ok => TRUE,
2021 description => '- Test a normal sub',
2024 { actual_passed => TRUE,
2025 is_actual_ok => TRUE,
2032 description => '- Detach test',
2035 { actual_passed => TRUE,
2036 is_actual_ok => TRUE,
2043 description => '- Nested thread test',
2046 { actual_passed => TRUE,
2047 is_actual_ok => TRUE,
2054 description => '- Nested thread test',
2057 { actual_passed => TRUE,
2058 is_actual_ok => TRUE,
2065 description => '- Wanted 7, got 7',
2068 { actual_passed => TRUE,
2069 is_actual_ok => TRUE,
2076 description => '- Wanted 7, got 7',
2079 { actual_passed => TRUE,
2080 is_actual_ok => TRUE,
2087 description => '- Wanted 8, got 8',
2090 { actual_passed => TRUE,
2091 is_actual_ok => TRUE,
2098 description => '- Wanted 8, got 8',
2105 tests_planned => 15,
2107 { actual_passed => TRUE,
2108 is_actual_ok => TRUE,
2118 { actual_passed => TRUE,
2119 is_actual_ok => TRUE,
2126 description => '- Check that Config::threads is true',
2129 { actual_passed => TRUE,
2130 is_actual_ok => TRUE,
2137 description => '- Detach test',
2140 { actual_passed => TRUE,
2141 is_actual_ok => TRUE,
2149 '- Check so that tid for threads work for main thread',
2152 { actual_passed => TRUE,
2153 is_actual_ok => TRUE,
2161 '- Check so that tid for threads work for main thread',
2166 passed => [ 2 .. 4, 6, 8 .. 13, 1, 5, 7, 14, 15 ],
2167 actual_passed => [ 2 .. 4, 6, 8 .. 13, 1, 5, 7, 14, 15 ],
2169 actual_failed => [],
2173 is_good_plan => FALSE,
2174 tests_planned => 15,
2177 # Note that tests 14 and 15 *are* in the correct sequence.
2179 'Tests out of sequence. Found (2) but expected (1)',
2180 'Tests out of sequence. Found (3) but expected (2)',
2181 'Tests out of sequence. Found (4) but expected (3)',
2182 'Tests out of sequence. Found (6) but expected (4)',
2183 'Tests out of sequence. Found (8) but expected (5)',
2184 'Tests out of sequence. Found (9) but expected (6)',
2185 'Tests out of sequence. Found (10) but expected (7)',
2186 'Tests out of sequence. Found (11) but expected (8)',
2187 'Tests out of sequence. Found (12) but expected (9)',
2188 'Tests out of sequence. Found (13) but expected (10)',
2189 'Plan (1..15) must be at the beginning or end of the TAP output',
2190 'Tests out of sequence. Found (1) but expected (11)',
2191 'Tests out of sequence. Found (5) but expected (12)',
2192 'Tests out of sequence. Found (7) but expected (13)',
2200 raw => '1..0 # skipping: rope',
2204 directive => 'SKIP',
2205 explanation => 'rope'
2210 actual_passed => [],
2212 actual_failed => [],
2217 is_good_plan => TRUE,
2228 { is_version => TRUE,
2229 raw => 'TAP version 13',
2231 { is_unknown => TRUE,
2232 raw => '1..0 # skipping: rope',
2237 actual_passed => [],
2239 actual_failed => [],
2244 is_good_plan => FALSE,
2245 tests_planned => FALSE,
2247 parse_errors => ['No plan found in TAP output'],
2254 { is_version => TRUE,
2255 raw => 'TAP version 13',
2260 { is_pragma => TRUE,
2261 raw => 'pragma +strict',
2262 pragmas => ['+strict'],
2264 { is_unknown => TRUE, raw => 'Nonsense!',
2266 { is_pragma => TRUE,
2267 raw => 'pragma -strict',
2268 pragmas => ['-strict'],
2270 { is_unknown => TRUE,
2271 raw => "Doesn't matter.",
2274 raw => 'ok 1 All OK',
2279 actual_passed => [1],
2281 actual_failed => [],
2286 is_good_plan => TRUE,
2289 parse_errors => ['Unknown TAP token: "Nonsense!"'],
2290 'exit' => 0, # TODO: Is this right???
2301 directive => 'SKIP',
2307 actual_passed => [],
2309 actual_failed => [],
2314 is_good_plan => TRUE,
2321 skip_all => '(no reason given)',
2327 tests_planned => TRUE,
2331 { actual_passed => FALSE,
2332 is_actual_ok => FALSE,
2339 description => 'Hamlette # TODOORNOTTODO',
2345 actual_passed => [],
2347 actual_failed => [1],
2352 is_good_plan => TRUE,
2353 tests_planned => TRUE,
2360 shbang_misparse => {
2368 { actual_passed => TRUE,
2369 is_actual_ok => TRUE,
2378 { actual_passed => TRUE,
2379 is_actual_ok => TRUE,
2390 passed => [ 1 .. 2 ],
2391 actual_passed => [ 1 .. 2 ],
2393 actual_failed => [],
2398 is_good_plan => TRUE,
2414 { actual_passed => TRUE,
2415 is_actual_ok => TRUE,
2426 __ARGS__ => { switches => ['-Mstrict'] },
2429 actual_passed => [1],
2431 actual_failed => [],
2436 is_good_plan => TRUE,
2452 { actual_passed => TRUE,
2453 is_actual_ok => TRUE,
2464 __ARGS__ => { switches => ['-Iexamples'] },
2467 actual_passed => [1],
2469 actual_failed => [],
2474 is_good_plan => TRUE,
2482 sequence_misparse => {
2490 { actual_passed => TRUE,
2491 is_actual_ok => TRUE,
2500 { actual_passed => TRUE,
2501 is_actual_ok => TRUE,
2510 { actual_passed => TRUE,
2511 is_actual_ok => TRUE,
2518 description => "\# skipped on foobar system",
2520 { is_comment => TRUE,
2521 comment => '1234567890123456789012345678901234567890',
2523 { actual_passed => TRUE,
2524 is_actual_ok => TRUE,
2533 { is_comment => TRUE,
2534 comment => '1234567890123456789012345678901234567890',
2536 { actual_passed => TRUE,
2537 is_actual_ok => TRUE,
2548 passed => [ 1 .. 5 ],
2549 actual_passed => [ 1 .. 5 ],
2551 actual_failed => [],
2556 is_good_plan => TRUE,
2565 # For some reason mixing stdout with stderr is unreliable on Windows
2568 : ( stdout_stderr => {
2570 { is_comment => TRUE,
2573 comment => 'comments',
2575 { actual_passed => TRUE,
2576 is_actual_ok => TRUE,
2586 { actual_passed => TRUE,
2587 is_actual_ok => TRUE,
2597 { actual_passed => TRUE,
2598 is_actual_ok => TRUE,
2608 { is_comment => TRUE,
2611 comment => 'comment',
2613 { actual_passed => TRUE,
2614 is_actual_ok => TRUE,
2624 { is_comment => TRUE,
2627 comment => 'more ignored stuff',
2629 { is_comment => TRUE,
2632 comment => 'and yet more',
2642 passed => [ 1 .. 4 ],
2643 actual_passed => [ 1 .. 4 ],
2645 actual_failed => [],
2650 is_good_plan => TRUE,
2662 junk_before_plan => {
2664 { is_unknown => TRUE,
2665 raw => 'this is junk',
2667 { is_comment => TRUE,
2668 comment => "this is a comment",
2676 { actual_passed => TRUE,
2677 is_actual_ok => TRUE,
2687 passed => [ 1 .. 1 ],
2688 actual_passed => [ 1 .. 1 ],
2690 actual_failed => [],
2695 is_good_plan => TRUE,
2705 { is_version => TRUE,
2706 raw => 'TAP version 13',
2714 { actual_passed => TRUE,
2715 is_actual_ok => TRUE,
2724 { actual_passed => TRUE,
2725 is_actual_ok => TRUE,
2734 { actual_passed => TRUE,
2735 is_actual_ok => TRUE,
2744 { actual_passed => TRUE,
2745 is_actual_ok => TRUE,
2754 { actual_passed => TRUE,
2755 is_actual_ok => TRUE,
2766 passed => [ 1 .. 5 ],
2767 actual_passed => [ 1 .. 5 ],
2769 actual_failed => [],
2774 is_good_plan => TRUE,
2784 { is_version => TRUE,
2785 raw => 'TAP version 12',
2793 { actual_passed => TRUE,
2794 is_actual_ok => TRUE,
2803 { actual_passed => TRUE,
2804 is_actual_ok => TRUE,
2813 { actual_passed => TRUE,
2814 is_actual_ok => TRUE,
2823 { actual_passed => TRUE,
2824 is_actual_ok => TRUE,
2833 { actual_passed => TRUE,
2834 is_actual_ok => TRUE,
2845 passed => [ 1 .. 5 ],
2846 actual_passed => [ 1 .. 5 ],
2848 actual_failed => [],
2853 is_good_plan => TRUE,
2857 ['Explicit TAP version must be at least 13. Got version 12'],
2870 { is_version => TRUE,
2871 raw => 'TAP version 13',
2873 { actual_passed => TRUE,
2874 is_actual_ok => TRUE,
2883 { actual_passed => TRUE,
2884 is_actual_ok => TRUE,
2893 { actual_passed => TRUE,
2894 is_actual_ok => TRUE,
2903 { actual_passed => TRUE,
2904 is_actual_ok => TRUE,
2913 { actual_passed => TRUE,
2914 is_actual_ok => TRUE,
2925 passed => [ 1 .. 5 ],
2926 actual_passed => [ 1 .. 5 ],
2928 actual_failed => [],
2933 is_good_plan => TRUE,
2937 ['If TAP version is present it must be the first line of output'],
2951 { actual_passed => TRUE,
2952 is_actual_ok => TRUE,
2954 'Should parse as literal backslash --> \\',
2961 is_unplanned => FALSE,
2963 { actual_passed => TRUE,
2964 is_actual_ok => TRUE,
2971 description => 'Not a continuation line',
2972 is_unplanned => FALSE,
2976 passed => [ 1 .. 2 ],
2977 actual_passed => [ 1 .. 2 ],
2979 actual_failed => [],
2984 is_good_plan => TRUE,
3001 { actual_passed => TRUE,
3002 is_actual_ok => TRUE,
3003 description => 'Not a \\# TODO',
3010 is_unplanned => FALSE,
3012 { actual_passed => TRUE,
3013 is_actual_ok => TRUE,
3020 description => 'Not a \\# SKIP',
3021 is_unplanned => FALSE,
3023 { actual_passed => TRUE,
3024 is_actual_ok => TRUE,
3031 description => 'Escaped \\\\\\#',
3032 is_unplanned => FALSE,
3036 passed => [ 1 .. 3 ],
3037 actual_passed => [ 1 .. 3 ],
3039 actual_failed => [],
3044 is_good_plan => TRUE,
3061 { actual_passed => TRUE,
3062 is_actual_ok => TRUE,
3063 description => '- One',
3070 is_unplanned => FALSE,
3072 { actual_passed => TRUE,
3073 is_actual_ok => TRUE,
3074 description => '- Two',
3081 is_unplanned => FALSE,
3083 { actual_passed => TRUE,
3084 is_actual_ok => TRUE,
3085 description => '- Three',
3092 is_unplanned => FALSE,
3094 { actual_passed => TRUE,
3095 is_actual_ok => TRUE,
3096 description => '- Four',
3103 is_unplanned => FALSE,
3105 { actual_passed => TRUE,
3106 is_actual_ok => TRUE,
3107 description => '- Five',
3114 is_unplanned => FALSE,
3118 passed => [ 1 .. 3, 0, 5 ],
3119 actual_passed => [ 1 .. 3, 0, 5 ],
3121 actual_failed => [],
3126 is_good_plan => TRUE,
3130 'Tests out of sequence. Found (0) but expected (4)',
3139 NOT_ZERO, sub { local $^W; 0 != shift },
3140 TRUE, sub { local $^W; !!shift },
3141 FALSE, sub { local $^W; !shift },
3144 my $can_open3 = ( $Config{d_fork} || $IsWin32 ) ? 1 : 0;
3146 for my $hide_fork ( 0 .. $can_open3 ) {
3150 *{'TAP::Parser::Iterator::Process::_use_open3'} = sub {return};
3154 for my $test ( sort keys %samples ) {
3156 #next unless 'empty' eq $test;
3157 my %details = %{ $samples{$test} };
3159 if ( my $skip_if = delete $details{skip_if} ) {
3160 next TEST if $skip_if->();
3163 my $results = delete $details{results};
3164 my $args = delete $details{__ARGS__};
3165 my $need_open3 = delete $details{need_open3};
3167 next TEST if $need_open3 && ( $hide_fork || !$can_open3 );
3169 # the following acrobatics are necessary to make it easy for the
3170 # Test::Builder::failure_output() method to be overridden when
3171 # TAP::Parser is not installed. Otherwise, these tests will fail.
3173 unshift @{ $args->{switches} },
3174 $ENV{PERL_CORE} ? ( map {"-I$_"} @INC ) : ('-It/lib');
3176 $args->{source} = File::Spec->catfile( $SAMPLE_TESTS, $test );
3177 $args->{merge} = !$hide_fork;
3179 my $parser = eval { analyze_test( $test, [@$results], $args ) };
3181 ok !$error, "'$test' should parse successfully"
3186 while ( my ( $method, $answer ) = each %details ) {
3187 $tests += ref $answer ? 2 : 1;
3190 skip "$test did not parse successfully", $tests;
3194 while ( my ( $method, $answer ) = each %details ) {
3195 if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck
3196 ok $handler->( $parser->$method() ),
3197 "... and $method should return a reasonable value ($test)";
3199 elsif ( !ref $answer ) {
3200 local $^W; # uninit warnings
3202 $answer = _vmsify_answer( $method, $answer );
3204 is $parser->$method(), $answer,
3205 "... and $method should equal $answer ($test)";
3208 is scalar $parser->$method(), scalar @$answer,
3209 "... and $method should be the correct amount ($test)";
3210 is_deeply [ $parser->$method() ], $answer,
3211 "... and $method should be the correct values ($test)";
3218 my %Unix2VMS_Exit_Codes = ( 1 => 4, );
3220 sub _vmsify_answer {
3221 my ( $method, $answer ) = @_;
3223 return $answer unless $IsVMS;
3225 if ( $method eq 'exit'
3226 and exists $Unix2VMS_Exit_Codes{$answer} )
3228 $answer = $Unix2VMS_Exit_Codes{$answer};
3235 my ( $test, $results, $args ) = @_;
3237 my $parser = TAP::Parser->new($args);
3239 while ( defined( my $result = $parser->next ) ) {
3241 my $expected = shift @$results;
3244 ? $result->description
3246 $desc = $result->plan
3247 if $result->is_plan && $desc =~ /SKIP/i;
3248 $desc =~ s/#/<hash>/g;
3249 $desc =~ s/\s+/ /g; # Drop newlines
3250 ok defined $expected,
3251 "$test/$count We should have a result for $desc";
3252 while ( my ( $method, $answer ) = each %$expected ) {
3254 if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck
3255 ok $handler->( $result->$method() ),
3256 "... and $method should return a reasonable value ($test/$count)";
3258 elsif ( ref $answer ) {
3259 is_deeply scalar( $result->$method() ), $answer,
3260 "... and $method should return the correct structure ($test/$count)";
3263 is $result->$method(), $answer,
3264 "... and $method should return the correct answer ($test/$count)";
3270 "... and we should have the correct number of results ($test)";