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 = (
    ['<:= $value10 + 11 :>', 21],
    ['<:= $value10 - 11 :>', -1],

    ['<:= 12 + $value10 :>', 22],
    ['<:= 12 - $value10 :>',  2],

    ['<:= $value10 + $value20 :>', 30],
    ['<:= $value0  + $value20 :>', 20],

    ['<:= 1 + 3 + 5 :>',  9],
    ['<:= 1 + 3 - 5 :>', -1],
    ['<:= 1 - 3 + 5 :>',  3],

    ['<:=(1 - 3) + 5 :>',  3],
    ['<:= 1 - (3 + 5):>', -7],

    ['<:= 9 - (3 + (5 - 7)):>',  8],
    ['<:= (3 + (5 - 7)) + 9:>', 10],

    ['<:= 3 * 2 :>', 6],
    ['<:= 3 / 2 :>', 1.5],
    ['<:= 3 % 2 :>', 1],

    ['<:= 1 + 3 * 2 :>', 7],
    ['<:= 1 + 3 / 2 :>', 2.5],
    ['<:= 1 + 3 % 2 :>', 2],
    ['<:= 9 + 3 * 2 :>', 15],
    ['<:= 9 + 3 / 2 :>', 10.5],
    ['<:= 9 + 3 % 2 :>', 10],

    ['<:= 1 + 3 * 2 + 42 :>', 7   + 42],
    ['<:= 1 + 3 / 2 + 42 :>', 2.5 + 42],
    ['<:= 1 + 3 % 2 + 42 :>', 2   + 42],
    ['<:= 9 + 3 * 2 + 42 :>', 15  + 42],
    ['<:= 9 + 3 / 2 + 42 :>', 10.5+ 42],
    ['<:= 9 + 3 % 2 + 42 :>', 10  + 42],

    ['<:= "foo" x 0 :>',    "foo" x 0],
    ['<:= "foo" x 3 :>',    "foo" x 3],
    ['<:= "foo" x 10.5 :>', "foo" x 10.5],

    # from Perl6
    ['<:= "foo" ~ "bar" :>',         "foobar" ],
    ['<:= "foo" ~ "bar" ~ "baz" :>', "foobarbaz" ],

    ['<: 10 min 20 :>', 10 ],
    ['<: 20 min 10 :>', 10 ],
    ['<: 10 max 20 :>', 20 ],
    ['<: 20 max 10 :>', 20 ],

    ['<: 10 min 20 min 30 :>', 10 ],
    ['<: 30 min 20 min 10 :>', 10 ],
    ['<: 10 max 20 max 30 :>', 30 ],
    ['<: 30 max 20 max 10 :>', 30 ],

    ['<: ($value0 == 0 ? 10 : 20) min 30 :>', 10 ],
    ['<: ($value0 != 0 ? 10 : 20) min 30 :>', 20 ],
    ['<: ($value0 == 0 ? 10 : 20) max 30 :>', 30 ],
    ['<: ($value0 != 0 ? 10 : 20) max 30 :>', 30 ],

    ['<: 30 min ($value0 == 0 ? 10 : 20) :>', 10 ],
    ['<: 30 min ($value0 != 0 ? 10 : 20) :>', 20 ],
    ['<: 30 max ($value0 == 0 ? 10 : 20) :>', 30 ],
    ['<: 30 max ($value0 != 0 ? 10 : 20) :>', 30 ],
);

my %vars = (
    value0  =>  0,
    value10 => 10,
    value20 => 20,
);
foreach my $pair(@data) {
    my($in, $out) = @$pair;

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

done_testing;