#!perl -w
use strict;
use Test::More;
use Text::Xslate;
my $tx = Text::Xslate->new();
my @data = (
['<:= $value10 == 10 ? 3 : 5 :>', 3],
['<:= $value10 == 20 ? 3 : 5 :>', 5],
['<:= $value20 == 10 ? 3 : 5 :>', 5],
['<:= $value20 == 20 ? 3 : 5 :>', 3],
['<:= $value10 == 10 && $value20 == 20 ? 3 : 5 :>', 3],
['<:= $value10 == 10 || $value20 == 20 ? 3 : 5 :>', 3],
['<:= ($value10 == 10 && $value20 == 20) ? 3 : 5 :>', 3],
['<:= ($value10 == 10 || $value20 == 20) ? 3 : 5 :>', 3],
['<:= ($value10 == 10 && $value20 == 20) && 5 :>', 5],
['<:= ($value10 == 10 && $value20 != 20) && 5 :>', ''],
['<:= ($value10 == 10 && $value20 == 20) || 5 :>', 1],
['<:= ($value10 == 10 && $value20 != 20) || 5 :>', 5],
['<:= ($value10 != 10 && $value20 != 20) && 5 :>', ''],
['<:= ($value10 != 10 && $value20 != 20) || 5 :>', 5],
['<:= ($value10 == 10 || $value20 == 20) && 5 :>', 5],
['<:= ($value10 == 10 || $value20 != 20) && 5 :>', 5],
['<:= ($value10 == 10 || $value20 == 20) || 5 :>', 1],
['<:= ($value10 == 10 || $value20 != 20) || 5 :>', 1],
['<:= ($value10 != 10 || $value20 != 20) && 5 :>', ''],
['<:= ($value10 != 10 || $value20 != 20) || 5 :>', 5],
# no parens
['<:= $value10 == 10 && $value20 == 20 && 5 :>', 5],
['<:= $value10 == 10 && $value20 != 20 && 5 :>', ''],
['<:= $value10 == 10 && $value20 == 20 || 5 :>', 1],
['<:= $value10 == 10 && $value20 != 20 || 5 :>', 5],
['<:= $value10 != 10 && $value20 != 20 && 5 :>', ''],
['<:= $value10 != 10 && $value20 != 20 || 5 :>', 5],
['<:= $value10 == 10 || $value20 == 20 && 5 :>', 1],
['<:= $value10 == 10 || $value20 != 20 && 5 :>', 1],
['<:= $value10 == 10 || $value20 == 20 || 5 :>', 1],
['<:= $value10 == 10 || $value20 != 20 || 5 :>', 1],
['<:= $value10 != 10 || $value20 != 20 && 5 :>', ''],
['<:= $value10 != 10 || $value20 != 20 || 5 :>', 5],
['<:= $value10 == 10 and $value20 == 20 and 5 :>', 5],
['<:= $value10 == 10 and $value20 != 20 and 5 :>', ''],
['<:= $value10 == 10 and $value20 == 20 or 5 :>', 1],
['<:= $value10 == 10 and $value20 != 20 or 5 :>', 5],
['<:= $value10 != 10 and $value20 != 20 and 5 :>', ''],
['<:= $value10 != 10 and $value20 != 20 or 5 :>', 5],
['<:= $value10 == 10 or $value20 == 20 and 5 :>', 1],
['<:= $value10 == 10 or $value20 != 20 and 5 :>', 1],
['<:= $value10 == 10 or $value20 == 20 or 5 :>', 1],
['<:= $value10 == 10 or $value20 != 20 or 5 :>', 1],
['<:= $value10 != 10 or $value20 != 20 and 5 :>', ''],
['<:= $value10 != 10 or $value20 != 20 or 5 :>', 5],
['<:= $value10 == 10 or $value20 == 20 and $value10 == 10 :>', 1],
['<:= $value10 == 10 or $value20 != 20 and $value10 == 10 :>', 1],
['<:= $value10 == 10 or $value20 == 20 or $value10 == 10 :>', 1],
['<:= $value10 == 10 or $value20 != 20 or $value10 == 10 :>', 1],
['<:= $value10 != 10 or $value20 != 20 and $value10 == 10 :>', ''],
['<:= $value10 != 10 or $value20 != 20 or $value10 == 10 :>', 1],
['<:= $value10 == 10 or $value20 == 20 or $value10 != 10 :>', 1],
['<:= $value10 == 10 and $value20 == 20 and $value10 == 10 :>', 1],
['<:= $value10 == 10 and $value20 != 20 and $value10 == 10 :>', ''],
['<:= $value10 == 10 and $value20 == 20 or $value10 == 10 :>', 1],
['<:= $value10 == 10 and $value20 != 20 or $value10 == 10 :>', 1],
['<:= $value10 != 10 and $value20 != 20 and $value10 == 10 :>', ''],
['<:= $value10 != 10 and $value20 != 20 or $value10 == 10 :>', 1],
['<:= $value10 == 10 and $value20 == 20 or $value10 != 10 :>', 1],
['<: $value10 == 10 and $value10 == 10 and $value10 == 10 or $value10 != 10 :>', 1 ],
['<: $value10 == 10 and $value10 == 10 and $value10 == 10 or $value10 == 10 :>', 1 ],
['<: $value10 != 10 and $value10 == 10 and $value10 == 10 or $value10 == 10 :>', 1 ],
['<:= $value0 && 20 :>', 0 ],
['<:= $value10 && 20 :>', 20 ],
['<:= "" && 20 :>', "" ],
['<:= (nil && 20) == nil :>', 1 ], # cannot print nil (undef)
['<:= $value0 and 20 :>', 0 ],
['<:= $value10 and 20 :>', 20 ],
['<:= "" and 20 :>', "" ],
['<:= (nil and 20) == nil :>', 1 ], # cannot print nil (undef)
['<:= $value0 || 20 :>', 20 ],
['<:= $value10 || 20 :>', 10 ],
['<:= "" || 20 :>', 20 ],
['<:= nil || 20 :>', 20 ],
['<:= $value0 or 20 :>', 20 ],
['<:= $value10 or 20 :>', 10 ],
['<:= "" or 20 :>', 20 ],
['<:= nil or 20 :>', 20 ],
['<:= $value0 // 20 :>', 0 ],
['<:= $value10 // 20 :>', 10 ],
['<:= "" // 20 :>', "" ],
['<:= nil // 20 :>', 20 ],
['<:= !$value0 || 20 :>', 1 ],
['<:= !$value10 || 20 :>', 20 ],
['<:= not $value0 || 20 :>', "" ],
['<:= not $value10 || 0 :>', "" ],
['<:= $value0 == 10 ? 100 : 0 || 200 :>', ( 0 == 10 ? 100 : 0 || 200 ) ],
['<:= $value10 == 10 ? 100 : 0 || 200 :>', (10 == 10 ? 100 : 0 || 200 ) ],
['<:= $value0 == 10 ? 0 : 100 || 200 :>', ( 0 == 10 ? 0 : 100 || 200 ) ],
['<:= $value10 == 10 ? 0 : 100 || 200 :>', (10 == 10 ? 0 : 100 || 200 ) ],
['<:= $value0 == 10 ? 100 : 0 or 200 :>', ( 0 == 10 ? 100 : 0 or 200 ) ],
['<:= $value10 == 10 ? 100 : 0 or 200 :>', (10 == 10 ? 100 : 0 or 200 ) ],
['<:= $value0 == 10 ? 0 : 100 or 200 :>', ( 0 == 10 ? 0 : 100 or 200 ) ],
['<:= $value10 == 10 ? 0 : 100 or 200 :>', (10 == 10 ? 0 : 100 or 200 ) ],
['<: $value10 == 10 ? 100
: $value10 == 20 ? 200
: $value10 == 30 ? 300
: 400 :>', 100 ],
['<: $value20 == 10 ? 100
: $value20 == 20 ? 200
: $value20 == 30 ? 300
: 400 :>', 200 ],
['<: $value0 == 10 ? 100
: $value0 == 20 ? 200
: $value0 == 30 ? 300
: 400 :>', 400 ],
[': defined($value0) ? 1 : 0', 1],
[': defined($no_such_var) ? 1 : 0', 0],
[': defined $value0 ? 1 : 0', 1],
[': defined $no_such_var ? 1 : 0', 0],
[': !defined($value0) ? 1 : 0', 0],
[': !defined($no_such_var) ? 1 : 0', 1],
[': !defined $value0 ? 1 : 0', 0],
[': !defined $no_such_var ? 1 : 0', 1],
[': defined $value10 + 10', defined 10 + 10],
[': $undefined1 // $undefined2 // 10', 10],
[': $undefined1 // ( $undefined2 // 10 )', 10],
['<:= ($value10 == 10 and $value20 == 20) ? "true" : "false":>', "true"],
['<:= ($value10 == 10 and $value20 == 20 or $value10 != 10) ? "true" : "false":>', "true"],
['<:= ($value10 == 10 and $value20 == 20 or $value10 != 10) ? "true" : "false":>
<:= ($value10 != 10 and $value20 == 20 or $value10 != 10) ? "true" : "false":>', "true\n false"],
);
foreach my $pair(@data) {
my($in, $out) = @$pair;
my %vars = (
value0 => 0,
value10 => 10,
value20 => 20,
);
is $tx->render_string($in, \%vars), $out or diag $in;
if(0) {
my $value0 = $vars{value0};
my $value10 = $vars{value10};
my $value20 = $vars{value20};
$in =~ s/\A <:=? (.+) :> \z/$1/xms;
$in =~ s/\A ://xms;
$in =~ s/\b nil \b/undef/xmsg;
no strict 'vars';
is eval($in), $out or diag $@, $in;
}
}
done_testing;