use Test::More tests => 9;
use strict;
use warnings;
use Dancer2::FileUtils 'path';
use Dancer2::Template::Simple;
{
package Foo;
use Moo;
has x => ( is => 'rw' );
has y => ( is => 'rw' );
sub method {"yeah"}
}
# variable interpolation, with file-based template
my $engine = Dancer2::Template::Simple->new;
my $template = path( 't', 'views', 'template_simple_index.tt' );
my $result = $engine->render(
$template,
{ var1 => "xxx",
var2 => "yyy",
foo => 'one',
bar => 'two',
baz => 'three'
}
);
my $expected = 'this is var1="xxx" and var2=yyy'
. "\n\nanother line\n\n one two three\n\nxxx/xxx\n";
is $result, $expected, "template got processed successfully";
# variable interpolation, with scalar-based template
$expected = "one=1, two=2, three=3 - 77";
$template = "one=<% one %>, two=<% two %>, three=<% three %> - <% hash.key %>";
eval { $engine->render( $template, { one => 1, two => 2, three => 3 } ) };
like $@, qr/Can't open .* using mode '<'/, "prototype failure detected";
$result = $engine->render(
\$template,
{ one => 1, two => 2, three => 3,
hash => { key => 77 },
}
);
is $result, $expected, "processed a template given as a scalar ref";
# complex variable interpolation (object, coderef and hash)
my $foo = Foo->new;
$foo->x(42);
$template =
'foo->x == <% foo.x %> foo.method == <% foo.method %> foo.dumb=\'<% foo.dumb %>\'';
$expected = 'foo->x == 42 foo.method == yeah foo.dumb=\'\'';
$result = $engine->render( \$template, { foo => $foo } );
is $result, $expected, 'object are interpolated in templates';
$template = 'code = <% code %>, code <% hash.code %>';
$expected = 'code = 42, code 42';
$result = $engine->render(
\$template,
{ code => sub {42},
hash => {
code => sub {42}
}
}
);
is $result, $expected, 'code ref are interpolated in templates';
$template = 'array: <% array %>, hash.array: <% hash.array %>';
$expected = 'array: 1 2 3 4 5, hash.array: 6 7 8';
$result = $engine->render(
\$template,
{ array => [ 1, 2, 3, 4, 5 ],
hash => { array => [ 6, 7, 8 ] }
}
);
is $result, $expected, "arrayref are interpolated in templates";
# if-then-else
$template = '<% if want %>hello<% else %>goodbye<% end %> world';
$result = $engine->render( \$template, { want => 1 } );
is $result, 'hello world', "true boolean condition matched";
$result = $engine->render( \$template, { want => 0 } );
is $result, 'goodbye world', "false boolean condition matched";
$template = 'one: 1
two: <% two %>
three : <% three %>';
$result = $engine->render( \$template, { two => 2, three => 3 } );
is $result, 'one: 1
two: 2
three : 3', "multiline template processed";