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

# t/003_vmethods.t - tests using the virtual methods

use Test::More tests => 7;

my $testData = q/[%
     a = {
             foo => 1,
             bar => [ 'a', 'b', 'e' ],
             baz => {
                        bob => 'alice',
                    },
         };
     b = {
             foo => 2,
             bar => [ 'c', 'd' ],
             baz => {
                        ted => 'margeret',
                    },
         };
%]/;

is tt( $testData, q{[% c = a.merge( b ); c.keys.sort.join(",") %]} ), "bar,baz,foo", "merge 1/7";
is tt( $testData, q{[% c = a.merge( b ); c.foo %]} ), "1", "merge 2/7";
is tt( $testData, q{[% c = a.merge( b ); c.bar.join(",") %]} ), "a,b,e,c,d", "merge 3/7";
is tt( $testData, q{[% c = a.merge( b ); c.baz.keys.sort.join(",") %]} ), "bob,ted", "merge 4/7";
is tt( $testData, q{[% c = a.merge( b ); c.baz.bob %]} ), "alice", "merge 5/7";
is tt( $testData, q{[% c = a.merge( b ); c.baz.ted %]} ), "margeret", "merge 6/7";

is tt( $testData, q{[% waste = HashMerge.set_behavior('RIGHT_PRECEDENT'); c = a.merge( b ); c.foo %]} ), "2", "merge 7/7";

sub tt
{
    my $template = join( '', q/[% USE HashMerge; USE HashMergeVMethods %]/, @_ );
    use Template;
    my $tt = Template->new();
    my $output;
    $tt->process( \$template, {}, \$output ) or
      die "Problem while processing '$template': " . $tt->error();
    return $output;
}