1b8851fccSafresh1#!/usr/bin/perl
2b8851fccSafresh1#
3*e0680481Safresh1# Test for graceful degradation to non-UTF-8 output without Encode module.
4b8851fccSafresh1#
5b8851fccSafresh1# Copyright 2016 Niko Tyni <ntyni@iki.fi>
6*e0680481Safresh1# Copyright 2016, 2018-2019, 2022 Russ Allbery <rra@cpan.org>
7b8851fccSafresh1#
8b8851fccSafresh1# This program is free software; you may redistribute it and/or modify it
9b8851fccSafresh1# under the same terms as Perl itself.
10f3efcd01Safresh1#
11f3efcd01Safresh1# SPDX-License-Identifier: GPL-1.0-or-later OR Artistic-1.0-Perl
12b8851fccSafresh1
13*e0680481Safresh1use 5.010;
14b8851fccSafresh1use strict;
15b8851fccSafresh1use warnings;
16b8851fccSafresh1
17*e0680481Safresh1use Carp qw(croak);
18*e0680481Safresh1
19*e0680481Safresh1use Test::More tests => 8;
20b8851fccSafresh1
2156d68f1eSafresh1# Remove the record of the Encode module being loaded if it already was (it
2256d68f1eSafresh1# may have been loaded before the test suite runs), and then make it
2356d68f1eSafresh1# impossible to load it.  This should be enough to trigger the fallback code
2456d68f1eSafresh1# in Pod::Man.
25b8851fccSafresh1BEGIN {
2656d68f1eSafresh1    delete $INC{'Encode.pm'};
27b8851fccSafresh1    my $reject_encode = sub {
28b8851fccSafresh1        if ($_[1] eq 'Encode.pm') {
29*e0680481Safresh1            croak('refusing to load Encode');
30b8851fccSafresh1        }
31b8851fccSafresh1    };
32b8851fccSafresh1    unshift(@INC, $reject_encode);
33b8851fccSafresh1    ok(!eval { require Encode }, 'Cannot load Encode any more');
34b8851fccSafresh1}
35b8851fccSafresh1
36b8851fccSafresh1# Load the module.
37b8851fccSafresh1BEGIN {
38b8851fccSafresh1    use_ok('Pod::Man');
39b8851fccSafresh1}
40b8851fccSafresh1
41b8851fccSafresh1# Ensure we don't get warnings by throwing an exception if we see any.  This
42b8851fccSafresh1# is overridden below when we enable utf8 and do expect a warning.
43*e0680481Safresh1local $SIG{__WARN__} = sub {
44*e0680481Safresh1    my @warnings = @_;
45*e0680481Safresh1    croak(join("\n", 'No warnings expected; instead got:', @warnings));
46eac174f2Safresh1};
47*e0680481Safresh1
48*e0680481Safresh1# First, check that everything works properly if an encoding of roff is set.
49*e0680481Safresh1# We expect to get accent-mangled ASCII output.  Don't use Test::Podlators,
50*e0680481Safresh1# since it wants to import Encode.
51*e0680481Safresh1my $invalid_char = chr(utf8::unicode_to_native(0xE9));
52*e0680481Safresh1my $pod = "=encoding latin1\n\n=head1 NAME\n\nBeyonc${invalid_char}!";
53*e0680481Safresh1my $parser = Pod::Man->new(name => 'test', encoding => 'roff');
54b8851fccSafresh1my $output;
55b8851fccSafresh1$parser->output_string(\$output);
56b8851fccSafresh1$parser->parse_string_document($pod);
57b8851fccSafresh1like(
58b8851fccSafresh1    $output,
59b8851fccSafresh1    qr{ Beyonce\\[*]\' }xms,
60*e0680481Safresh1    'Works without Encode for roff encoding',
61b8851fccSafresh1);
62b8851fccSafresh1
63*e0680481Safresh1# Likewise for an encoding of groff.
64*e0680481Safresh1$parser = Pod::Man->new(name => 'test', encoding => 'groff');
65*e0680481Safresh1my $output_groff = q{};
66*e0680481Safresh1$parser->output_string(\$output_groff);
67*e0680481Safresh1$parser->parse_string_document($pod);
68*e0680481Safresh1like(
69*e0680481Safresh1    $output_groff,
70*e0680481Safresh1    qr{ Beyonc\\\[u00E9\] }xms,
71*e0680481Safresh1    'Works without Encode for groff encoding',
72*e0680481Safresh1);
73*e0680481Safresh1
74*e0680481Safresh1# The default output format is UTF-8, so it should produce an error message
75*e0680481Safresh1# and then degrade to groff.
76b8851fccSafresh1{
77b8851fccSafresh1    local $SIG{__WARN__} = sub {
78b8851fccSafresh1        like(
79b8851fccSafresh1            $_[0],
80*e0680481Safresh1            qr{ falling [ ] back [ ] to [ ] groff [ ] escapes }xms,
81*e0680481Safresh1            'Pod::Man warns with no Encode module',
82b8851fccSafresh1        );
83b8851fccSafresh1    };
84*e0680481Safresh1    $parser = Pod::Man->new(name => 'test');
85b8851fccSafresh1}
86*e0680481Safresh1$output = q{};
87*e0680481Safresh1$parser->output_string(\$output);
88b8851fccSafresh1$parser->parse_string_document($pod);
89*e0680481Safresh1is($output, $output_groff, 'Degraded gracefull to groff output');
90*e0680481Safresh1
91*e0680481Safresh1# Now try with an explicit output encoding, which should produce an error
92*e0680481Safresh1# message and then degrade to groff.
93*e0680481Safresh1{
94*e0680481Safresh1    local $SIG{__WARN__} = sub {
95*e0680481Safresh1        like(
96*e0680481Safresh1            $_[0],
97*e0680481Safresh1            qr{ falling [ ] back [ ] to [ ] groff [ ] escapes }xms,
98*e0680481Safresh1            'Pod::Man warns with no Encode module',
99*e0680481Safresh1        );
100*e0680481Safresh1    };
101*e0680481Safresh1    $parser = Pod::Man->new(name => 'test', encoding => 'iso-8859-1');
102*e0680481Safresh1}
103*e0680481Safresh1$output = q{};
104*e0680481Safresh1$parser->output_string(\$output);
105*e0680481Safresh1$parser->parse_string_document($pod);
106*e0680481Safresh1is(
107*e0680481Safresh1    $output, $output_groff,
108*e0680481Safresh1    'Explicit degraded gracefully to groff output',
109*e0680481Safresh1);
110