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;

my $tx = Text::Xslate->new();

my @data = (
    ['<:= $var.field :>', 'value'],

    ['<:= $g.f.x :>',  'gfx'],
    ['<:= $x.f.g :>',  'xfg'],
    ['<:= $a.foo :>',  'bar'],

    ['<:= $ary.0 :>', 10],
    ['<:= $ary.1 :>', 20],
    ['<:= $ary.2 :>', 30],

    ['<:= $var["field"] :>',  'value'],

    ['<:= $g["f"]["x"] :>',  'gfx'],
    ['<:= $x["f"]["g"] :>',  'xfg'],
    ['<:= $a["foo"] :>',     'bar'],

    ['<:= $a[$foo] :>',      'bar'],
    ['<:= $a[$foo] :>',      'bar'],

    ['<:= $ary[0] :>', 10],
    ['<:= $ary[1] :>', 20],
    ['<:= $ary[2] :>', 30],

    ['<: constant foo   = "xxx"; $var[foo]   :>', "yyy"],
    ['<: constant field = "xxx"; $var[field] :>', "yyy"],

    ['<: constant foo   = "xxx"; $var.foo   :>', "FOO"],
    ['<: constant field = "xxx"; $var.field :>', "value"],

    ['<: $var.if :>',  'IF'],
    ['<: $var.nil :>', 'NIL'],
    ['<: $var.not :>', 'NOT'],
    ['<: $var.true :>', 'TRUE'],
    ['<: $var[true] :>', 'one'],

    ['<: $ary[false] :>', '10'],
    ['<: $ary[true]  :>', '20'],

    ['<: $a :>', 'as_string'],
);

{
    package A;
    use Mouse;
    use overload '""' => sub{ "as_string" };

    has foo => (
        is => 'rw',
    );
}

my %vars = (
    var => {
        foo   => 'FOO',
        field => 'value',
        xxx   => 'yyy',
        if    => 'IF',
        nil   => 'NIL',
        true  => 'TRUE',
        not   => 'NOT',
        1     => 'one',
    },

    g => { f => { x => 'gfx' } },
    x => { f => { g => 'xfg' } },
    a => A->new(foo => 'bar'),

    ary => [10, 20, 30],

    foo => 'foo',
);

foreach my $pair(@data) {
    my($in, $out) = @$pair;

    is $tx->render_string($in, \%vars), $out or diag $in;
}

done_testing;