The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 5;
BEGIN { use_ok('HTML::Template::Compiled') };
HTML::Template::Compiled->ExpireTime(1);
use lib 't';
use HTC_Utils qw($tdir &cdir &create_cache &remove_cache);
my $cache_dir = "cache05";
$cache_dir = create_cache($cache_dir);

my $filter = sub {
	for (${$_[0]}) {
		s#\{\{\{ nomen est (\w+) \}\}\}#<tmpl_var name="$1">#gi;
		s#\{\{\{ iterate over (\w+) \}\}\}#<tmpl_loop name="$1">#gi;
		s#\{\{\{ end of iterate \}\}\}#</tmpl_loop>#gi;
		s#\{\{\{ occupy (\S+) \}\}\}#<tmpl_include $1>#gi;
	};
};

my $f1 = File::Spec->catfile(qw/ t templates filter.htc /);
my $f2 = File::Spec->catfile(qw/ t templates filter_included.htc /);
chmod 0644, $f1;
chmod 0644, $f2;

my $filters = {
	'sub' => $filter,
};
test($filter, 1);
test([$filters], 2);
test($filters, 3);
test($filters, 4);

sub test {
	my ($f, $i) = @_;
	# test filter
    utime(time, time, $f2) or die $!;
    unless ($i == 4) {
        utime(time, time, $f1) or die $!;
    }
    sleep 1;
    my $htc;
    {
        local $SIG{__WARN__} = sub {
            unless ($_[0] =~ m/subroutine .* redefined/i) {
                print STDERR "warning: @_\n";
            }
        };
        $htc = HTML::Template::Compiled->new(
            path => 't/templates',
            filename => 'filter.htc',
            filter => $f,
            file_cache_dir => $cache_dir,
            file_cache => 1,
        );
    }
	$htc->param(
		omen => 'Caesar',
		list => [
			{ bellum => 'Gallicum' },
			{ bellum => 'Gallicum I' },
			{ bellum => 'Gallicum II' },
		],
	);
	my $exp = <<'EOM';
Name: Caesar
War: Bellum Gallicum
War: Bellum Gallicum I
War: Bellum Gallicum II

Included Name: Caesar

EOM
	my $out = $htc->output();
	cmp_ok($out, 'eq', $exp, "filter $i");
	$htc->clear_cache() if $i < 3;
    #print "\n($out)\n($exp)\n";
    delete $INC{'HTML/Template/Compiled/Filter.pm'};
    no strict 'refs';
    undef *{ 'HTML::Template::Compiled::Filter::filter' };
}

HTML::Template::Compiled->clear_filecache($cache_dir);
remove_cache($cache_dir);


__END__