The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::Mini::Unit;
use Template::Mustache;

case t::LambdasReceiveRenderHelper {
    {
        package t::LambdasReceiveRenderHelper::Mustache;
        use base 'Template::Mustache';

        sub name         { sub { pop->('{{user}}') } }
        sub obfuscated   { sub { pop->('{{'.reverse(shift).'}}') } }
        sub user         { '({{logged_in_as}})' }
        sub logged_in_as { 'Sam' }
    }

    case Interpolation {
        setup {
            $self->{tmpl} = 'I am {{name}}';
        }

        test from_hash {
            my $data = {
                name         => sub { pop->('{{user}}') },
                user         => '({{logged_in_as}})',
                logged_in_as => 'Sam',
            };

            my $rendered = Template::Mustache->render($self->{tmpl}, $data);
            assert_equal($rendered, 'I am (Sam)');
        }

        test from_class {
            my $data = 't::LambdasReceiveRenderHelper::Mustache';

            my $rendered = Template::Mustache->render($self->{tmpl}, $data);
            assert_equal($rendered, 'I am (Sam)');
        }

        test from_instance {
            my $data = t::LambdasReceiveRenderHelper::Mustache->new();

            my $rendered = Template::Mustache->render($self->{tmpl}, $data);
            assert_equal($rendered, 'I am (Sam)');
        }
    }

    case SectionTags {
        setup {
            $self->{tmpl} = 'I am {{#obfuscated}}resu{{/obfuscated}}';
        }

        test from_hash {
            my $data = {
                obfuscated   => sub { pop->('{{'.reverse(shift).'}}') },
                user         => '({{logged_in_as}})',
                logged_in_as => 'Sam',
            };

            my $rendered = Template::Mustache->render($self->{tmpl}, $data);
            assert_equal($rendered, 'I am (Sam)');
        }

        test from_class {
            my $data = 't::LambdasReceiveRenderHelper::Mustache';

            my $rendered = Template::Mustache->render($self->{tmpl}, $data);
            assert_equal($rendered, 'I am (Sam)');
        }

        test from_instance {
            my $data = t::LambdasReceiveRenderHelper::Mustache->new();

            my $rendered = Template::Mustache->render($self->{tmpl}, $data);
            assert_equal($rendered, 'I am (Sam)');
        }
    }
}