honour $PERL_DESTRUCT_LEVEL on non-debug builds
[perl.git] / cpan / podlators / t / text / options.t
1 #!/usr/bin/perl -w
2 #
3 # Additional tests for Pod::Text options.
4 #
5 # Copyright 2002, 2004, 2006, 2008-2009, 2012-2013, 2015, 2018
6 #     Russ Allbery <rra@cpan.org>
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 # SPDX-License-Identifier: GPL-1.0-or-later OR Artistic-1.0-Perl
12
13 BEGIN {
14     chdir 't' if -d 't';
15     if ($ENV{PERL_CORE}) {
16         @INC = '../lib';
17     }
18     unshift (@INC, '../blib/lib');
19     $| = 1;
20 }
21
22 use strict;
23
24 use Test::More tests => 37;
25 BEGIN { use_ok ('Pod::Text') }
26
27 # Redirect stderr to a file.
28 sub stderr_save {
29     open (OLDERR, '>&STDERR') or die "Can't dup STDERR: $!\n";
30     open (STDERR, "> out$$.err") or die "Can't redirect STDERR: $!\n";
31 }
32
33 # Restore stderr.
34 sub stderr_restore {
35     close STDERR;
36     open (STDERR, '>&OLDERR') or die "Can't dup STDERR: $!\n";
37     close OLDERR;
38 }
39
40 my $n = 1;
41 while (<DATA>) {
42     my %options;
43     next until $_ eq "###\n";
44     while (<DATA>) {
45         last if $_ eq "###\n";
46         my ($option, $value) = split;
47         $options{$option} = $value;
48     }
49     open (TMP, "> tmp$$.pod") or die "Cannot create tmp$$.pod: $!\n";
50     while (<DATA>) {
51         last if $_ eq "###\n";
52         print TMP $_;
53     }
54     close TMP;
55     my $parser = Pod::Text->new (%options);
56     isa_ok ($parser, 'Pod::Text', 'Parser object');
57     open (OUT, "> out$$.tmp") or die "Cannot create out$$.tmp: $!\n";
58     stderr_save;
59     eval { $parser->parse_from_file ("tmp$$.pod", \*OUT) };
60     my $exception = $@;
61     stderr_restore;
62     close OUT;
63     open (TMP, "out$$.tmp") or die "Cannot open out$$.tmp: $!\n";
64     my $output;
65     {
66         local $/;
67         $output = <TMP>;
68     }
69     close TMP;
70     1 while unlink ("tmp$$.pod", "out$$.tmp");
71     my $expected = '';
72     while (<DATA>) {
73         last if $_ eq "###\n";
74         $expected .= $_;
75     }
76     is ($output, $expected, "Output correct for test $n");
77     open (ERR, "out$$.err") or die "Cannot open out$$.err: $!\n";
78     my $errors;
79     {
80         local $/;
81         $errors = <ERR>;
82     }
83     close ERR;
84     $errors =~ s/\Qtmp$$.pod/tmp.pod/g;
85     1 while unlink ("out$$.err");
86     if ($exception) {
87         $exception =~ s/ at .*//;
88         $errors .= "EXCEPTION: $exception";
89     }
90     $expected = '';
91     while (<DATA>) {
92         last if $_ eq "###\n";
93         $expected .= $_;
94     }
95     is ($errors, $expected, "Errors correct for test $n");
96     $n++;
97 }
98
99 # Below the marker are bits of POD and corresponding expected text output.
100 # This is used to test specific features or problems with Pod::Text.  The
101 # options, input, output, and errors are separated by lines containing only
102 # ###.
103
104 __DATA__
105
106 ###
107 alt 1
108 ###
109 =head1 SAMPLE
110
111 =over 4
112
113 =item F
114
115 Paragraph.
116
117 =item Bar
118
119 =item B
120
121 Paragraph.
122
123 =item Longer
124
125 Paragraph.
126
127 =back
128
129 ###
130
131 ==== SAMPLE ====
132
133 :   F   Paragraph.
134
135 :   Bar
136 :   B   Paragraph.
137
138 :   Longer
139         Paragraph.
140
141 ###
142 ###
143
144 ###
145 margin 4
146 ###
147 =head1 SAMPLE
148
149 This is some body text that is long enough to be a paragraph that wraps,
150 thereby testing margins with wrapped paragraphs.
151
152  This is some verbatim text.
153
154 =over 6
155
156 =item Test
157
158 This is a test of an indented paragraph.
159
160 This is another indented paragraph.
161
162 =back
163 ###
164     SAMPLE
165         This is some body text that is long enough to be a paragraph that
166         wraps, thereby testing margins with wrapped paragraphs.
167
168          This is some verbatim text.
169
170         Test  This is a test of an indented paragraph.
171
172               This is another indented paragraph.
173
174 ###
175 ###
176
177 ###
178 code 1
179 ###
180 This is some random text.
181 This is more random text.
182
183 This is some random text.
184 This is more random text.
185
186 =head1 SAMPLE
187
188 This is POD.
189
190 =cut
191
192 This is more random text.
193 ###
194 This is some random text.
195 This is more random text.
196
197 This is some random text.
198 This is more random text.
199
200 SAMPLE
201     This is POD.
202
203
204 This is more random text.
205 ###
206 ###
207
208 ###
209 sentence 1
210 ###
211 =head1 EXAMPLE
212
213 Whitespace around C<<  this.  >> must be ignored per perlpodspec.  >>
214 needs to eat all of the space in front of it.
215
216 =cut
217 ###
218 EXAMPLE
219     Whitespace around "this." must be ignored per perlpodspec.  >> needs to
220     eat all of the space in front of it.
221
222 ###
223 ###
224
225 ###
226 ###
227 =over 4
228
229 =item Foo
230
231 Bar.
232
233 =head1 NEXT
234 ###
235     Foo Bar.
236
237 NEXT
238 POD ERRORS
239     Hey! The above document had some coding errors, which are explained
240     below:
241
242     Around line 7:
243         You forgot a '=back' before '=head1'
244
245 ###
246 ###
247
248 ###
249 stderr 1
250 ###
251 =over 4
252
253 =item Foo
254
255 Bar.
256
257 =head1 NEXT
258 ###
259     Foo Bar.
260
261 NEXT
262 ###
263 tmp.pod around line 7: You forgot a '=back' before '=head1'
264 ###
265
266 ###
267 nourls 1
268 ###
269 =head1 URL suppression
270
271 L<anchor|http://www.example.com/>
272 ###
273 URL suppression
274     anchor
275
276 ###
277 ###
278
279 ###
280 errors stderr
281 ###
282 =over 4
283
284 =item Foo
285
286 Bar.
287
288 =head1 NEXT
289 ###
290     Foo Bar.
291
292 NEXT
293 ###
294 tmp.pod around line 7: You forgot a '=back' before '=head1'
295 ###
296
297 ###
298 errors die
299 ###
300 =over 4
301
302 =item Foo
303
304 Bar.
305
306 =head1 NEXT
307 ###
308     Foo Bar.
309
310 NEXT
311 ###
312 tmp.pod around line 7: You forgot a '=back' before '=head1'
313 EXCEPTION: POD document had syntax errors
314 ###
315
316 ###
317 errors pod
318 ###
319 =over 4
320
321 =item Foo
322
323 Bar.
324
325 =head1 NEXT
326 ###
327     Foo Bar.
328
329 NEXT
330 POD ERRORS
331     Hey! The above document had some coding errors, which are explained
332     below:
333
334     Around line 7:
335         You forgot a '=back' before '=head1'
336
337 ###
338 ###
339
340 ###
341 errors none
342 ###
343 =over 4
344
345 =item Foo
346
347 Bar.
348
349 =head1 NEXT
350 ###
351     Foo Bar.
352
353 NEXT
354 ###
355 ###
356
357 ###
358 quotes <<<>>>
359 ###
360 =head1 FOO C<BAR> BAZ
361
362 Foo C<bar> baz.
363 ###
364 FOO <<<BAR>>> BAZ
365     Foo <<<bar>>> baz.
366
367 ###
368 ###