xref: /openbsd-src/gnu/usr.bin/perl/cpan/Pod-Simple/t/JustPod02.t (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
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