The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#!/usr/bin/perl -w
#
# Make sure the PODs don't contain invalid markup
#
# Use podchecker to find the actual POD error
#
# An awful lot of this was nicked from Test::Pod
use strict;
use vars qw(@files);
# Pod::Parser has some warnings, so disable them
local $SIG{__WARN__} = sub {};
BEGIN {
eval {
require Pod::Checker;
};
if ($@) {
print "1..0 # Skipped - do not have Find::File::Rule or Pod::Checker installed\n";
exit;
}
}
BEGIN {
@files = File::Find::Rule->file()->name('*.pm', '*.pod')->in('.');
}
use Test::More tests => scalar @files;
use constant OK => 0;
use constant NO_FILE => -2;
use constant NO_POD => -1;
use constant WARNINGS => 1;
use constant ERRORS => 2;
foreach my $file ( @files ) {
my $hash = _check_pod( $file );
my $status = $hash->{result};
if ( $status == NO_FILE ) {
ok( 0, "Did not find [$file]");
} elsif ( $status == OK ) {
ok( 1, "Pod OK in [$file]" );
} elsif ( $status == ERRORS ) {
ok( 0, "Pod had errors in [$file]" );
system("podchecker", $file);
} elsif ( $status == WARNINGS ) {
ok( 1, "Pod had warnings in [$file], but that's okay" );
} elsif ( $status == WARNINGS ) {
ok( 0, "Pod had warnings in [$file]" );
} elsif ( $status == NO_POD ) {
ok( 0, "Found no pod in [$file]" );
} else {
ok( 0, "Mysterious failure for [$file]" );
}
}
sub _check_pod {
my $file = shift;
return { result => NO_FILE } unless -e $file;
my %hash = ();
my $checker = Pod::Checker->new();
# i pass it a null filehandle because i need to fool
# Pod::Checker into thinking it is sending the errors
# somewhere so it will count them for me.
tie( *NULL, 'IO::Null' );
$checker->parse_from_file( $file, \*NULL );
$hash{ result } = do {
$hash{errors} = $checker->num_errors;
$hash{warnings} = $checker->can('num_warnings') ?
$checker->num_warnings : 0;
if ( $hash{errors} == -1 ) {
NO_POD;
} elsif ( $hash{errors} > 0 ) {
ERRORS;
} elsif ( $hash{warnings} > 0 ) {
WARNINGS;
} else {
OK;
}
};
return \%hash;
}