The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

BEGIN {
  unless ($ENV{AUTHOR_TESTING}) {
    require Test::More;
    Test::More::plan(skip_all => 'these tests are for testing by the author');
  }
}

use Devel::LeakGuard::Object qw(leakguard);
use File::Path qw(mkpath);
use File::Temp qw(tempdir);
use Test::Most;
use Mason::Util qw(write_file);
use Mason;

sub testleaks {
    my $code = shift;
    my $report;
    $code->();
    leakguard(
        sub { $code->() },
        only    => 'Mason*',
        on_leak => sub { $report = shift; }
    );
    if ($report) {
        my $desc = join("\n", map { sprintf("%s %d %d", $_, @{ $report->{$_} }) } keys(%$report));
        ok( 0, "leaks found:\n$desc" );
    }
    else {
        ok( 1, "no leaks found" );
    }
}

my $root = tempdir('name-XXXX', TMPDIR => 1, CLEANUP => 1);
my $comp_root = "$root/comps";
my $data_dir = "$root/data";
mkpath( [ $comp_root, $data_dir ], 0, 0775 );

testleaks(
    sub {
        my $interp = Mason->new( comp_root => $comp_root, data_dir => $data_dir );
        foreach my $comp (qw(foo bar)) {
            write_file("$comp_root/$comp.mc", "Hi");
            $interp->run("/$comp");
        }
    }
);

done_testing();