The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use warnings;
use Test::More;
use File::Path qw(rmtree);
use File::Basename;

use constant CACHE_DIR => basename(__FILE__);
BEGIN { rmtree(CACHE_DIR) }
END   { rmtree(CACHE_DIR) }

use Text::Xslate;

my $compile_called = 0;
{
    package MyEngine;
    our @ISA = qw(Text::Xslate);

    sub compile {
        my($self, @args) = @_;
        ::note 'compile!';
        $compile_called++;
        return $self->SUPER::compile(@args);
    }
}

my $phase = 0;
foreach my $i(0, 1) {
    my %vpath = (
        hello => 'hello#' . $i,
    );

    my $tx = MyEngine->new(
        cache_dir => CACHE_DIR,
        path      => [\%vpath],
    );
    foreach my $j(0, 1) {
        note "# $i-$j";

        is $tx->render('hello'), 'hello#' . $i;

        if($phase == 0) {
            is $compile_called, 1, 'compiling at first time';
        }
        elsif($phase == 1) {
            is $compile_called, 1, 'using cache, not compiled';
        }
        elsif($phase == 2) {
            is $compile_called, 2, 're-compiled because %vpath changed';
        }
        elsif($phase == 3) {
            is $compile_called, 2, 'using cache';
        }
        else {
            fail 'something failed';
        }
        $phase++;
    }
}

done_testing;