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 $tmpl = <<'T';
: given $value {
:    when "foo" {
        FOO
:    }
:    when "bar" {
        BAR
:    }
:    default {
        BAZ
:    }
: }
T

my @set = (
    [$tmpl, { value => "foo" }, <<'X', 'given-when (1)'],
        FOO
X
    [$tmpl, { value => "bar" }, <<'X', 'given-when (2)'],
        BAR
X
    [$tmpl, { value => undef }, <<'X', 'given-when (default)'],
        BAZ
X

    [<<'T', { value => undef }, <<'X', 'default can be the first'],
: given $value {
:    default {
        BAZ
:    }
:    when "foo" {
        FOO
:    }
:    when "bar" {
        BAR
:    }
: }
T
        BAZ
X

    [<<'T', { value => undef }, <<'X'],
: given $value {
:    when 0 {
        ZERO
:    }
:    default {
        BAZ
:    }
: }
T
        BAZ
X

    [<<'T', { value => undef }, <<'X', 'default only'],
: given $value {
:    default {
        BAZ
:    }
: }
T
        BAZ
X

    [<<'T', { value => 10 }, <<'X', 'logical expr (==)'],
: given $value -> $it {
:    when $it == 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 11 }, <<'X', 'logical expr (!=)'],
: given $value -> $it {
:    when $it != 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 9 }, <<'X', 'logical expr (<)'],
: given $value -> $it {
:    when $it < 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X


    [<<'T', { value => 10 }, <<'X', 'logical expr (<=)'],
: given $value -> $it {
:    when $it <= 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 11 }, <<'X', 'logical expr (>)'],
: given $value -> $it {
:    when $it > 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 10 }, <<'X', 'logical expr (>=)'],
: given $value -> $it {
:    when $it >= 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 10 }, <<'X', 'logical expr (||)'],
: given $value -> $it {
:    when $it == 9 || $it == 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 10 }, <<'X', 'logical expr (or)'],
: given $value -> $it {
:    when $it == 9 or $it == 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 10 }, <<'X', 'logical expr (&&)'],
: given $value -> $it {
:    when $it == 10 && $it >= 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 10 }, <<'X', 'logical expr (and)'],
: given $value -> $it {
:    when $it == 10 and $it >= 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 10 }, <<'X', 'logical expr (!)'],
: given $value -> $it {
:    when !($it > 10)  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 10 }, <<'X', 'logical expr (not)'],
: given $value -> $it {
:    when not $it > 10  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => 10, x => 1 }, <<'X', 'non-logical expr'],
: given $value -> $it {
:    when $x + 9  {
        FOO
:    }
:    default {
        BAZ
:    }
: }
T
        FOO
X

    [<<'T', { value => undef }, <<'X', 'nil'],
: given $value -> $it {
:    when nil {
        FOO
:    }
:    default {
        UNLIKELY
:    }
: }
T
        FOO
X

    [<<'T', { value => 0 }, <<'X', 'nil'],
: given $value -> $it {
:    when nil {
        UNLIKELY
:    }
:    default {
        FOO
:    }
: }
T
        FOO
X

    [<<'T', { value => "foo" }, <<'X', 'extra spaces'],
<: given $value { :>


    <: when "foo" { :>
        FOO
    <: } :>


    <: default { :>
        unlikely
    <: } :>


<: } :>
T

        FOO
    
X

);

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


done_testing;