The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More 'no_plan';

use Path::Class;

use ok 'Template::Multipass';

use File::Temp qw/tempdir/;

my $d = tempdir(CLEANUP => 1);

my $t = Template::Multipass->new(
    INCLUDE_PATH => [ file(__FILE__)->parent->subdir("templates")->stringify ],
    COMPILE_DIR  => "$d",
    MULTIPASS    => my $config = {
        VARS => {
            header => "[",
            footer => "]",
            array  => [
                { name => "foo", value => "ding" },
                { name => "bork", value => "moose" },
                { name => "angry", value => "steering wheel" },
                { name => "banana", value => "tasty" },
                { name => "giraffe", value => "diagonal" },
            ],
        },
    },
);

{
my $out;
ok( $t->process( "bar.tt", { blah => "42," }, \$out ) );

is( $out, <<'END', "simple meta template" );
[
42,
{foo: "ding",bork: "moose",angry: "steering wheel",banana: "tasty",giraffe: "diagonal"}
]
END

}

{
my $out;
ok( $t->process( "bar_meta.tt", { blah => "42," }, \$out ) );

is( $out, <<'END', "more meta template" );
[
42,
{foo: "ding",bork: "moose",angry: "steering wheel",banana: "tasty",giraffe: "diagonal"}
]
END

}

{
my $out;
ok( $t->process( "bar_meta.tt", { blah => "45," }, \$out ) );

is( $out, <<'END', "non meta vars don't get cached" );
[
45,
{foo: "ding",bork: "moose",angry: "steering wheel",banana: "tasty",giraffe: "diagonal"}
]
END

}

{
my $out;

ok( $t->process( "bar_meta.tt", { blah => "45," }, \$out, { meta_vars => { array => [ { name => "oink", value => "bah" } ] } } ) );

is( $out, <<'END', "deep meta vars get cached when using flat" );
[
45,
{foo: "ding",bork: "moose",angry: "steering wheel",banana: "tasty",giraffe: "diagonal"}
]
END

}

{
my $out;

ok( $t->process( "bar_meta.tt", { blah => "45," }, \$out, meta_vars => { header => '[[', footer => ']]', array => [ { name => "oink", value => "bah" } ] } ) );

is( $out, <<'END', "deep meta vars get cached when using flat" );
[[
45,
{oink: "bah"}
]]
END

}

{
my $out;

local $config->{MANGLE_HASH_VARS} = 1;

ok( $t->process( "bar_meta.tt", { blah => "45," }, \$out ) );

is( $out, <<'END', "re run of template" );
[
45,
{foo: "ding",bork: "moose",angry: "steering wheel",banana: "tasty",giraffe: "diagonal"}
]
END

}

{
my $out;

local $config->{MANGLE_HASH_VARS} = 1;

ok( $t->process( "bar_meta.tt", { blah => "45," }, \$out, meta_vars => { array => [ { name => "oink", value => "bah" } ] } ) );

is( $out, <<'END', "deep meta vars don't get cached when using hash" );
[
45,
{oink: "bah"}
]
END
}

{
my $out;

local $config->{MANGLE_HASH_VARS} = 1;

ok( $t->process( "bar_meta.tt", { blah => "45," }, \$out ) );

is( $out, <<'END', "re run of template" );
[
45,
{foo: "ding",bork: "moose",angry: "steering wheel",banana: "tasty",giraffe: "diagonal"}
]
END

}

SKIP: {
    skip "Test::Benchmark required", 1 unless eval { require Test::Benchmark };
    Test::Benchmark->import;

    my $out;
    is_faster(
        -1,
        sub { $t->process( "bar_meta.tt", { blah => "42," }, \$out ) },
        sub { $t->process( "bar.tt", { blah => "42," }, \$out ) },
        "meta vars + caching is faster",
    );
}