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 Test;

BEGIN { 
  eval "require Text::Balanced; 1" or do {
    plan( tests => 1 );
    print "Skipping test (Text::Template emulator requires Text::Balanced).\n";
    skip( 1, 1 );
    exit 0;
  }
}

BEGIN { plan tests => 10 }

my $loaded;
END { ok(0) unless $loaded; }

use Text::MicroMason;

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

ok( $loaded = 1 );

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

my $scr_hello = <<'ENDSCRIPT';
Dear {$recipient},
Pay me at once.
      Love, 
	G.V.
ENDSCRIPT

my $res_hello = <<'ENDSCRIPT';
Dear King,
Pay me at once.
      Love, 
	G.V.
ENDSCRIPT

ok( $m->execute( text => $scr_hello, recipient => 'King' ), $res_hello );

ok( $m->compile( text => $scr_hello)->( recipient => 'King' ), $res_hello );

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

{ no strict;

$source = 'We will put value of $v (which is "good") here -> {$v}';
$v = 'oops (main)';
$Q::v = 'oops (Q)';
$vars = { 'v' => \'good' };

# (1) Build template from string
$template = $m->compile( 'text' => $source );
ok( ref $template );

# (2) Fill in template in anonymous package
$result2 = 'We will put value of $v (which is "good") here -> good';
$text = $template->(%$vars);
ok($text, $result2);

# (3) Did we clobber the main variable?
ok($v, 'oops (main)');

# (4) Fill in same template again
$result4 = 'We will put value of $v (which is "good") here -> good';
$text = $template->(%$vars);
ok($text, $result4);

# (5) Now with a package
$result5 = 'We will put value of $v (which is "good") here -> good';
$template = $m->new(package => 'Q')->compile( 'text' => $source );
$text = $template->(%$vars);
ok($text, $result5);

# (6) We expect to have clobbered the Q variable.
ok($Q::v, 'good');

# (7) Now let's try it without a package
$result7 = 'We will put value of $v (which is "good") here -> good';
$template = $m->new()->compile( 'text' => $source );
$text = $template->(%$vars);
ok($text, $result7);
}

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