The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use lib 't/lib';
use Test::More;
use Test::Handlebars;

render_ok(
    '<h1>{{title}}</h1>',
    { title => 'Xslate rocks' },
    '<h1>Xslate rocks</h1>',
    "basic variables"
);

render_ok(
    '<h1>{{article.title}}</h1>',
    { article => { title => 'Hash references rock' } },
    '<h1>Hash references rock</h1>',
    ". separator"
);

render_ok(
    '<h1>{{article/title}}</h1>',
    { article => { title => 'Deprecated syntax does not' } },
    '<h1>Deprecated syntax does not</h1>',
    "/ separator"
);

render_ok(
    '<h1>{{page.article.title}}</h1> - {{date}}',
    {
        page => {
            article => { title => 'Multilevel field access' },
        },
        date => '2012-10-01',
    },
    '<h1>Multilevel field access</h1> - 2012-10-01',
    "multilevel field access with ."
);

render_ok(
    '{{#article}}<h1>{{title}}</h1> - {{../date}}{{/article}}',
    { article => { title => 'Backtracking' }, date => '2012-10-01' },
    '<h1>Backtracking</h1> - 2012-10-01',
    "backtracking with ../"
);

render_ok(
    <<'TEMPLATE',
{{#page}}
{{#article}}<h1>{{title}}</h1> - {{../../date}}{{/article}}
{{/page}}
TEMPLATE
    {
        page => {
            article => { title => 'Multilevel Backtracking' },
        },
        date => '2012-10-01',
    },
    <<'RENDERED',
<h1>Multilevel Backtracking</h1> - 2012-10-01
RENDERED
    "multilevel backtracking with ../"
);

render_ok(
    '{{#article}}<h1>{{title}}</h1> - {{../metadata.date}}{{/article}}',
    {
        article  => { title => 'Backtracking' },
        metadata => { date  => '2012-10-01' },
    },
    '<h1>Backtracking</h1> - 2012-10-01',
    "backtracking into other hash variables with ../ and ."
);

render_ok(
    '{{articles.[10].comments}}',
    {
        articles => {
            10 => { comments => "First post!" },
        },
    },
    'First post!',
    "field access with non-identifiers"
);

render_ok(
    '{{articles.[.foo\som#th"ing].comments}}',
    {
        articles => {
            '.foo\som#th"ing' => { comments => "First post!" },
        },
    },
    'First post!',
    "field access with non-identifiers"
);

render_ok(
    '{{articles.[10].comments}}',
    {
        articles => [
            (({}) x 10),
            { comments => "First post!" },
        ],
    },
    'First post!',
    "array dereferencing"
);

render_ok(
    '{{.}} {{this}}',
    "foo",
    "foo foo",
    "top level current context"
);

render_ok(
    '{{#thing}}{{.}} {{this}}{{/thing}}',
    {
        thing => [ "foo" ],
    },
    "foo foo",
    "nested current context"
);

render_ok(
    '{{#hellos}}{{this/text}}{{/hellos}}',
    {
        hellos => [
            { text => 'hello' },
            { text => 'Hello' },
            { text => 'HELLO' },
        ],
    },
    'helloHelloHELLO',
    "'this' with paths"
);

render_ok(
    '{{#thing}}{{{.}}} {{{this}}}{{/thing}}',
    {
        thing => [ "<foo>" ],
    },
    "<foo> <foo>",
    "{{{.}}}"
);

render_ok(
    '{{foo-bar}}',
    {
        'foo-bar' => "FOOBAR",
    },
    'FOOBAR',
    "- is a valid character"
);

render_ok(
    '{{foo.foo-bar}}',
    {
        foo => {
            'foo-bar' => "FOOBAR",
        },
    },
    'FOOBAR',
    "- is a valid character"
);

done_testing;