0645d93203d69ca2363b3a0b849b94dbb62cbbaa
[perl.git] / cpan / podlators / t / man.t
1 #!/usr/bin/perl -w
2 #
3 # Additional specialized tests for Pod::Man.
4 #
5 # Copyright 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2012, 2013
6 #     Russ Allbery <rra@stanford.edu>
7 #
8 # This program is free software; you may redistribute it and/or modify it
9 # under the same terms as Perl itself.
10
11 BEGIN {
12     chdir 't' if -d 't';
13     if ($ENV{PERL_CORE}) {
14         @INC = '../lib';
15     }
16     unshift (@INC, '../blib/lib');
17     $| = 1;
18 }
19
20 use strict;
21
22 use Test::More tests => 34;
23 BEGIN { use_ok ('Pod::Man') }
24
25 # Test whether we can use binmode to set encoding.
26 my $have_encoding = (eval { require PerlIO::encoding; 1 } and not $@);
27
28 my $parser = Pod::Man->new;
29 isa_ok ($parser, 'Pod::Man', 'Parser object');
30 my $n = 1;
31 while (<DATA>) {
32     next until $_ eq "###\n";
33     open (TMP, "> tmp$$.pod") or die "Cannot create tmp$$.pod: $!\n";
34
35     # We have a test in ISO 8859-1 encoding.  Make sure that nothing strange
36     # happens if Perl thinks the world is Unicode.  Wrap this in eval so that
37     # older versions of Perl don't croak.
38     eval { binmode (\*TMP, ':encoding(iso-8859-1)') if $have_encoding };
39
40     while (<DATA>) {
41         last if $_ eq "###\n";
42         print TMP $_;
43     }
44     close TMP;
45     open (OUT, "> out$$.tmp") or die "Cannot create out$$.tmp: $!\n";
46     $parser->parse_from_file ("tmp$$.pod", \*OUT);
47     close OUT;
48     open (OUT, "out$$.tmp") or die "Cannot open out$$.tmp: $!\n";
49     while (<OUT>) { last if /^\.nh/ }
50     my $output;
51     {
52         local $/;
53         $output = <OUT>;
54     }
55     close OUT;
56     1 while unlink ("tmp$$.pod", "out$$.tmp");
57     my $expected = '';
58     while (<DATA>) {
59         last if $_ eq "###\n";
60         $expected .= $_;
61     }
62     is ($output, $expected, "Output correct for test $n");
63     $n++;
64 }
65
66 # Below the marker are bits of POD and corresponding expected nroff output.
67 # This is used to test specific features or problems with Pod::Man.  The input
68 # and output are separated by lines containing only ###.
69
70 __DATA__
71
72 ###
73 =head1 NAME
74
75 gcc - GNU project C<C> and C++ compiler
76
77 =head1 C++ NOTES
78
79 Other mentions of C++.
80 ###
81 .SH "NAME"
82 gcc \- GNU project "C" and C++ compiler
83 .SH "\*(C+ NOTES"
84 .IX Header " NOTES"
85 Other mentions of \*(C+.
86 ###
87
88 ###
89 =head1 PERIODS
90
91 This C<.> should be quoted.
92 ###
93 .SH "PERIODS"
94 .IX Header "PERIODS"
95 This \f(CW\*(C`.\*(C'\fR should be quoted.
96 ###
97
98 ###
99 =over 4
100
101 =item *
102
103 A bullet.
104
105 =item    *
106
107 Another bullet.
108
109 =item * Also a bullet.
110
111 =back
112 ###
113 .IP "\(bu" 4
114 A bullet.
115 .IP "\(bu" 4
116 Another bullet.
117 .IP "\(bu" 4
118 Also a bullet.
119 ###
120
121 ###
122 =encoding iso-8859-1
123
124 =head1 ACCENTS
125
126 Beyonc�!  Beyonc�!  Beyonc�!!
127
128     Beyonc�!  Beyonc�!
129       Beyonc�!  Beyonc�!
130         Beyonc�!  Beyonc�!
131
132 Older versions didn't convert Beyonc� in verbatim.
133 ###
134 .SH "ACCENTS"
135 .IX Header "ACCENTS"
136 Beyonce\*'!  Beyonce\*'!  Beyonce\*'!!
137 .PP
138 .Vb 3
139 \&    Beyonce\*'!  Beyonce\*'!
140 \&      Beyonce\*'!  Beyonce\*'!
141 \&        Beyonce\*'!  Beyonce\*'!
142 .Ve
143 .PP
144 Older versions didn't convert Beyonce\*' in verbatim.
145 ###
146
147 ###
148 =over 4
149
150 =item 1. Not a number
151
152 =item 2. Spaced right
153
154 =back
155
156 =over 2
157
158 =item 1 Not a number
159
160 =item 2 Spaced right
161
162 =back
163 ###
164 .IP "1. Not a number" 4
165 .IX Item "1. Not a number"
166 .PD 0
167 .IP "2. Spaced right" 4
168 .IX Item "2. Spaced right"
169 .IP "1 Not a number" 2
170 .IX Item "1 Not a number"
171 .IP "2 Spaced right" 2
172 .IX Item "2 Spaced right"
173 ###
174
175 ###
176 =over 4
177
178 =item Z<>*
179
180 Not bullet.
181
182 =back
183 ###
184 .IP "*" 4
185 Not bullet.
186 ###
187
188 ###
189 =head1 SEQS
190
191 "=over ... Z<>=back"
192
193 "SE<lt>...E<gt>"
194
195 The quotes should be converted in the above to paired quotes.
196 ###
197 .SH "SEQS"
198 .IX Header "SEQS"
199 \&\*(L"=over ... =back\*(R"
200 .PP
201 \&\*(L"S<...>\*(R"
202 .PP
203 The quotes should be converted in the above to paired quotes.
204 ###
205
206 ###
207 =head1 YEN
208
209 It cost me E<165>12345! That should be an X.
210 ###
211 .SH "YEN"
212 .IX Header "YEN"
213 It cost me X12345! That should be an X.
214 ###
215
216 ###
217 =head1 agrave
218
219 Open E<agrave> la shell. Previous versions mapped it wrong.
220 ###
221 .SH "agrave"
222 .IX Header "agrave"
223 Open a\*` la shell. Previous versions mapped it wrong.
224 ###
225
226 ###
227 =over
228
229 =item First level
230
231 Blah blah blah....
232
233 =over
234
235 =item *
236
237 Should be a bullet.
238
239 =back
240
241 =back
242 ###
243 .IP "First level" 4
244 .IX Item "First level"
245 Blah blah blah....
246 .RS 4
247 .IP "\(bu" 4
248 Should be a bullet.
249 .RE
250 .RS 4
251 .RE
252 ###
253
254 ###
255 =over 4
256
257 =item 1. Check fonts in @CARP_NOT test.
258
259 =back
260 ###
261 .ie n .IP "1. Check fonts in @CARP_NOT test." 4
262 .el .IP "1. Check fonts in \f(CW@CARP_NOT\fR test." 4
263 .IX Item "1. Check fonts in @CARP_NOT test."
264 ###
265
266 ###
267 =head1 LINK QUOTING
268
269 There should not be double quotes: L<C<< (?>pattern) >>>.
270 ###
271 .SH "LINK QUOTING"
272 .IX Header "LINK QUOTING"
273 There should not be double quotes: \f(CW\*(C`(?>pattern)\*(C'\fR.
274 ###
275
276 ###
277 =head1 SE<lt>E<gt> MAGIC
278
279 Magic should be applied S<RISC OS> to that.
280 ###
281 .SH "S<> MAGIC"
282 .IX Header "S<> MAGIC"
283 Magic should be applied \s-1RISC\s0\ \s-1OS\s0 to that.
284 ###
285
286 ###
287 =head1 MAGIC MONEY
288
289 These should be identical.
290
291 Bippity boppity boo "The
292 price is $Z<>100."
293
294 Bippity boppity boo "The
295 price is $100."
296 ###
297 .SH "MAGIC MONEY"
298 .IX Header "MAGIC MONEY"
299 These should be identical.
300 .PP
301 Bippity boppity boo \*(L"The
302 price is \f(CW$100\fR.\*(R"
303 .PP
304 Bippity boppity boo \*(L"The
305 price is \f(CW$100\fR.\*(R"
306 ###
307
308 ###
309 =head1 NAME
310
311 "Stuff" (no guesswork)
312
313 =head2 THINGS
314
315 Oboy, is this C++ "fun" yet! (guesswork)
316 ###
317 .SH "NAME"
318 "Stuff" (no guesswork)
319 .SS "\s-1THINGS\s0"
320 .IX Subsection "THINGS"
321 Oboy, is this \*(C+ \*(L"fun\*(R" yet! (guesswork)
322 ###
323
324 ###
325 =head1 Newline C Quote Weirdness
326
327 Blorp C<'
328 ''>. Yes.
329 ###
330 .SH "Newline C Quote Weirdness"
331 .IX Header "Newline C Quote Weirdness"
332 Blorp \f(CW\*(Aq
333 \&\*(Aq\*(Aq\fR. Yes.
334 ###
335
336 ###
337 =head1 Soft Hypen Testing
338
339 sigE<shy>action
340 manuE<shy>script
341 JarkE<shy>ko HieE<shy>taE<shy>nieE<shy>mi
342
343 And again:
344
345 sigE<173>action
346 manuE<173>script
347 JarkE<173>ko HieE<173>taE<173>nieE<173>mi
348
349 And one more time:
350
351 sigE<0x00AD>action
352 manuE<0x00AD>script
353 JarkE<0x00AD>ko HieE<0x00AD>taE<0x00AD>nieE<0x00AD>mi
354 ###
355 .SH "Soft Hypen Testing"
356 .IX Header "Soft Hypen Testing"
357 sig\%action
358 manu\%script
359 Jark\%ko Hie\%ta\%nie\%mi
360 .PP
361 And again:
362 .PP
363 sig\%action
364 manu\%script
365 Jark\%ko Hie\%ta\%nie\%mi
366 .PP
367 And one more time:
368 .PP
369 sig\%action
370 manu\%script
371 Jark\%ko Hie\%ta\%nie\%mi
372 ###
373
374 ###
375 =head1 XE<lt>E<gt> Whitespace
376
377 Blorpy L<B<prok>|blap> X<bivav> wugga chachacha.
378 ###
379 .SH "X<> Whitespace"
380 .IX Header "X<> Whitespace"
381 Blorpy \fBprok\fR  wugga chachacha.
382 .IX Xref "bivav"
383 ###
384
385 ###
386 =head1 Hyphen in SE<lt>E<gt>
387
388 Don't S<transform even-this hyphen>.  This "one's-fine!", as well.  However,
389 $-0.13 should have a real hyphen.
390 ###
391 .SH "Hyphen in S<>"
392 .IX Header "Hyphen in S<>"
393 Don't transform\ even-this\ hyphen.  This \*(L"one's-fine!\*(R", as well.  However,
394 $\-0.13 should have a real hyphen.
395 ###
396
397 ###
398 =head1 Quote escaping
399
400 Don't escape `this' but do escape C<`this'> (and don't surround it in quotes).
401 ###
402 .SH "Quote escaping"
403 .IX Header "Quote escaping"
404 Don't escape `this' but do escape \f(CW\`this\*(Aq\fR (and don't surround it in quotes).
405 ###
406
407 ###
408 =pod
409
410 E<eth>
411 ###
412 .PP
413 \&\*(d-
414 ###
415
416 ###
417 =head1 C<one> and C<two>
418 ###
419 .ie n .SH """one"" and ""two"""
420 .el .SH "\f(CWone\fP and \f(CWtwo\fP"
421 .IX Header "one and two"
422 ###
423
424 ###
425 =pod
426
427 Some text.
428
429 =for man
430 Some raw nroff.
431
432 =for roff \fBBold text.\fP
433
434 =for html
435 Stuff that's hidden.
436
437 =for MAN \fIItalic text.\fP
438
439 =for ROFF
440 .PP
441 \&A paragraph.
442
443 More text.
444 ###
445 Some text.
446 Some raw nroff.
447 \fBBold text.\fP
448 \fIItalic text.\fP
449 .PP
450 \&A paragraph.
451 .PP
452 More text.
453 ###
454
455 ###
456 =head1 NAME
457
458 test - C<test>
459 ###
460 .SH "NAME"
461 test \- "test"
462 ###
463
464 ###
465 =head1 INDEX
466
467 Index entry matching a whitespace escape.X<\n>
468 ###
469 .SH "INDEX"
470 .IX Header "INDEX"
471 Index entry matching a whitespace escape.
472 .IX Xref "\\n"
473 ###
474
475 ###
476 =head1 LINK TO URL
477
478 This is a L<link|http://www.example.com/> to a URL.
479 ###
480 .SH "LINK TO URL"
481 .IX Header "LINK TO URL"
482 This is a link <http://www.example.com/> to a \s-1URL.\s0
483 ###
484
485 ###
486 =head1 NAME
487
488 test - B<test> I<italics> F<file>
489 ###
490 .SH "NAME"
491 test \- test italics file
492 ###
493
494 ###
495 =head1 TRAILING SPACE
496
497 HelloS< >
498
499 worldS<   >
500
501 .
502 ###
503 .SH "TRAILING SPACE"
504 .IX Header "TRAILING SPACE"
505 Hello\ 
506 .PP
507 world\ \ \ 
508 .PP
509 \&.
510 ###
511
512 ###
513 =head1 URL LINK
514
515 The newest version of this document is also available on the World Wide Web at
516 L<http://pod.tst.eu/http://cvs.schmorp.de/rxvt-unicode/doc/rxvt.7.pod>.
517 ###
518 .SH "URL LINK"
519 .IX Header "URL LINK"
520 The newest version of this document is also available on the World Wide Web at
521 <http://pod.tst.eu/http://cvs.schmorp.de/rxvt\-unicode/doc/rxvt.7.pod>.
522 ###
523
524 ###
525 =head1 RT LINK
526
527 L<[perl #12345]|https://rt.cpan.org/12345>
528 ###
529 .SH "RT LINK"
530 .IX Header "RT LINK"
531 [perl #12345] <https://rt.cpan.org/12345>
532 ###
533
534 ###
535 =head1 Multiline XZ<><>
536
537 Something something X<this   is
538 one index term>
539 ###
540 .SH "Multiline X<>"
541 .IX Header "Multiline X<>"
542 Something something
543 .IX Xref "this is one index term"
544 ###
545
546 ###
547 =head1 Uppercase License
548
549 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
550 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
551 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
552 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
553 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
554 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
555 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
556 ###
557 .SH "Uppercase License"
558 .IX Header "Uppercase License"
559 \&\s-1THE SOFTWARE IS PROVIDED \*(L"AS IS\*(R", WITHOUT WARRANTY OF ANY KIND,
560 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
561 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
562 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
563 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
564 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
565 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\s0
566 ###