191f110e0Safresh1use strict; 291f110e0Safresh1use warnings; 3*56d68f1eSafresh1use Test::More tests => 6; 491f110e0Safresh1 591f110e0Safresh1{ 691f110e0Safresh1 package Pod::Simple::ErrorFinder; 791f110e0Safresh1 use base 'Pod::Simple::DumpAsXML'; # arbitrary choice -- rjbs, 2013-04-16 891f110e0Safresh1 991f110e0Safresh1 sub errors_for_input { 1091f110e0Safresh1 my ($class, $input, $mutor) = @_; 1191f110e0Safresh1 1291f110e0Safresh1 my $parser = $class->new; 1391f110e0Safresh1 my $output = ''; 1491f110e0Safresh1 $parser->output_string( \$output ); 15b8851fccSafresh1 $parser->no_errata_section(1); 1691f110e0Safresh1 $parser->parse_string_document( $input ); 1791f110e0Safresh1 18b8851fccSafresh1 return $parser->errata_seen(); 1991f110e0Safresh1 } 2091f110e0Safresh1} 2191f110e0Safresh1 2291f110e0Safresh1sub errors { Pod::Simple::ErrorFinder->errors_for_input(@_) } 2391f110e0Safresh1 2491f110e0Safresh1{ 25b8851fccSafresh1 my $errors = errors("=over 4\n\n=item 1\n\nHey\n\n"); 2691f110e0Safresh1 is_deeply( 27b8851fccSafresh1 $errors, 28b8851fccSafresh1 { 1 => [ "=over without closing =back" ] }, 2991f110e0Safresh1 "no closing =back", 3091f110e0Safresh1 ); 3191f110e0Safresh1} 3291f110e0Safresh1 3391f110e0Safresh1{ 3491f110e0Safresh1 for my $l_code ('L< foo>', 'L< bar>') { 3591f110e0Safresh1 my $input = "=pod\n\nAmbiguous space: $l_code\n"; 36b8851fccSafresh1 my $errors = errors("$input"); 3791f110e0Safresh1 is_deeply( 38b8851fccSafresh1 $errors, 39b8851fccSafresh1 { 3 => [ "L<> starts or ends with whitespace" ] }, 4091f110e0Safresh1 "warning for space in $l_code", 4191f110e0Safresh1 ); 4291f110e0Safresh1 } 4391f110e0Safresh1} 4491f110e0Safresh1 4591f110e0Safresh1{ 4691f110e0Safresh1 my $input = "=pod\n\nAmbiguous slash: L<I/O Operators|op/io>\n"; 47b8851fccSafresh1 my $errors = errors("$input"); 4891f110e0Safresh1 is_deeply( 49b8851fccSafresh1 $errors, 50b8851fccSafresh1 { 3 => [ "alternative text 'I/O Operators' contains non-escaped | or /" ] }, 5191f110e0Safresh1 "warning for / in text part of L<>", 5291f110e0Safresh1 ); 5391f110e0Safresh1} 54*56d68f1eSafresh1 55*56d68f1eSafresh1{ 56*56d68f1eSafresh1 my $input = "=pod\n\nnested LE<lt>E<sol>E<gt>: L<Nested L<http://foobar>|http://baz>\n"; 57*56d68f1eSafresh1 my $errors = errors("$input"); 58*56d68f1eSafresh1 is_deeply( 59*56d68f1eSafresh1 $errors, 60*56d68f1eSafresh1 { 3 => [ "Nested L<> are illegal. Pretending inner one is X<...> so can continue looking for other errors." ] }, 61*56d68f1eSafresh1 "warning for nested L<>", 62*56d68f1eSafresh1 ); 63*56d68f1eSafresh1} 64*56d68f1eSafresh1 65*56d68f1eSafresh1{ 66*56d68f1eSafresh1 my $input = "=pod\n\nLE<lt>E<sol>E<gt> containing only slash: L< / >\n"; 67*56d68f1eSafresh1 my $errors = errors("$input"); 68*56d68f1eSafresh1 is_deeply( 69*56d68f1eSafresh1 $errors, 70*56d68f1eSafresh1 { 3 => [ "L<> contains only '/'" ] }, 71*56d68f1eSafresh1 "warning for L< / > containing only a slash", 72*56d68f1eSafresh1 ); 73*56d68f1eSafresh1} 74