The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use Test::More;

use Text::Xslate;
use FindBin qw($Bin);
use t::lib::Util;
use File::Copy qw(copy move);
use File::Path qw(rmtree);

use Fatal qw(utime);

my @files  = (path."/hello.tx",  path."/for.tx");
my @caches;

rmtree cache_dir;
my $x = path."/hello.tx";
END{
    move "$x.save" => $x if $x && -f "$x.save";
    rmtree cache_dir;
}

{
    my $tx = Text::Xslate->new(
        path      => [path],
        cache_dir => cache_dir,
    );

    push @caches, $tx->find_file($_)->{cachepath}
        for qw(hello.tx for.tx);
}

for(1 .. 10) {
    my $tx = Text::Xslate->new(
        path      => [path],
        cache_dir => cache_dir,
    );

    is $tx->render('hello.tx', { lang => 'Xslate' }),
        "Hello, Xslate world!\n", "file (preload $_)";

    is $tx->render('for.tx', { books => [ { title => "Foo" }, { title => "Bar" } ]}),
        "[Foo]\n[Bar]\n", "file (preload $_)";

    ok -e $_, "$_ exists" for @caches;

    if(($_ % 3) == 0) {
        my $t = time + $_;
        utime $t, $t, @caches;
    }
}

for(1 .. 10) {
    my $tx = Text::Xslate->new(path => [path], cache_dir => cache_dir);

    is $tx->render('hello.tx', { lang => 'Xslate' }),
        "Hello, Xslate world!\n", "file (on demand $_)";

    is $tx->render('for.tx', { books => [ { title => "Foo" }, { title => "Bar" } ]}),
        "[Foo]\n[Bar]\n", "file (on demand $_)";

    if(($_ % 3) == 0) {
        my $t = time() + $_*10;
        utime $t, $t, @files;
    }
}

unlink @caches;

my $tx = Text::Xslate->new(path => [path], cache_dir => cache_dir);

is $tx->render('hello.tx', { lang => 'Xslate' }), "Hello, Xslate world!\n", "file";

# change the content
move  $x      => "$x.save";
copy "$x.mod" =>  $x;

utime $^T+10, $^T+10, $x;

is $tx->render('hello.tx', { lang => 'Perl' }),
    "Hi, Perl.\n", "auto reload $_" for 1 .. 2;

move "$x.save" => $x or diag "cannot move $x.save to $x: $!";

unlink @caches;

note 'cache => 2 (release mode)';

$tx = Text::Xslate->new(cache => 2, path => [path], cache_dir => cache_dir);

utime $^T, $^T, $x;

is $tx->render('hello.tx', { lang => 'Xslate' }),
    "Hello, Xslate world!\n", "first" for 1 .. 2;

# change the content
move  $x      => "$x.save";
copy "$x.mod" =>  $x;

utime $^T+10, $^T+10, $x;

is $tx->render('hello.tx', { lang => 'Xslate' }),
    "Hello, Xslate world!\n", "second (modified, but not reloaded)" for 1 .. 2;



done_testing;