1de8cc8edSafresh1use strict; 2de8cc8edSafresh1use warnings; 3de8cc8edSafresh1 4*5486feefSafresh1use Test::More tests => 1; 5de8cc8edSafresh1 6de8cc8edSafresh1use Pod::Simple::JustPod; 7de8cc8edSafresh1 8de8cc8edSafresh1my @orig = <DATA>; 9de8cc8edSafresh1my $parsed; 10de8cc8edSafresh1 11de8cc8edSafresh1my $parser = Pod::Simple::JustPod->new(); 12de8cc8edSafresh1$parser->output_string(\$parsed); 13de8cc8edSafresh1$parser->parse_lines(@orig, undef); 14de8cc8edSafresh1 15de8cc8edSafresh1my $orig = join "", @orig; 16de8cc8edSafresh1 17de8cc8edSafresh1my $msg = "Verify parsed pod sufficiently matches original"; 18de8cc8edSafresh1if ($parsed eq $orig) { 19de8cc8edSafresh1 pass($msg); 20de8cc8edSafresh1} 21de8cc8edSafresh1elsif ($ENV{PERL_TEST_DIFF}) { 22de8cc8edSafresh1 fail($msg); 23de8cc8edSafresh1 require File::Temp; 24de8cc8edSafresh1 my $orig_file = File::Temp->new(); 25de8cc8edSafresh1 local $/ = "\n"; 26de8cc8edSafresh1 chomp $orig; 27de8cc8edSafresh1 print $orig_file $orig, "\n"; 28de8cc8edSafresh1 close $orig_file || die "Can't close orig_file: $!"; 29de8cc8edSafresh1 30de8cc8edSafresh1 chomp $parsed; 31de8cc8edSafresh1 my $parsed_file = File::Temp->new(); 32de8cc8edSafresh1 print $parsed_file $parsed, "\n"; 33de8cc8edSafresh1 close $parsed_file || die "Can't close parsed_file"; 34de8cc8edSafresh1 35de8cc8edSafresh1 my $diff = File::Temp->new(); 36de8cc8edSafresh1 system("$ENV{PERL_TEST_DIFF} $orig_file $parsed_file > $diff"); 37de8cc8edSafresh1 38de8cc8edSafresh1 open my $fh, "<", $diff || die "Can't open $diff"; 39de8cc8edSafresh1 my @diffs = <$fh>; 40de8cc8edSafresh1 diag(@diffs); 41de8cc8edSafresh1} 42de8cc8edSafresh1else { 43de8cc8edSafresh1 eval { require Text::Diff; }; 44de8cc8edSafresh1 if ($@) { 45de8cc8edSafresh1 is($parsed, $orig, $msg); 46de8cc8edSafresh1 diag("Set environment variable PERL_TEST_DIFF=diff_tool or install" 47de8cc8edSafresh1 . " Text::Diff to see just the differences."); 48de8cc8edSafresh1 } 49de8cc8edSafresh1 else { 50de8cc8edSafresh1 fail($msg); 51de8cc8edSafresh1 diag Text::Diff::diff(\$orig, \$parsed, { STYLE => 'Unified' }); 52de8cc8edSafresh1 } 53de8cc8edSafresh1} 54de8cc8edSafresh1 55de8cc8edSafresh1# The data is adapted from a test file from pod2lators. Extra spaces are 56de8cc8edSafresh1# added in places to make sure they get retained, and some extra tests 57de8cc8edSafresh1__DATA__ 58de8cc8edSafresh1=pod 59de8cc8edSafresh1 60de8cc8edSafresh1=encoding ASCII 61de8cc8edSafresh1 62de8cc8edSafresh1=head1 NAME 63de8cc8edSafresh1 64de8cc8edSafresh1basic.pod - Test of various basic POD features in translators. 65de8cc8edSafresh1 66de8cc8edSafresh1=head1 HEADINGS 67de8cc8edSafresh1 68de8cc8edSafresh1Try a few different levels of headings, with embedded formatting codes and 69de8cc8edSafresh1other interesting bits. 70de8cc8edSafresh1 71de8cc8edSafresh1=head1 This C<is> a "level 1" heading 72de8cc8edSafresh1 73de8cc8edSafresh1=head2 ``Level'' "2 I<heading> 74de8cc8edSafresh1 75de8cc8edSafresh1=head3 Level 3 B<heading I<with C<weird F<stuff "" (double quote)>>>> 76de8cc8edSafresh1 77de8cc8edSafresh1=head4 Level "4 C<heading> 78de8cc8edSafresh1 79256a93a4Safresh1=head5 Level "5 B<heading> 80256a93a4Safresh1 81256a93a4Safresh1=head6 Level "6 I<heading> 82256a93a4Safresh1 83de8cc8edSafresh1Now try again with B<intermixed> F<text>. 84de8cc8edSafresh1 85de8cc8edSafresh1=head1 This C<is> a "level 1" heading 86de8cc8edSafresh1 87de8cc8edSafresh1Text. 88de8cc8edSafresh1 89de8cc8edSafresh1=head2 ``Level'' 2 I<heading> 90de8cc8edSafresh1 91de8cc8edSafresh1Text. 92de8cc8edSafresh1 93de8cc8edSafresh1=head3 Level 3 B<heading I<with C<weird F<stuff>>>> 94de8cc8edSafresh1 95de8cc8edSafresh1Text. 96de8cc8edSafresh1 97de8cc8edSafresh1=head4 Level "4 C<heading> 98de8cc8edSafresh1 99de8cc8edSafresh1Text. 100de8cc8edSafresh1 101256a93a4Safresh1=head5 Level "5 B<heading> 102256a93a4Safresh1 103256a93a4Safresh1Text. 104256a93a4Safresh1 105256a93a4Safresh1=head6 Level "6 I<heading> 106256a93a4Safresh1 107256a93a4Safresh1Text. 108256a93a4Safresh1 109de8cc8edSafresh1=head1 LINKS 110de8cc8edSafresh1 111de8cc8edSafresh1These are all taken from the Pod::Parser tests. 112de8cc8edSafresh1 113de8cc8edSafresh1Try out I<LOTS> of different ways of specifying references: 114de8cc8edSafresh1 115de8cc8edSafresh1Reference the L<manpage/section> 116de8cc8edSafresh1 117de8cc8edSafresh1Reference the L<"manpage"/section> 118de8cc8edSafresh1 119de8cc8edSafresh1Reference the L<manpage/"section"> 120de8cc8edSafresh1 121de8cc8edSafresh1Now try it using the new "|" stuff ... 122de8cc8edSafresh1 123de8cc8edSafresh1Reference the L<thistext|manpage/section>| 124de8cc8edSafresh1 125de8cc8edSafresh1Reference the L<thistext | manpage / section>| 126de8cc8edSafresh1 127de8cc8edSafresh1Reference the L<thistext| manpage/ section>| 128de8cc8edSafresh1 129de8cc8edSafresh1Reference the L<thistext |manpage /section>| 130de8cc8edSafresh1 131de8cc8edSafresh1Reference the L<thistext|manpage/"section">| 132de8cc8edSafresh1 133de8cc8edSafresh1Reference the L<thistext| 134de8cc8edSafresh1manpage/ 135de8cc8edSafresh1section>| 136de8cc8edSafresh1 137de8cc8edSafresh1And then throw in a few new ones of my own. 138de8cc8edSafresh1 139de8cc8edSafresh1L<foo> 140de8cc8edSafresh1 141de8cc8edSafresh1L<foo|bar> 142de8cc8edSafresh1 143de8cc8edSafresh1L<foo/bar> 144de8cc8edSafresh1 145de8cc8edSafresh1L<foo/"baz boo"> 146de8cc8edSafresh1 147de8cc8edSafresh1L</bar> 148de8cc8edSafresh1 149de8cc8edSafresh1L</"baz boo"> 150de8cc8edSafresh1 151de8cc8edSafresh1L</baz boo> 152de8cc8edSafresh1 153de8cc8edSafresh1L<foo bar/baz boo> 154de8cc8edSafresh1 155de8cc8edSafresh1L<"boo var baz"> 156de8cc8edSafresh1 157de8cc8edSafresh1L<bar baz> 158de8cc8edSafresh1 159de8cc8edSafresh1L</boo>, L</bar>, and L</baz> 160de8cc8edSafresh1 161de8cc8edSafresh1L<fooZ<>bar> 162de8cc8edSafresh1 163de8cc8edSafresh1L<Testing I<italics>|foo/bar> 164de8cc8edSafresh1 165de8cc8edSafresh1L<foo/I<Italic> text> 166de8cc8edSafresh1 167de8cc8edSafresh1L<fooE<verbar>barZ<>/Section C<with> I<B<other> markup>> 168de8cc8edSafresh1 169de8cc8edSafresh1=head1 OVER AND ITEMS 170de8cc8edSafresh1 171de8cc8edSafresh1Taken from Pod::Parser tests, this is a test to ensure that multiline 172de8cc8edSafresh1=item paragraphs get indented appropriately. 173de8cc8edSafresh1 174de8cc8edSafresh1=over 4 175de8cc8edSafresh1 176de8cc8edSafresh1=item This 177de8cc8edSafresh1is 178de8cc8edSafresh1a 179de8cc8edSafresh1test. 180de8cc8edSafresh1 181de8cc8edSafresh1=back 182de8cc8edSafresh1 183de8cc8edSafresh1There should be whitespace now before this line. 184de8cc8edSafresh1 185de8cc8edSafresh1Taken from Pod::Parser tests, this is a test to ensure the nested =item 186de8cc8edSafresh1paragraphs get indented appropriately. 187de8cc8edSafresh1 188de8cc8edSafresh1=over 2 189de8cc8edSafresh1 190de8cc8edSafresh1=item 1 191de8cc8edSafresh1 192de8cc8edSafresh1First section. 193de8cc8edSafresh1 194de8cc8edSafresh1=over 2 195de8cc8edSafresh1 196de8cc8edSafresh1=item a 197de8cc8edSafresh1 198de8cc8edSafresh1this is item a 199de8cc8edSafresh1 200de8cc8edSafresh1=item b 201de8cc8edSafresh1 202de8cc8edSafresh1this is item b 203de8cc8edSafresh1 204de8cc8edSafresh1=back 205de8cc8edSafresh1 206de8cc8edSafresh1=item 2 207de8cc8edSafresh1 208de8cc8edSafresh1Second section. 209de8cc8edSafresh1 210de8cc8edSafresh1=over 2 211de8cc8edSafresh1 212de8cc8edSafresh1=item a 213de8cc8edSafresh1 214de8cc8edSafresh1this is item a 215de8cc8edSafresh1 216de8cc8edSafresh1=item b 217de8cc8edSafresh1 218de8cc8edSafresh1this is item b 219de8cc8edSafresh1 220de8cc8edSafresh1=item c 221de8cc8edSafresh1 222de8cc8edSafresh1=item d 223de8cc8edSafresh1 224de8cc8edSafresh1This is item c & d. 225de8cc8edSafresh1 226de8cc8edSafresh1=back 227de8cc8edSafresh1 228de8cc8edSafresh1=back 229de8cc8edSafresh1 230de8cc8edSafresh1Now some additional weirdness of our own. Make sure that multiple tags 231de8cc8edSafresh1for one paragraph are properly compacted. 232de8cc8edSafresh1 233de8cc8edSafresh1=over 4 234de8cc8edSafresh1 235de8cc8edSafresh1=item "foo" 236de8cc8edSafresh1 237de8cc8edSafresh1=item B<bar> 238de8cc8edSafresh1 239de8cc8edSafresh1=item C<baz> 240de8cc8edSafresh1 241de8cc8edSafresh1There shouldn't be any spaces between any of these item tags; this idiom 242de8cc8edSafresh1is used in perlfunc. 243de8cc8edSafresh1 244de8cc8edSafresh1=item Some longer item text 245de8cc8edSafresh1 246de8cc8edSafresh1Just to make sure that we test paragraphs where the item text doesn't fit 247de8cc8edSafresh1in the margin of the paragraph (and make sure that this paragraph fills a 248de8cc8edSafresh1few lines). 249de8cc8edSafresh1 250de8cc8edSafresh1Let's also make it multiple paragraphs to be sure that works. 251de8cc8edSafresh1 252de8cc8edSafresh1=back 253de8cc8edSafresh1 254de8cc8edSafresh1Test use of =over without =item as a block "quote" or block paragraph. 255de8cc8edSafresh1 256de8cc8edSafresh1=over 4 257de8cc8edSafresh1 258de8cc8edSafresh1This should be indented four spaces but otherwise formatted the same as 259de8cc8edSafresh1any other regular text paragraph. Make sure it's long enough to see the 260de8cc8edSafresh1results of the formatting..... 261de8cc8edSafresh1 262de8cc8edSafresh1=back 263de8cc8edSafresh1 264de8cc8edSafresh1Now try the same thing nested, and make sure that the indentation is reset 265de8cc8edSafresh1back properly. 266de8cc8edSafresh1 267de8cc8edSafresh1=over 4 268de8cc8edSafresh1 269de8cc8edSafresh1=over 4 270de8cc8edSafresh1 271de8cc8edSafresh1This paragraph should be doubly indented. 272de8cc8edSafresh1 273de8cc8edSafresh1=back 274de8cc8edSafresh1 275de8cc8edSafresh1This paragraph should only be singly indented. 276de8cc8edSafresh1 277de8cc8edSafresh1=over 4 278de8cc8edSafresh1 279de8cc8edSafresh1=item 280de8cc8edSafresh1 281de8cc8edSafresh1This is an item in the middle of a block-quote, which should be allowed. 282de8cc8edSafresh1 283de8cc8edSafresh1=item 284de8cc8edSafresh1 285de8cc8edSafresh1We're also testing tagless item commands. 286de8cc8edSafresh1 287de8cc8edSafresh1=back 288de8cc8edSafresh1 289de8cc8edSafresh1Should be back to the single level of indentation. 290de8cc8edSafresh1 291de8cc8edSafresh1=back 292de8cc8edSafresh1 293de8cc8edSafresh1Should be back to regular indentation. 294de8cc8edSafresh1 295de8cc8edSafresh1Now also check the transformation of * into real bullets for man pages. 296de8cc8edSafresh1 297de8cc8edSafresh1=over 298de8cc8edSafresh1 299de8cc8edSafresh1=item * 300de8cc8edSafresh1 301de8cc8edSafresh1An item. We're also testing using =over without a number, and making sure 302de8cc8edSafresh1that item text wraps properly. 303de8cc8edSafresh1 304de8cc8edSafresh1=item * 305de8cc8edSafresh1 306de8cc8edSafresh1Another item. 307de8cc8edSafresh1 308de8cc8edSafresh1=back 309de8cc8edSafresh1 310de8cc8edSafresh1and now test the numbering of item blocks. 311de8cc8edSafresh1 312de8cc8edSafresh1=over 4 313de8cc8edSafresh1 314de8cc8edSafresh1=item 1. 315de8cc8edSafresh1 316de8cc8edSafresh1First item. 317de8cc8edSafresh1 318de8cc8edSafresh1=item 2. 319de8cc8edSafresh1 320de8cc8edSafresh1Second item. 321de8cc8edSafresh1 322de8cc8edSafresh1=back 323de8cc8edSafresh1 324de8cc8edSafresh1=head1 FORMATTING CODES 325de8cc8edSafresh1 326de8cc8edSafresh1Another test taken from Pod::Parser. 327de8cc8edSafresh1 328de8cc8edSafresh1This is a test to see if I can do not only C<$self> and C<method()>, but 329de8cc8edSafresh1also C<< $self->method() >> and C<< $self->{FIELDNAME} >> and 330de8cc8edSafresh1C<< $Foo <=> $Bar >> without resorting to escape sequences. If 331de8cc8edSafresh1I want to refer to the right-shift operator I can do something 332de8cc8edSafresh1like C<<< $x >> 3 >>> or even C<<<< $y >> 5 >>>>. 333de8cc8edSafresh1 334de8cc8edSafresh1Now for the grand finale of C<< $self->method()->{FIELDNAME} = {FOO=>BAR} >>. 335de8cc8edSafresh1And I also want to make sure that newlines work like this 336de8cc8edSafresh1C<<< 337de8cc8edSafresh1$self->{FOOBAR} >> 3 and [$b => $a]->[$a <=> $b] 338de8cc8edSafresh1>>> 339de8cc8edSafresh1 340de8cc8edSafresh1Of course I should still be able to do all this I<with> escape sequences 341de8cc8edSafresh1too: C<$self-E<gt>method()> and C<$self-E<gt>{FIELDNAME}> and 342de8cc8edSafresh1C<{FOO=E<gt>BAR}>. 343de8cc8edSafresh1 344de8cc8edSafresh1Dont forget C<$self-E<gt>method()-E<gt>{FIELDNAME} = {FOO=E<gt>BAR}>. 345de8cc8edSafresh1 346de8cc8edSafresh1And make sure that C<0> works too! 347de8cc8edSafresh1 348de8cc8edSafresh1Now, if I use << or >> as my delimiters, then I have to use whitespace. 349de8cc8edSafresh1So things like C<<$self->method()>> and C<<$self->{FIELDNAME}>> wont end 350de8cc8edSafresh1up doing what you might expect since the first > will still terminate 351de8cc8edSafresh1the first < seen. 352de8cc8edSafresh1 353de8cc8edSafresh1Lets make sure these work for empty ones too, like C<<< >>>, 354de8cc8edSafresh1C<<<< 355de8cc8edSafresh1>>>>, and C<< >> >> (just to be obnoxious) 356de8cc8edSafresh1 357de8cc8edSafresh1The statement: C<This is dog kind's I<finest> hour!> is a parody of a 358de8cc8edSafresh1quotation from Winston Churchill. 359de8cc8edSafresh1 360de8cc8edSafresh1The following tests are added to those: 361de8cc8edSafresh1 362de8cc8edSafresh1Make sure that a few othZ<>er odd I<Z<>things> still work. This should be 363de8cc8edSafresh1a vertical bar: E<verbar>. Here's a test of a few more special escapes 364de8cc8edSafresh1that have to be supported: 365de8cc8edSafresh1 366de8cc8edSafresh1=over 3 367de8cc8edSafresh1 368de8cc8edSafresh1=item E<amp> 369de8cc8edSafresh1 370de8cc8edSafresh1An ampersand. 371de8cc8edSafresh1 372de8cc8edSafresh1=item E<apos> 373de8cc8edSafresh1 374de8cc8edSafresh1An apostrophe. 375de8cc8edSafresh1 376de8cc8edSafresh1=item E<lt> 377de8cc8edSafresh1 378de8cc8edSafresh1A less-than sign. 379de8cc8edSafresh1 380de8cc8edSafresh1=item E<gt> 381de8cc8edSafresh1 382de8cc8edSafresh1A greater-than sign. 383de8cc8edSafresh1 384de8cc8edSafresh1=item E<quot> 385de8cc8edSafresh1 386de8cc8edSafresh1A double quotation mark. 387de8cc8edSafresh1 388de8cc8edSafresh1=item E<sol> 389de8cc8edSafresh1 390de8cc8edSafresh1A forward slash. 391de8cc8edSafresh1 392de8cc8edSafresh1=back 393de8cc8edSafresh1 394de8cc8edSafresh1Try to get this bit of text over towards the edge so S<|that all of this 395de8cc8edSafresh1text inside SE<lt>E<gt> won't|> be wrapped. Also test the 396de8cc8edSafresh1|sameE<nbsp>thingE<nbsp>withE<nbsp>non-breakingS< spaces>.| 397de8cc8edSafresh1 398de8cc8edSafresh1There is a soft hyE<shy>phen in hyphen at hy-phen. 399de8cc8edSafresh1 400de8cc8edSafresh1This is a test of an X<index entry>index entry. 401de8cc8edSafresh1 402de8cc8edSafresh1=head1 VERBATIM 403de8cc8edSafresh1 404de8cc8edSafresh1Throw in a few verbatim paragraphs. 405de8cc8edSafresh1 406de8cc8edSafresh1 use Term::ANSIColor; 407de8cc8edSafresh1 print color 'bold blue'; 408de8cc8edSafresh1 print "This text is bold blue.\n"; 409de8cc8edSafresh1 print color 'reset'; 410de8cc8edSafresh1 print "This text is normal.\n"; 411de8cc8edSafresh1 print colored ("Yellow on magenta.\n", 'yellow on_magenta'); 412de8cc8edSafresh1 print "This text is normal.\n"; 413de8cc8edSafresh1 print colored ['yellow on_magenta'], "Yellow on magenta.\n"; 414de8cc8edSafresh1 415de8cc8edSafresh1 use Term::ANSIColor qw(uncolor); 416de8cc8edSafresh1 print uncolor '01;31', "\n"; 417de8cc8edSafresh1 418de8cc8edSafresh1But this isn't verbatim (make sure it wraps properly), and the next 419de8cc8edSafresh1paragraph is again: 420de8cc8edSafresh1 421de8cc8edSafresh1 use Term::ANSIColor qw(:constants); 422de8cc8edSafresh1 print BOLD, BLUE, "This text is in bold blue.\n", RESET; 423de8cc8edSafresh1 424de8cc8edSafresh1 use Term::ANSIColor qw(:constants); $Term::ANSIColor::AUTORESET = 1; print BOLD BLUE "This text is in bold blue.\n"; print "This text is normal.\n"; 425de8cc8edSafresh1 426de8cc8edSafresh1(Ugh, that's obnoxiously long.) Try different spacing: 427de8cc8edSafresh1 428de8cc8edSafresh1 Starting with a tab. 429de8cc8edSafresh1Not 430de8cc8edSafresh1starting 431de8cc8edSafresh1with 432de8cc8edSafresh1a 433de8cc8edSafresh1tab. But this should still be verbatim. 434de8cc8edSafresh1 As should this. 435de8cc8edSafresh1 436de8cc8edSafresh1This isn't. 437de8cc8edSafresh1 438de8cc8edSafresh1 This is. And this: is an internal tab. It should be: 439de8cc8edSafresh1 |--| <= lined up with that. 440de8cc8edSafresh1 441de8cc8edSafresh1(Tricky, but tabs should be expanded before the translator starts in on 442de8cc8edSafresh1the text since otherwise text with mixed tabs and spaces will get messed 443de8cc8edSafresh1up.) 444de8cc8edSafresh1 445de8cc8edSafresh1 And now we test verbatim paragraphs right before a heading. Older 446de8cc8edSafresh1 versions of Pod::Man generated two spaces between paragraphs like this 447de8cc8edSafresh1 and the heading. (In order to properly test this, one may have to 448de8cc8edSafresh1 visually inspect the nroff output when run on the generated *roff 449de8cc8edSafresh1 text, unfortunately.) 450de8cc8edSafresh1 451de8cc8edSafresh1=head1 CONCLUSION 452de8cc8edSafresh1 453de8cc8edSafresh1That's all, folks! 454de8cc8edSafresh1 455de8cc8edSafresh1=cut 456