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

use strict;
use Text::MicroMason;

use Test::More tests => 46;
use File::Copy;
use Carp;
$SIG{__DIE__} = \&Carp::confess;

######################################################################

{
    ok my $m = Text::MicroMason->new();

    use vars qw( $count_sub $sub_count $local_count );
    $sub_count = 0;
    $local_count = 0;
    my $count_scr = q{<%once> ++ $::sub_count; my $count; </%once><%perl> ++ $::local_count; </%perl><% ++ $count; %>};
    for ( 1 .. 3 ) { 
        $count_sub = $m->compile( text => $count_scr );
        for ( 1 .. 3 ) { 
            $count_sub->($_);
        }
    }

    is $sub_count, 3;
    is $local_count, 9;
    is $count_sub->(), 4;
}

######################################################################

{
    ok my $m = Text::MicroMason->new( -CompileCache );

    use vars qw( $count_sub $sub_count $local_count );
    $sub_count = 0;
    $local_count = 0;
    my $count_scr = q{<%once> ++ $::sub_count; my $count; </%once><%perl> ++ $::local_count; </%perl><% ++ $count; %>};
    for ( 1 .. 3 ) { 
        $count_sub = $m->compile( text => $count_scr );
        for ( 1 .. 3 ) { 
            $count_sub->($_);
        }
    }

    is $sub_count, 1;
    is $local_count, 9;
    is $count_sub->(), 10;
}

######################################################################

{
    ok my $m = Text::MicroMason->new( -CompileCache, -ExecuteCache );

    use vars qw( $count_sub $sub_count $local_count );
    $sub_count = 0;
    $local_count = 0;
    my $count_scr = q{<%once> ++ $::sub_count; my $count; </%once><%perl> ++ $::local_count; </%perl><% ++ $count; %>};
    for ( 1 .. 3 ) { 
        $count_sub = $m->compile( text => $count_scr );
        for ( 1 .. 3 ) { 
            $count_sub->($_);
        }
    }

    is $sub_count, 1;
    is $local_count, 3;
    is $count_sub->(), 4;
}

######################################################################

{
    ok my $m = Text::MicroMason->new( -ExecuteCache, -CompileCache );

    use vars qw( $count_sub $sub_count $local_count );
    $sub_count = 0;
    $local_count = 0;
    my $count_scr = q{<%once> ++ $::sub_count; my $count; </%once><%perl> ++ $::local_count; </%perl><% ++ $count; %>};
    for ( 1 .. 3 ) { 
        $count_sub = $m->compile( text => $count_scr );
        for ( 1 .. 3 ) { 
            $count_sub->($_);
        }
    }

    is $sub_count, 1;
    is $local_count, 3;
    is $count_sub->(), 4;
}

######################################################################

# Test using $m->execute directly: This should compile and run it
# properly.  Running execute 10 times is like running compile once,
# then calling the resulting sub 10 times.

{
    ok my $m = Text::MicroMason->new( -CompileCache );

    use vars qw( $count_sub $sub_count $local_count );
    $sub_count = 0;
    $local_count = 0;
    my $count_scr = q{<%once> ++ $::sub_count; my $count; </%once><%perl> ++ $::local_count; </%perl><% ++ $count; %>};
    for ( 1 .. 10 ) {
        $m->execute( text => $count_scr );
    }

    is $sub_count, 1;
    is $local_count, 10;
}

######################################################################

# Test using $m->execute directly, on a file.

{
    ok my $m = Text::MicroMason->new( -CompileCache );

    use vars qw( $count_sub $sub_count $local_count );
    $sub_count = 0;
    $local_count = 0;

    for ( 1 .. 10 ) {
        ok $m->execute( file => "samples/t-counter.msn" );
    }

    is $sub_count, 1;
    is $local_count, 10;
}


######################################################################

# Testss submitted via rt.cpan.org by Jon Warbrick on #21802

copy('samples/t-counter.msn','samples/t34a.msn');

######################################################################

# Test cache expiration using $m->execute directly on a file

{
    ok my $m = Text::MicroMason->new( -CompileCache );

    use vars qw( $count_sub $sub_count $local_count );
    $sub_count = 0;
    $local_count = 0;

    my $time = time-5;
    utime $time, $time, "samples/t34a.msn";
    for ( 1 .. 2 ) {
        ok $m->execute( file => "samples/t34a.msn" );
    }
    $time = time;
    utime $time, $time, "samples/t34a.msn";
    sleep 2; # to defeat not checking more than once per second
    for ( 1 .. 2 ) {
        ok $m->execute( file => "samples/t34a.msn" );
    }

    is $sub_count, 2;
    is $local_count, 4;
}

######################################################################

# Test cache expiration using $m->execute directly on a file, using -TemplateDir

{
    ok my $m = Text::MicroMason->new( -CompileCache, 
                                      -TemplateDir, template_root => 'samples'  );

    use vars qw( $count_sub $sub_count $local_count );
    $sub_count = 0;
    $local_count = 0;

    my $time = time-5;
    utime $time, $time, "samples/t34a.msn";
    for ( 1 .. 2 ) {
        ok $m->execute( file => "t34a.msn" );
    }
    $time = time;
    utime $time, $time, "samples/t34a.msn";
    sleep 2; # to defeat not checking more than once per second; sleep 1 triggered false cpants fail
    for ( 1 .. 2 ) {
        ok $m->execute( file => "t34a.msn" );
    }

    is $sub_count, 2;
    is $local_count, 4;
}

######################################################################

unlink('samples/t34a.msn');