#!/usr/bin/perl
#
# Basic tests for podlators.
#
# This test case uses a single sample file and runs it through all available
# formatting modules, comparing the results to known-good output that's
# included with the package. This provides a general sanity check that the
# modules are working properly.
#
# New regression tests and special cases should probably not be added to the
# sample input file, since updating all the output files is painful. Instead,
# the machinery to run small POD snippets through the specific formatter being
# tested should probably be used instead.
#
# Copyright 2001, 2002, 2004, 2006, 2009, 2012, 2014, 2015
# Russ Allbery <rra@cpan.org>
#
# This program is free software; you may redistribute it and/or modify it
# under the same terms as Perl itself.
use 5.006;
use strict;
use warnings;
use lib 't/lib';
use File::Spec;
use Test::More tests => 15;
use Test::Podlators qw(slurp);
# Check that all the modules can be loaded.
BEGIN {
use_ok('Pod::Man');
use_ok('Pod::Text');
use_ok('Pod::Text::Color');
use_ok('Pod::Text::Overstrike');
use_ok('Pod::Text::Termcap');
}
# Flush output, since otherwise our diag messages come after other tests.
local $| = 1;
# Hard-code configuration for Term::Cap to get predictable results.
local $ENV{COLUMNS} = 80;
local $ENV{TERM} = 'xterm';
local $ENV{TERMPATH} = File::Spec->catfile('t', 'data', 'termcap');
local $ENV{TERMCAP} = 'xterm:co=#80:do=^J:md=\\E[1m:us=\\E[4m:me=\\E[m';
# Find the source of the test file.
my $INPUT = File::Spec->catfile('t', 'data', 'basic.pod');
# Map of translators to the file containing the formatted output to compare
# against.
my %OUTPUT = (
'Pod::Man' => File::Spec->catfile('t', 'data', 'basic.man'),
'Pod::Text' => File::Spec->catfile('t', 'data', 'basic.txt'),
'Pod::Text::Color' => File::Spec->catfile('t', 'data', 'basic.clr'),
'Pod::Text::Overstrike' => File::Spec->catfile('t', 'data', 'basic.ovr'),
'Pod::Text::Termcap' => File::Spec->catfile('t', 'data', 'basic.cap'),
);
# Options to pass to all formatting modules. Match the pod2text default.
my @OPTIONS = (sentence => 0);
# Walk through teach of the modules and format the sample file, checking to
# ensure the results match the pre-generated file.
for my $module (sort keys %OUTPUT) {
my $parser = $module->new(@OPTIONS);
isa_ok($parser, $module, 'parser object');
# Run the formatting module. Store the output into a Perl variable
# instead of a file.
my $got;
$parser->output_string(\$got);
$parser->parse_file($INPUT);
# If the test module is Pod::Man, strip off the header. This test does
# not attempt to compare it, since it contains version numbers that
# change.
if ($module eq 'Pod::Man') {
$got =~ s{ \A .* \n [.]nh \n }{}xms;
}
# OS/390 is EBCDIC, which apparently uses a different character for ESC.
# Try to convert so that the test still works.
if ($^O eq 'os390' && $module eq 'Pod::Text::Termcap') {
$got =~ tr{\033}{\047};
}
# Check the output. If it doesn't match, save the erroneous output in a
# file for later inspection.
my $expected = slurp($OUTPUT{$module});
if (!ok($got eq $expected, "$module output is correct")) {
my ($suffix) = ($OUTPUT{$module} =~ m{ [.] ([^.]+) \z }xms);
my $tmpdir = File::Spec->catdir('t', 'tmp');
if (!-d $tmpdir) {
mkdir($tmpdir, 0777);
}
my $outfile = File::Spec->catfile('t', 'tmp', "out$$.$suffix");
open(my $output, '>', $outfile)
or BAIL_OUT("cannot create $outfile for failed output: $!");
print {$output} $got
or BAIL_OUT("cannot write failed output to $outfile: $!");
close($output)
or BAIL_OUT("cannot write failed output to $outfile: $!");
diag("Non-matching output left in $outfile");
}
}