The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 20;
use_ok 'Rex::Template';
use_ok 'Rex::Config';

my $t = Rex::Template->new;

my $content = 'one two three';

is( $t->parse( $content, {} ), "one two three", "just text" );

$content = 'Hello this is <%= $::name %>';
is(
  $t->parse( $content, { name => "foo" } ),
  "Hello this is foo",
  "simple variable"
);

$content = '<% if($::logged_in) { %>
Logged in!
<% } else { %>
Logged out!
<% } %>';

my $content_ok = "
Logged in!
";

is( $t->parse( $content, { logged_in => 1 } ), $content_ok, "if condition" );

$content = 'Hello this is <%= $::name %>';
is(
  Rex::Config->get_template_function()->( $content, { name => "baz" } ),
  "Hello this is baz",
  "get template function"
);

is(
  $t->parse( $content, name => "bar" ),
  "Hello this is bar",
  "simple variable without hashRef"
);

$Rex::Template::BE_LOCAL = 1;
$Rex::Template::BE_LOCAL = 1;

$content = 'Hello this is <%= $foo %>';
is( $t->parse( $content, { foo => "baz" } ), "Hello this is baz",
  "local vars" );

$content = '<%= join(",", @{ $arr }) %>';
is( $t->parse( $content, { arr => [qw/one two three/] } ),
  "one,two,three", "local var with array" );

#
# old variable style
#

$content = 'one two three';

is( $t->parse( $content, {} ), "one two three", "just text" );

$content = 'Hello this is <%= $::name %>';
is(
  $t->parse( $content, { name => "foo" } ),
  "Hello this is foo",
  "simple variable"
);

$content = '<% if($::logged_in) { %>
Logged in!
<% } else { %>
Logged out!
<% } %>';

$content_ok = "
Logged in!
";

is( $t->parse( $content, { logged_in => 1 } ), $content_ok, "if condition" );

$content = 'Hello this is <%= $::name %>';
is(
  Rex::Config->get_template_function()->( $content, { name => "baz" } ),
  "Hello this is baz",
  "get template function"
);

is(
  $t->parse( $content, name => "bar" ),
  "Hello this is bar",
  "simple variable without hashRef"
);

$content = 'Hello this is <%= $::foo %> <%= $::veth1_0_ip %>';
is(
  $t->parse( $content, { foo => "baz", "veth1.0_ip" => "10.1.2.3" } ),
  "Hello this is baz 10.1.2.3",
  "template with invalid key name"
);

my $v = {
  "foo"      => { val => "val1", name => "foo" },
  "foo_bar"  => { val => "val2", name => "foo_bar" },
  "k-ey"     => { val => "val3", name => "k_ey" },
  "veth0.1"  => { val => "val4", name => "veth0_1" },
  "2nd\\key" => { val => "val5", name => "2nd_key" },
};

for my $key ( keys %{$v} ) {
  my $var_name = Rex::Template::_normalize_var_name($key);
  is(
    $var_name,
    $v->{$key}->{name},
    "$var_name is equal to " . $v->{$key}->{name}
  );
}