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 %vars = (
    xx    => { yy => { zz => 42 } },
    value => 10,
    data  => [1, 2, 3],
    a     => 10,
    b     => 20,
    c     => 30,
);

my @data = (
    [ <<'T', <<'X'],
<: $xx.yy.zz :>
T
42
X

    [ <<'T', <<'X'],
<: $xx
    .yy.zz :>
T
42
X
    [ <<'T', <<'X'],
<: $xx # comment
    .yy.zz :>
T
42
X

    [ <<'T', <<'X'],
<: $xx.
    yy.zz :>
T
42
X

    [ <<'T', <<'X'],
<: $xx. # comment
    yy.zz :>
T
42
X

    [ <<'T', <<'X'],
<: $xx
    .
    yy
    .
    zz :>
T
42
X

    [ <<'T', <<'X'],
<: $a
    + $b
    + $c :>
T
60
X

    [<<'T', <<'X'],
<:
    if($value == 10) {
        print "Hello, world!";
    }
    print "\n";
-:>
T
Hello, world!
X

    [<<'T', <<'X'],
<:
    for $data -> $item {
        print "[" ~ $item ~ "]";
    }
    print "\n";
-:>
T
[1][2][3]
X


    [<<'T', <<'X'],
<:
    given $value -> $it {
        default { print "[" ~ $it ~ "]"; }
    }
    print "\n";
-:>
T
[10]
X

    [<<'T', <<'X', 'block'],
<:
    for [$value] -> $it {
        if(1) { print "[" ~ $it ~ "]"; }
    }
    print "\n";
-:>
T
[10]
X

    [<<'T', <<'X', 'no last semicolon'],
<:
    block foo -> { "default value\n" }
-:>
T
default value
X

    [<<'T', '', 'empty block'],
<:
    block foo -> { }
-:>
T

    [<<'T', <<'X', 'no last semicolon'],
<:
    block foo -> { "default value\n" }
-:>
T
default value
X

    [<<'T', <<'X', 'finish statement'],
<:
    block foo -> { print "bar\n" }
-:>
T
bar
X

    [<<'T', <<'X', 'multi blocks'],
<:
    block foo -> { print "bar\n" }
    block bar -> { print "baz\n" }
-:>
T
bar
baz
X

    [<<'T', <<'X'],
<:
    my $a = [
        10,
        20,
        30,
    ];
    print $a[0], "\n";
    print $a[1], "\n";
    print $a[2], "\n";
-:>
T
10
20
30
X

    [<<'T', <<'X'],
<:
    my $h = {
        foo => 10,
        bar => 20,
        baz => 30,
    };
    print $h.foo, "\n";
    print $h.bar, "\n";
    print $h.baz, "\n";
-:>
T
10
20
30
X

);

foreach my $d(@data) {
    my($in, $out, $msg) = @$d;
    is eval { $tx->render_string($in, \%vars) }, $out, $msg
        or diag $in;
}

done_testing;