use Test::More; use strict; use warnings; use File::Spec::Functions; use Pod::POM; use Pod::POM::View::HTML::Filter; eval { require Test::LongString; import Test::LongString; }; my $has_test_longstring = $@ eq ''; # our own string comparison test function sub is_same_string { my ($got, $expected, $name) = @_; if ($has_test_longstring) { is_string( $got, $expected, $name); } else { is( $got, $expected, $name); } } my %avail = map { $_ => 1 } grep { $_ ne 'default' } Pod::POM::View::HTML::Filter->filters(); # all available files my $re = @ARGV ? qr/@{[shift]}/ : qr//; my @pods = grep { /$re/ } glob( catfile( 't', 'pod', '*.src' ) ); # compute the test data my %result; my %pod; for my $file (@pods) { # read the file my $content; { local $/; open my $fh, $file or diag "Can't open $file: $!"; $content = <$fh>; close $fh; } # process the file content my ( $pod, @results ) = split /__RESULT__\n/, $content; for my $result (@results) { my ( $filters, $output ) = split /\n/, $result, 2; $result{$file}{$filters} = $output; } # create the pod $pod{$file} = $pod; } # compute the total number of tests my $tests; $tests += $_ for map { /\+/ ? 2 : 1 } map { keys %$_ } values %result; plan tests => $tests; # run the tests for all files for my $file ( sort keys %result ) { for my $format ( sort keys %{ $result{$file} } ) { SKIP: { my $skip = $format =~ /\+/ ? 2 : 1; # create the view my $view = Pod::POM::View::HTML::Filter->new(); # format is for example: +html-perl while ( $format =~ /([+-])(\w+)/g ) { # skip if required filter not here skip "$file <$format> [$2 not available]", $skip if $1 eq '+' && !$avail{$2}; # remove unwanted filter $view->delete($2) if $1 eq '-'; } # create the POM my $pom = Pod::POM->new()->parse_text( $pod{$file} ); # compare the results is_same_string( $view->print($pom), $result{$file}{$format}, "$file <$format>" ); # test a duplicate run on the same $pom/$view pair if ( $format =~ /\+/ ) { is_same_string( $view->print($pom), $result{$file}{$format}, "$file <$format> (2nd run)" ); } } } }