9 use Test::More 'no_plan';
14 use constant TRUE => "__TRUE__";
15 use constant FALSE => "__FALSE__";
17 # if wait() is non-zero, we cannot reliably predict its value
18 use constant NOT_ZERO => "__NOT_ZERO__";
22 my $IsVMS = $^O eq 'VMS';
23 my $IsWin32 = $^O eq 'MSWin32';
25 my $SAMPLE_TESTS = File::Spec->catdir(
31 my %deprecated = map { $_ => 1 } qw(
32 TAP::Parser::good_plan
33 TAP::Parser::Result::Plan::passed
34 TAP::Parser::Result::Test::passed
35 TAP::Parser::Result::Test::actual_passed
36 TAP::Parser::Result::passed
38 $SIG{__WARN__} = sub {
39 if ( $_[0] =~ /is deprecated/ ) {
40 my @caller = caller(1);
42 ok exists $deprecated{$sub},
43 "... we should get a deprecated warning for $sub";
50 # the %samples keys are the names of test scripts in t/sample-tests
60 { actual_passed => TRUE,
62 description => "Interlock activated",
69 is_unplanned => FALSE,
71 { actual_passed => TRUE,
79 description => "Megathrusters are go",
80 is_unplanned => FALSE,
82 { actual_passed => TRUE,
90 description => "Head formed",
91 is_unplanned => FALSE,
93 { actual_passed => TRUE,
101 description => "Blazing sword formed",
102 is_unplanned => FALSE,
104 { actual_passed => TRUE,
105 is_actual_ok => TRUE,
112 description => "Robeast destroyed",
113 is_unplanned => FALSE,
117 passed => [ 1 .. 5 ],
118 actual_passed => [ 1 .. 5 ],
125 is_good_plan => TRUE,
133 descriptive_trailing => {
135 { actual_passed => TRUE,
136 is_actual_ok => TRUE,
137 description => "Interlock activated",
144 is_unplanned => FALSE,
146 { actual_passed => TRUE,
147 is_actual_ok => TRUE,
154 description => "Megathrusters are go",
155 is_unplanned => FALSE,
157 { actual_passed => TRUE,
158 is_actual_ok => TRUE,
165 description => "Head formed",
166 is_unplanned => FALSE,
168 { actual_passed => TRUE,
169 is_actual_ok => TRUE,
176 description => "Blazing sword formed",
177 is_unplanned => FALSE,
179 { actual_passed => TRUE,
180 is_actual_ok => TRUE,
187 description => "Robeast destroyed",
188 is_unplanned => FALSE,
198 passed => [ 1 .. 5 ],
199 actual_passed => [ 1 .. 5 ],
206 is_good_plan => TRUE,
225 is_good_plan => FALSE,
226 tests_planned => undef,
228 parse_errors => ['No plan found in TAP output'],
241 { actual_passed => TRUE,
242 is_actual_ok => TRUE,
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,
293 passed => [ 1 .. 5 ],
294 actual_passed => [ 1 .. 5 ],
301 is_good_plan => TRUE,
309 space_after_plan => {
317 { actual_passed => TRUE,
318 is_actual_ok => TRUE,
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,
369 passed => [ 1 .. 5 ],
370 actual_passed => [ 1 .. 5 ],
377 is_good_plan => TRUE,
387 { is_version => TRUE,
388 raw => 'TAP version 13',
396 { actual_passed => TRUE,
397 is_actual_ok => TRUE,
406 { actual_passed => TRUE,
407 is_actual_ok => TRUE,
418 { 'fnurk' => 'skib', 'ponk' => 'gleeb' },
419 { 'bar' => 'krup', 'foo' => 'plink' }
422 " ---\n -\n fnurk: skib\n ponk: gleeb\n -\n bar: krup\n foo: plink\n ...",
424 { actual_passed => TRUE,
425 is_actual_ok => TRUE,
434 { actual_passed => TRUE,
435 is_actual_ok => TRUE,
446 'got' => [ '1', 'pong', '4' ],
447 'expected' => [ '1', '2', '4' ]
450 " ---\n expected:\n - 1\n - 2\n - 4\n got:\n - 1\n - pong\n - 4\n ...",
452 { actual_passed => TRUE,
453 is_actual_ok => TRUE,
464 passed => [ 1 .. 5 ],
465 actual_passed => [ 1 .. 5 ],
472 is_good_plan => TRUE,
488 { actual_passed => TRUE,
489 is_actual_ok => TRUE,
498 { actual_passed => FALSE,
499 is_actual_ok => FALSE,
508 { actual_passed => TRUE,
509 is_actual_ok => TRUE,
518 { actual_passed => TRUE,
519 is_actual_ok => TRUE,
528 { actual_passed => FALSE,
529 is_actual_ok => FALSE,
540 passed => [ 1, 3, 4 ],
541 actual_passed => [ 1, 3, 4 ],
543 actual_failed => [ 2, 5 ],
548 is_good_plan => TRUE,
564 { actual_passed => TRUE,
565 is_actual_ok => TRUE,
574 { actual_passed => TRUE,
575 is_actual_ok => TRUE,
583 explanation => 'rain delay',
585 { actual_passed => TRUE,
586 is_actual_ok => TRUE,
595 { actual_passed => TRUE,
596 is_actual_ok => TRUE,
605 { actual_passed => TRUE,
606 is_actual_ok => TRUE,
617 passed => [ 1 .. 5 ],
618 actual_passed => [ 1 .. 5 ],
625 is_good_plan => TRUE,
641 { actual_passed => TRUE,
642 is_actual_ok => TRUE,
655 actual_passed => [1],
662 is_good_plan => TRUE,
678 { actual_passed => FALSE,
679 is_actual_ok => FALSE,
686 description => "- Foo",
687 explanation => 'Just testing the todo interface.',
689 { actual_passed => TRUE,
690 is_actual_ok => TRUE,
697 description => "- Unexpected success",
698 explanation => 'Just testing the todo interface.',
700 { actual_passed => TRUE,
701 is_actual_ok => TRUE,
708 description => "- This is not todo",
713 passed => [ 1, 2, 3 ],
714 actual_passed => [ 2, 3 ],
716 actual_failed => [1],
721 is_good_plan => TRUE,
734 raw => '1..5 todo 3 2;',
736 todo_list => [ 3, 2 ],
738 { actual_passed => TRUE,
739 is_actual_ok => TRUE,
749 { actual_passed => TRUE,
750 is_actual_ok => TRUE,
760 { actual_passed => FALSE,
761 is_actual_ok => FALSE,
771 { actual_passed => TRUE,
772 is_actual_ok => TRUE,
782 { actual_passed => TRUE,
783 is_actual_ok => TRUE,
795 passed => [ 1, 2, 3, 4, 5 ],
796 actual_passed => [ 1, 2, 4, 5 ],
798 actual_failed => [3],
803 is_good_plan => TRUE,
819 { actual_passed => TRUE,
820 is_actual_ok => TRUE,
829 is_unplanned => FALSE,
831 { actual_passed => TRUE,
832 is_actual_ok => TRUE,
841 is_unplanned => FALSE,
843 { actual_passed => TRUE,
844 is_actual_ok => TRUE,
853 is_unplanned => FALSE,
855 { actual_passed => TRUE,
856 is_actual_ok => TRUE,
865 is_unplanned => FALSE,
867 { actual_passed => TRUE,
868 is_actual_ok => TRUE,
877 is_unplanned => FALSE,
879 { actual_passed => TRUE,
880 is_actual_ok => TRUE,
889 is_unplanned => FALSE,
891 { actual_passed => TRUE,
892 is_actual_ok => TRUE,
901 is_unplanned => FALSE,
903 { actual_passed => TRUE,
904 is_actual_ok => TRUE,
913 is_unplanned => FALSE,
915 { actual_passed => TRUE,
916 is_actual_ok => TRUE,
925 is_unplanned => FALSE,
927 { actual_passed => TRUE,
928 is_actual_ok => TRUE,
937 is_unplanned => FALSE,
939 { actual_passed => TRUE,
940 is_actual_ok => TRUE,
949 is_unplanned => TRUE,
953 passed => [ 1 .. 4, 4 .. 9 ],
954 actual_passed => [ 1 .. 4, 4 .. 10 ],
964 'Tests out of sequence. Found (4) but expected (5)',
965 'Tests out of sequence. Found (5) but expected (6)',
966 'Tests out of sequence. Found (6) but expected (7)',
967 'Tests out of sequence. Found (7) but expected (8)',
968 'Tests out of sequence. Found (8) but expected (9)',
969 'Tests out of sequence. Found (9) but expected (10)',
970 'Tests out of sequence. Found (10) but expected (11)',
971 'Bad plan. You planned 10 tests but ran 11.',
984 { actual_passed => TRUE,
985 is_actual_ok => TRUE,
994 { actual_passed => TRUE,
995 is_actual_ok => TRUE,
1004 { actual_passed => FALSE,
1005 is_actual_ok => FALSE,
1014 { actual_passed => TRUE,
1015 is_actual_ok => TRUE,
1024 { actual_passed => TRUE,
1025 is_actual_ok => TRUE,
1036 passed => [ 1, 2, 4, 5 ],
1037 actual_passed => [ 1, 2, 4, 5 ],
1039 actual_failed => [3],
1044 is_good_plan => TRUE,
1060 { actual_passed => TRUE,
1061 is_actual_ok => TRUE,
1070 { actual_passed => TRUE,
1071 is_actual_ok => TRUE,
1080 { actual_passed => TRUE,
1081 is_actual_ok => TRUE,
1090 { is_bailout => TRUE,
1091 explanation => "GERONIMMMOOOOOO!!!",
1093 { actual_passed => TRUE,
1094 is_actual_ok => TRUE,
1103 { actual_passed => TRUE,
1104 is_actual_ok => TRUE,
1115 passed => [ 1 .. 5 ],
1116 actual_passed => [ 1 .. 5 ],
1118 actual_failed => [],
1123 is_good_plan => TRUE,
1135 actual_passed => [],
1137 actual_failed => [],
1142 tests_planned => undef,
1144 parse_errors => [ 'No plan found in TAP output', ],
1156 { actual_passed => TRUE,
1157 is_actual_ok => TRUE,
1165 is_unplanned => FALSE,
1167 { actual_passed => TRUE,
1168 is_actual_ok => TRUE,
1176 is_unplanned => FALSE,
1178 { actual_passed => TRUE,
1179 is_actual_ok => TRUE,
1187 is_unplanned => FALSE,
1189 { actual_passed => TRUE,
1190 is_actual_ok => TRUE,
1198 is_unplanned => TRUE,
1200 { actual_passed => TRUE,
1201 is_actual_ok => TRUE,
1209 is_unplanned => TRUE,
1211 { actual_passed => TRUE,
1212 is_actual_ok => TRUE,
1220 is_unplanned => TRUE,
1222 { actual_passed => TRUE,
1223 is_actual_ok => TRUE,
1231 is_unplanned => TRUE,
1235 passed => [ 1 .. 3 ],
1236 actual_passed => [ 1 .. 7 ],
1237 failed => [ 4 .. 7 ],
1238 actual_failed => [],
1245 parse_errors => ['Bad plan. You planned 3 tests but ran 7.'],
1248 skip_if => sub {$IsVMS},
1256 tests_planned => TRUE,
1258 { actual_passed => TRUE,
1259 is_actual_ok => TRUE,
1260 description => "- -T honored",
1270 passed => [ 1 .. 1 ],
1271 actual_passed => [ 1 .. 1 ],
1273 actual_failed => [],
1278 is_good_plan => TRUE,
1279 tests_planned => TRUE,
1290 actual_passed => [],
1292 actual_failed => [],
1297 tests_planned => undef,
1299 parse_errors => [ 'No plan found in TAP output', ],
1305 { actual_passed => TRUE,
1306 is_actual_ok => TRUE,
1316 { actual_passed => TRUE,
1317 is_actual_ok => TRUE,
1327 { actual_passed => TRUE,
1328 is_actual_ok => TRUE,
1338 { actual_passed => TRUE,
1339 is_actual_ok => TRUE,
1351 passed => [ 1 .. 4 ],
1352 actual_passed => [ 1 .. 4 ],
1354 actual_failed => [],
1359 tests_planned => undef,
1361 parse_errors => [ 'No plan found in TAP output', ],
1365 die_last_minute => {
1367 { actual_passed => TRUE,
1368 is_actual_ok => TRUE,
1378 { actual_passed => TRUE,
1379 is_actual_ok => TRUE,
1389 { actual_passed => TRUE,
1390 is_actual_ok => TRUE,
1400 { actual_passed => TRUE,
1401 is_actual_ok => TRUE,
1419 passed => [ 1 .. 4 ],
1420 actual_passed => [ 1 .. 4 ],
1422 actual_failed => [],
1427 is_good_plan => TRUE,
1442 { actual_passed => TRUE,
1443 is_actual_ok => TRUE,
1453 { actual_passed => TRUE,
1454 is_actual_ok => TRUE,
1464 { actual_passed => TRUE,
1465 is_actual_ok => TRUE,
1471 number => 136211425,
1475 { actual_passed => TRUE,
1476 is_actual_ok => TRUE,
1482 number => 136211426,
1489 actual_passed => [ 1, 2, 136211425, 136211426 ],
1490 failed => [ 136211425, 136211426 ],
1491 actual_failed => [],
1499 'Tests out of sequence. Found (136211425) but expected (3)',
1500 'Tests out of sequence. Found (136211426) but expected (4)',
1501 'Bad plan. You planned 2 tests but ran 4.'
1514 { actual_passed => TRUE,
1515 is_actual_ok => TRUE,
1525 { actual_passed => TRUE,
1526 is_actual_ok => TRUE,
1536 { actual_passed => TRUE,
1537 is_actual_ok => TRUE,
1547 { actual_passed => TRUE,
1548 is_actual_ok => TRUE,
1558 { actual_passed => TRUE,
1559 is_actual_ok => TRUE,
1569 { actual_passed => TRUE,
1570 is_actual_ok => TRUE,
1580 { actual_passed => TRUE,
1581 is_actual_ok => TRUE,
1591 { actual_passed => TRUE,
1592 is_actual_ok => TRUE,
1602 { actual_passed => TRUE,
1603 is_actual_ok => TRUE,
1613 { actual_passed => TRUE,
1614 is_actual_ok => TRUE,
1624 { actual_passed => TRUE,
1625 is_actual_ok => TRUE,
1638 actual_passed => [ 1, 2, 99997 .. 100005 ],
1639 failed => [ 99997 .. 100005 ],
1640 actual_failed => [],
1648 'Tests out of sequence. Found (99997) but expected (3)',
1649 'Tests out of sequence. Found (99998) but expected (4)',
1650 'Tests out of sequence. Found (99999) but expected (5)',
1651 'Tests out of sequence. Found (100000) but expected (6)',
1652 'Tests out of sequence. Found (100001) but expected (7)',
1653 'Tests out of sequence. Found (100002) but expected (8)',
1654 'Tests out of sequence. Found (100003) but expected (9)',
1655 'Tests out of sequence. Found (100004) but expected (10)',
1656 'Tests out of sequence. Found (100005) but expected (11)',
1657 'Bad plan. You planned 2 tests but ran 11.'
1668 tests_planned => 10,
1670 { actual_passed => TRUE,
1671 is_actual_ok => TRUE,
1681 { actual_passed => TRUE,
1682 is_actual_ok => TRUE,
1689 description => 'basset hounds got long ears',
1692 { actual_passed => FALSE,
1693 is_actual_ok => FALSE,
1700 description => 'all hell broke loose',
1703 { actual_passed => FALSE,
1704 is_actual_ok => FALSE,
1712 explanation => 'if I heard a voice from heaven ...',
1714 { actual_passed => TRUE,
1715 is_actual_ok => TRUE,
1722 description => 'say "live without loving",',
1725 { actual_passed => TRUE,
1726 is_actual_ok => TRUE,
1733 description => "I'd beg off.",
1736 { actual_passed => TRUE,
1737 is_actual_ok => TRUE,
1745 explanation => 'contract negotiations',
1747 { actual_passed => TRUE,
1748 is_actual_ok => TRUE,
1755 description => 'Girls are such exquisite hell',
1758 { actual_passed => TRUE,
1759 is_actual_ok => TRUE,
1766 description => 'Elegy 9B',
1769 { actual_passed => FALSE,
1770 is_actual_ok => FALSE,
1782 passed => [ 1 .. 2, 4 .. 9 ],
1783 actual_passed => [ 1 .. 2, 5 .. 9 ],
1784 failed => [ 3, 10 ],
1785 actual_failed => [ 3, 4, 10 ],
1790 is_good_plan => TRUE,
1791 tests_planned => 10,
1800 { is_comment => TRUE,
1803 comment => 'comments',
1805 { actual_passed => TRUE,
1806 is_actual_ok => TRUE,
1816 { actual_passed => TRUE,
1817 is_actual_ok => TRUE,
1827 { actual_passed => TRUE,
1828 is_actual_ok => TRUE,
1838 { actual_passed => TRUE,
1839 is_actual_ok => TRUE,
1849 { is_comment => TRUE,
1852 comment => 'comment',
1860 { is_comment => TRUE,
1863 comment => 'more ignored stuff',
1865 { is_comment => TRUE,
1868 comment => 'and yet more',
1872 passed => [ 1 .. 4 ],
1873 actual_passed => [ 1 .. 4 ],
1875 actual_failed => [],
1880 is_good_plan => TRUE,
1890 { is_comment => TRUE,
1893 comment => 'comments',
1895 { actual_passed => TRUE,
1896 is_actual_ok => TRUE,
1906 { actual_passed => FALSE,
1907 is_actual_ok => FALSE,
1917 { actual_passed => TRUE,
1918 is_actual_ok => TRUE,
1928 { actual_passed => TRUE,
1929 is_actual_ok => TRUE,
1939 { is_comment => TRUE,
1942 comment => 'comment',
1950 { is_comment => TRUE,
1953 comment => 'more ignored stuff',
1955 { is_comment => TRUE,
1958 comment => 'and yet more',
1962 passed => [ 1, 3, 4 ],
1963 actual_passed => [ 1, 3, 4 ],
1965 actual_failed => [2],
1970 is_good_plan => TRUE,
1980 { actual_passed => TRUE,
1981 is_actual_ok => TRUE,
1988 description => '- Test that argument passing works',
1991 { actual_passed => TRUE,
1992 is_actual_ok => TRUE,
2000 '- Test that passing arguments as references work',
2003 { actual_passed => TRUE,
2004 is_actual_ok => TRUE,
2011 description => '- Test a normal sub',
2014 { actual_passed => TRUE,
2015 is_actual_ok => TRUE,
2022 description => '- Detach test',
2025 { actual_passed => TRUE,
2026 is_actual_ok => TRUE,
2033 description => '- Nested thread test',
2036 { actual_passed => TRUE,
2037 is_actual_ok => TRUE,
2044 description => '- Nested thread test',
2047 { actual_passed => TRUE,
2048 is_actual_ok => TRUE,
2055 description => '- Wanted 7, got 7',
2058 { actual_passed => TRUE,
2059 is_actual_ok => TRUE,
2066 description => '- Wanted 7, got 7',
2069 { actual_passed => TRUE,
2070 is_actual_ok => TRUE,
2077 description => '- Wanted 8, got 8',
2080 { actual_passed => TRUE,
2081 is_actual_ok => TRUE,
2088 description => '- Wanted 8, got 8',
2095 tests_planned => 15,
2097 { actual_passed => TRUE,
2098 is_actual_ok => TRUE,
2108 { actual_passed => TRUE,
2109 is_actual_ok => TRUE,
2116 description => '- Check that Config::threads is true',
2119 { actual_passed => TRUE,
2120 is_actual_ok => TRUE,
2127 description => '- Detach test',
2130 { actual_passed => TRUE,
2131 is_actual_ok => TRUE,
2139 '- Check so that tid for threads work for main thread',
2142 { actual_passed => TRUE,
2143 is_actual_ok => TRUE,
2151 '- Check so that tid for threads work for main thread',
2156 passed => [ 2 .. 4, 6, 8 .. 13, 1, 5, 7, 14, 15 ],
2157 actual_passed => [ 2 .. 4, 6, 8 .. 13, 1, 5, 7, 14, 15 ],
2159 actual_failed => [],
2163 is_good_plan => FALSE,
2164 tests_planned => 15,
2167 # Note that tests 14 and 15 *are* in the correct sequence.
2169 'Tests out of sequence. Found (2) but expected (1)',
2170 'Tests out of sequence. Found (3) but expected (2)',
2171 'Tests out of sequence. Found (4) but expected (3)',
2172 'Tests out of sequence. Found (6) but expected (4)',
2173 'Tests out of sequence. Found (8) but expected (5)',
2174 'Tests out of sequence. Found (9) but expected (6)',
2175 'Tests out of sequence. Found (10) but expected (7)',
2176 'Tests out of sequence. Found (11) but expected (8)',
2177 'Tests out of sequence. Found (12) but expected (9)',
2178 'Tests out of sequence. Found (13) but expected (10)',
2179 'Plan (1..15) must be at the beginning or end of the TAP output',
2180 'Tests out of sequence. Found (1) but expected (11)',
2181 'Tests out of sequence. Found (5) but expected (12)',
2182 'Tests out of sequence. Found (7) but expected (13)',
2190 raw => '1..0 # skipping: rope',
2194 directive => 'SKIP',
2195 explanation => 'rope'
2200 actual_passed => [],
2202 actual_failed => [],
2207 is_good_plan => TRUE,
2218 { is_version => TRUE,
2219 raw => 'TAP version 13',
2221 { is_unknown => TRUE,
2222 raw => '1..0 # skipping: rope',
2227 actual_passed => [],
2229 actual_failed => [],
2234 is_good_plan => FALSE,
2235 tests_planned => FALSE,
2237 parse_errors => ['No plan found in TAP output'],
2244 { is_version => TRUE,
2245 raw => 'TAP version 13',
2250 { is_pragma => TRUE,
2251 raw => 'pragma +strict',
2252 pragmas => ['+strict'],
2254 { is_unknown => TRUE, raw => 'Nonsense!',
2256 { is_pragma => TRUE,
2257 raw => 'pragma -strict',
2258 pragmas => ['-strict'],
2260 { is_unknown => TRUE,
2261 raw => "Doesn't matter.",
2264 raw => 'ok 1 All OK',
2269 actual_passed => [1],
2271 actual_failed => [],
2276 is_good_plan => TRUE,
2279 parse_errors => ['Unknown TAP token: "Nonsense!"'],
2280 'exit' => 0, # TODO: Is this right???
2291 directive => 'SKIP',
2297 actual_passed => [],
2299 actual_failed => [],
2304 is_good_plan => TRUE,
2311 skip_all => '(no reason given)',
2317 tests_planned => TRUE,
2321 { actual_passed => FALSE,
2322 is_actual_ok => FALSE,
2329 description => 'Hamlette # TODOORNOTTODO',
2335 actual_passed => [],
2337 actual_failed => [1],
2342 is_good_plan => TRUE,
2343 tests_planned => TRUE,
2350 shbang_misparse => {
2358 { actual_passed => TRUE,
2359 is_actual_ok => TRUE,
2368 { actual_passed => TRUE,
2369 is_actual_ok => TRUE,
2380 passed => [ 1 .. 2 ],
2381 actual_passed => [ 1 .. 2 ],
2383 actual_failed => [],
2388 is_good_plan => TRUE,
2404 { actual_passed => TRUE,
2405 is_actual_ok => TRUE,
2416 __ARGS__ => { switches => ['-Mstrict'] },
2419 actual_passed => [1],
2421 actual_failed => [],
2426 is_good_plan => TRUE,
2442 { actual_passed => TRUE,
2443 is_actual_ok => TRUE,
2454 __ARGS__ => { switches => ['-Iexamples'] },
2457 actual_passed => [1],
2459 actual_failed => [],
2464 is_good_plan => TRUE,
2472 sequence_misparse => {
2480 { actual_passed => TRUE,
2481 is_actual_ok => TRUE,
2490 { actual_passed => TRUE,
2491 is_actual_ok => TRUE,
2500 { actual_passed => TRUE,
2501 is_actual_ok => TRUE,
2508 description => "\# skipped on foobar system",
2510 { is_comment => TRUE,
2511 comment => '1234567890123456789012345678901234567890',
2513 { actual_passed => TRUE,
2514 is_actual_ok => TRUE,
2523 { is_comment => TRUE,
2524 comment => '1234567890123456789012345678901234567890',
2526 { actual_passed => TRUE,
2527 is_actual_ok => TRUE,
2538 passed => [ 1 .. 5 ],
2539 actual_passed => [ 1 .. 5 ],
2541 actual_failed => [],
2546 is_good_plan => TRUE,
2555 # For some reason mixing stdout with stderr is unreliable on Windows
2558 : ( stdout_stderr => {
2560 { is_comment => TRUE,
2563 comment => 'comments',
2565 { actual_passed => TRUE,
2566 is_actual_ok => TRUE,
2576 { actual_passed => TRUE,
2577 is_actual_ok => TRUE,
2587 { actual_passed => TRUE,
2588 is_actual_ok => TRUE,
2598 { is_comment => TRUE,
2601 comment => 'comment',
2603 { actual_passed => TRUE,
2604 is_actual_ok => TRUE,
2614 { is_comment => TRUE,
2617 comment => 'more ignored stuff',
2619 { is_comment => TRUE,
2622 comment => 'and yet more',
2632 passed => [ 1 .. 4 ],
2633 actual_passed => [ 1 .. 4 ],
2635 actual_failed => [],
2640 is_good_plan => TRUE,
2652 junk_before_plan => {
2654 { is_unknown => TRUE,
2655 raw => 'this is junk',
2657 { is_comment => TRUE,
2658 comment => "this is a comment",
2666 { actual_passed => TRUE,
2667 is_actual_ok => TRUE,
2677 passed => [ 1 .. 1 ],
2678 actual_passed => [ 1 .. 1 ],
2680 actual_failed => [],
2685 is_good_plan => TRUE,
2695 { is_version => TRUE,
2696 raw => 'TAP version 13',
2704 { actual_passed => TRUE,
2705 is_actual_ok => TRUE,
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,
2756 passed => [ 1 .. 5 ],
2757 actual_passed => [ 1 .. 5 ],
2759 actual_failed => [],
2764 is_good_plan => TRUE,
2774 { is_version => TRUE,
2775 raw => 'TAP version 12',
2783 { actual_passed => TRUE,
2784 is_actual_ok => TRUE,
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,
2835 passed => [ 1 .. 5 ],
2836 actual_passed => [ 1 .. 5 ],
2838 actual_failed => [],
2843 is_good_plan => TRUE,
2847 ['Explicit TAP version must be at least 13. Got version 12'],
2860 { is_version => TRUE,
2861 raw => 'TAP version 13',
2863 { actual_passed => TRUE,
2864 is_actual_ok => TRUE,
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,
2915 passed => [ 1 .. 5 ],
2916 actual_passed => [ 1 .. 5 ],
2918 actual_failed => [],
2923 is_good_plan => TRUE,
2927 ['If TAP version is present it must be the first line of output'],
2941 { actual_passed => TRUE,
2942 is_actual_ok => TRUE,
2944 'Should parse as literal backslash --> \\',
2951 is_unplanned => FALSE,
2953 { actual_passed => TRUE,
2954 is_actual_ok => TRUE,
2961 description => 'Not a continuation line',
2962 is_unplanned => FALSE,
2966 passed => [ 1 .. 2 ],
2967 actual_passed => [ 1 .. 2 ],
2969 actual_failed => [],
2974 is_good_plan => TRUE,
2991 { actual_passed => TRUE,
2992 is_actual_ok => TRUE,
2993 description => 'Not a \\# TODO',
3000 is_unplanned => FALSE,
3002 { actual_passed => TRUE,
3003 is_actual_ok => TRUE,
3010 description => 'Not a \\# SKIP',
3011 is_unplanned => FALSE,
3013 { actual_passed => TRUE,
3014 is_actual_ok => TRUE,
3021 description => 'Escaped \\\\\\#',
3022 is_unplanned => FALSE,
3026 passed => [ 1 .. 3 ],
3027 actual_passed => [ 1 .. 3 ],
3029 actual_failed => [],
3034 is_good_plan => TRUE,
3051 { actual_passed => TRUE,
3052 is_actual_ok => TRUE,
3053 description => '- One',
3060 is_unplanned => FALSE,
3062 { actual_passed => TRUE,
3063 is_actual_ok => TRUE,
3064 description => '- Two',
3071 is_unplanned => FALSE,
3073 { actual_passed => TRUE,
3074 is_actual_ok => TRUE,
3075 description => '- Three',
3082 is_unplanned => FALSE,
3084 { actual_passed => TRUE,
3085 is_actual_ok => TRUE,
3086 description => '- Four',
3093 is_unplanned => FALSE,
3095 { actual_passed => TRUE,
3096 is_actual_ok => TRUE,
3097 description => '- Five',
3104 is_unplanned => FALSE,
3108 passed => [ 1 .. 3, 0, 5 ],
3109 actual_passed => [ 1 .. 3, 0, 5 ],
3111 actual_failed => [],
3116 is_good_plan => TRUE,
3120 'Tests out of sequence. Found (0) but expected (4)',
3129 NOT_ZERO, sub { local $^W; 0 != shift },
3130 TRUE, sub { local $^W; !!shift },
3131 FALSE, sub { local $^W; !shift },
3134 my $can_open3 = ( $Config{d_fork} || $IsWin32 ) ? 1 : 0;
3136 for my $hide_fork ( 0 .. $can_open3 ) {
3140 *{'TAP::Parser::Iterator::Process::_use_open3'} = sub {return};
3144 for my $test ( sort keys %samples ) {
3146 #next unless 'empty' eq $test;
3147 my %details = %{ $samples{$test} };
3149 if ( my $skip_if = delete $details{skip_if} ) {
3150 next TEST if $skip_if->();
3153 my $results = delete $details{results};
3154 my $args = delete $details{__ARGS__};
3155 my $need_open3 = delete $details{need_open3};
3157 next TEST if $need_open3 && ( $hide_fork || !$can_open3 );
3159 # the following acrobatics are necessary to make it easy for the
3160 # Test::Builder::failure_output() method to be overridden when
3161 # TAP::Parser is not installed. Otherwise, these tests will fail.
3163 unshift @{ $args->{switches} },
3164 $ENV{PERL_CORE} ? ( map {"-I$_"} @INC ) : ('-It/lib');
3166 $args->{source} = File::Spec->catfile( $SAMPLE_TESTS, $test );
3167 $args->{merge} = !$hide_fork;
3169 my $parser = eval { analyze_test( $test, [@$results], $args ) };
3171 ok !$error, "'$test' should parse successfully"
3176 while ( my ( $method, $answer ) = each %details ) {
3177 $tests += ref $answer ? 2 : 1;
3180 skip "$test did not parse successfully", $tests;
3184 while ( my ( $method, $answer ) = each %details ) {
3185 if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck
3186 ok $handler->( $parser->$method() ),
3187 "... and $method should return a reasonable value ($test)";
3189 elsif ( !ref $answer ) {
3190 local $^W; # uninit warnings
3192 $answer = _vmsify_answer( $method, $answer );
3194 is $parser->$method(), $answer,
3195 "... and $method should equal $answer ($test)";
3198 is scalar $parser->$method(), scalar @$answer,
3199 "... and $method should be the correct amount ($test)";
3200 is_deeply [ $parser->$method() ], $answer,
3201 "... and $method should be the correct values ($test)";
3208 my %Unix2VMS_Exit_Codes = ( 1 => 4, );
3210 sub _vmsify_answer {
3211 my ( $method, $answer ) = @_;
3213 return $answer unless $IsVMS;
3215 if ( $method eq 'exit'
3216 and exists $Unix2VMS_Exit_Codes{$answer} )
3218 $answer = $Unix2VMS_Exit_Codes{$answer};
3225 my ( $test, $results, $args ) = @_;
3227 my $parser = TAP::Parser->new($args);
3229 while ( defined( my $result = $parser->next ) ) {
3231 my $expected = shift @$results;
3234 ? $result->description
3236 $desc = $result->plan
3237 if $result->is_plan && $desc =~ /SKIP/i;
3238 $desc =~ s/#/<hash>/g;
3239 $desc =~ s/\s+/ /g; # Drop newlines
3240 ok defined $expected,
3241 "$test/$count We should have a result for $desc";
3242 while ( my ( $method, $answer ) = each %$expected ) {
3244 if ( my $handler = $HANDLER_FOR{ $answer || '' } ) { # yuck
3245 ok $handler->( $result->$method() ),
3246 "... and $method should return a reasonable value ($test/$count)";
3248 elsif ( ref $answer ) {
3249 is_deeply scalar( $result->$method() ), $answer,
3250 "... and $method should return the correct structure ($test/$count)";
3253 is $result->$method(), $answer,
3254 "... and $method should return the correct answer ($test/$count)";
3260 "... and we should have the correct number of results ($test)";