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 Tie::Array;
use Tie::Hash;

# for ARRAY

my @a;
tie @a, 'Tie::StdArray';

my %h;
tie %h, 'Tie::StdHash';

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

my @set = (
    [<<'T', [{ first => 'foo',  second => 'bar' }], <<'X'],
: for $data ->($item) {
    [<:=$item.first:>][<:=$item.second:>]
: }
T
    [foo][bar]
X

    [<<'T', [qw(foo bar baz)], <<'X'],
    <: $data.size() :>
T
    3
X

    [<<'T', [qw(foo bar baz)], <<'X'],
    <: $data.join(', ') :>
T
    foo, bar, baz
X

    [<<'T', [qw(foo bar baz)], <<'X'],
    <: $data.reverse().join(', ') :>
T
    baz, bar, foo
X


    [<<'T', { foo => 10, bar => 20 }, <<'X'],
    <: $data.keys().join(', ') :>
T
    bar, foo
X

    [<<'T', { foo => 10, bar => 20 }, <<'X'],
    <: $data.values().join(', ') :>
T
    20, 10
X

    [<<'T', { foo => 10, bar => 20 }, <<'X'],
    : for $data.kv() -> $pair {
    <: $pair.key :>=<: $pair.value :>
    : }
T
    bar=20
    foo=10
X

);

foreach my $d(@set) {
    my($in, $data, $out, $msg) = @$d;

    if(ref $data eq 'ARRAY') {
        @a = @{$data};
        $data = \@a;
    }
    else {
        %h = %{$data};
        $data = \%h;
    }
    is $tx->render_string($in, { data => $data }), $out, $msg
        or diag($in);
}

# for toplevel HASH

@a = (
    { first => 'aaa', second => 'bbb' },
    { first => 'ccc', second => 'ddd' },
);

%h = (data => \@a);

is $tx->render_string(<<'T', \%h), <<'X', "tied hash" for 1 .. 2;
: for $data ->($item) {
    [<:=$item.first:>][<:=$item.second:>]
: }
T
    [aaa][bbb]
    [ccc][ddd]
X

done_testing;