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