The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings FATAL => "all";
use Test::More tests => 3;
use Dancer2::Core::Hook;

use File::Spec::Functions qw(rel2abs catfile splitdir);
use Dancer2::Template::Xslate;

my $views = rel2abs(catfile((splitdir(__FILE__, 1))[0], "views"));

my $txs = Dancer2::Template::Xslate->new(
    views => $views,
    layout => "main.tx",
);

isa_ok $txs, "Dancer2::Template::Xslate";
ok $txs->does("Dancer2::Core::Role::Template");

$txs->add_hook(
    Dancer2::Core::Hook->new(
        name => "engine.template.before_render",
        code => sub {
            my ($tokens) = @_;
            $tokens->{before_template_render} = 1;
        },
    )
);

$txs->add_hook(
    Dancer2::Core::Hook->new(
        name => "engine.template.before_layout_render",
        code => sub {
            my ($tokens, $content) = @_;

            $tokens->{before_layout_render} = 1;
            $$content .= "\ncontent added in before_layout_render";
        },
    )
);

$txs->add_hook(
    Dancer2::Core::Hook->new(
        name => "engine.template.after_layout_render",
        code => sub {
            my ($content) = @_;
            $$content .= "\ncontent added in after_layout_render\n";
        },
    )
);

$txs->add_hook(
    Dancer2::Core::Hook->new(
        name => "engine.template.after_render",
        code => sub {
            my ($content) = @_;
            $$content .= "content added in after_template_render";
        }
    )
);


my $result = $txs->process("index.tx", {var => 42});
is $result, <<RESULT;
[top]
var = 42
before_layout_render = 1
---
[index]
var = 42

before_layout_render =
before_template_render = 1
content added in after_template_render
content added in before_layout_render
---
[bottom]

content added in after_layout_render
RESULT