The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use strict;
use Pod::POM;
use Pod::POM::View::HTML::Filter;

$Pod::POM::DEFAULT_VIEW = Pod::POM::View::HTML::Filter->new;

my @tests = map { [ split /^---.*?^/ms ] } split /^===.*?^/ms, << 'TESTS';
=begin filter bang | foo

bar foo bar

=end filter
---
<html><body bgcolor="#ffffff">
<pre>ba! bar ba!</pre>
</body></html>
===
=begin filter foo | bang

bar foo bar

=end filter
---
<html><body bgcolor="#ffffff">
<pre>ba! ba! ba!</pre>
</body></html>
TESTS

plan tests => scalar @tests + 2;

# add a new language
Pod::POM::View::HTML::Filter->add(
    foo     => { code => sub { my $s = shift; $s =~ s/foo/bar/g; $s } },
    options => { code => sub { "[$_[0]]<$_[1]>" } },
    bang => {
        code     => sub { my $s = shift; $s =~ y/r/!/; $s },
        verbatim => 1
    },
);

my $parser = Pod::POM->new;
for ( @tests ) {
    my $pom = $parser->parse_text( $_->[0] ) || diag $parser->error;
    is( "$pom", $_->[1], "Correct output" );
}

# check what happens if $pom->present is called twice in a row
my $pom = $parser->parse_text( << 'EOT' ) || diag $parser->error;
=begin filter foo | bang

    foo bar baz

=end filter foo
EOT
my $expected = << 'EOT';
<html><body bgcolor="#ffffff">
<pre>    ba! ba! baz</pre>
</body></html>
EOT

is( "$pom", $expected, "Correct output the first time" );
is( "$pom", $expected, "Correct output the second time around" );