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::ReadTemplatesFromFileSystem {
    {
        package t::ReadTemplatesFromFileSystem::Mustache;
        use base 'Template::Mustache';
        use File::Temp qw/ tempdir /;

        our $tmpdir;
        sub template_path { $tmpdir ||= tempdir(CLEANUP => 1); }

        sub name        { 'Joe' }
        sub occupation  { 'Plumber' }
        sub is_instance { ref(shift) ? 'yes' : 'no' }
    }

    setup {
        my $tmpdir = t::ReadTemplatesFromFileSystem::Mustache->template_path();
        mkdir "$tmpdir/t";
        mkdir "$tmpdir/t/ReadTemplatesFromFileSystem";

        $self->{tmpdir} = $tmpdir;
    }

    case ImplicitFilename {
        setup {
            my $tmp = $self->{tmpdir};

            local *FILE;
            my $filename = "$tmp/t/ReadTemplatesFromFileSystem/Mustache.mustache";
            open FILE, '+>', $filename;
            print FILE '{{name}} the {{occupation}} ({{is_instance}})';
            close FILE;
        }

        test class_render {
            my $renderer = 't::ReadTemplatesFromFileSystem::Mustache';
            assert_equal($renderer->render(), "Joe the Plumber (no)");
        }

        test instance_render {
            my $renderer = t::ReadTemplatesFromFileSystem::Mustache->new();
            assert_equal($renderer->render(), "Joe the Plumber (yes)");
        }
    }

    case ExplicitFilename {
        setup {
            my $tmp = $self->{tmpdir};

            local *FILE;
            my $filename = "$tmp/OtherTemplate.mustache";
            open FILE, '+>', $filename;
            print FILE '{{name}} -- {{occupation}} ({{is_instance}})';
            close FILE;
        }

        setup {
            no strict 'refs';
            my $m = "t::ReadTemplatesFromFileSystem::Mustache::template_file";
            *$m = sub { "OtherTemplate.mustache" };
        }

        test class_render {
            my $renderer = 't::ReadTemplatesFromFileSystem::Mustache';
            assert_equal($renderer->render(), "Joe -- Plumber (no)");
        }

        test instance_render {
            my $renderer = t::ReadTemplatesFromFileSystem::Mustache->new();
            assert_equal($renderer->render(), "Joe -- Plumber (yes)");
        }

        teardown {
            delete $t::ReadTemplatesFromFileSystem::Mustache::{template_file};
        }
    }

    case WithoutSubclass {
        setup {
            my $tmp = $self->{tmpdir};

            local *FILE;
            my $filename = "$tmp/TemplateFile.mustache";
            open FILE, '+>', $filename;
            print FILE '{{name}}, {{occupation}}';
            close FILE;
        }

        test rendering {
            local $Template::Mustache::template_path = $self->{tmpdir};
            local $Template::Mustache::template_file = 'TemplateFile.mustache';
            my $result = Template::Mustache->render({
                name       => 'Joe',
                occupation => 'Plumber',
            });
            assert_equal($result, "Joe, Plumber");
        }
    }
}