-process_ok("[% SET name = 'two' %][% SET \$name = 3 %][% two %]" => 3);
-process_ok("[% SET name = 'two' %][% SET \${name} = 3 %][% two %]" => 3);
-process_ok("[% SET name = 2 %][% SET foo.\$name = 3 %][% foo.2 %]" => 3);
-process_ok("[% SET name = 2 %][% SET foo.\$name = 3 %][% foo.\$name %]" => 3);
-process_ok("[% SET name = 2 %][% SET foo.\${name} = 3 %][% foo.2 %]" => 3);
-process_ok("[% SET name = 2 %][% SET foo.\${name} = 3 %][% foo.2 %]" => 3);
-process_ok("[% SET name = 'two' %][% SET \$name.foo = 3 %][% two.foo %]" => 3);
-process_ok("[% SET name = 'two' %][% SET \${name}.foo = 3 %][% two.foo %]" => 3);
-process_ok("[% SET name = 'two' %][% SET foo.\$name.foo = 3 %][% foo.two.foo %]" => 3);
-process_ok("[% SET name = 'two' %][% SET foo.\${name}.foo = 3 %][% foo.two.foo %]" => 3);
-
-process_ok("[% SET foo = [1..10] %][% foo.6 %]" => 7);
-process_ok("[% SET foo = [10..1] %][% foo.6 %]" => '');
-process_ok("[% SET foo = [-10..-1] %][% foo.6 %]" => -4);
-process_ok("[% SET foo = [1..10, 21..30] %][% foo.12 %]" => 23) if ! $is_tt;
-process_ok("[% SET foo = [..100] bar = 7 %][% bar %][% foo.0 %]" => '');
-process_ok("[% SET foo = [100..] bar = 7 %][% bar %][% foo.0 %]" => 7) if ! $is_tt;
-process_ok("[% SET foo = ['a'..'z'] %][% foo.6 %]" => 'g');
-process_ok("[% SET foo = ['z'..'a'] %][% foo.6 %]" => '');
-process_ok("[% SET foo = ['a'..'z'].reverse %][% foo.6 %]" => 't') if ! $is_tt;
-
-process_ok("[% foo = 1 %][% foo %]" => '1');
-process_ok("[% foo = 1 bar = 2 %][% foo %][% bar %]" => '12');
-process_ok("[% foo = 1 ; bar = 2 %][% foo %][% bar %]" => '12');
-process_ok("[% foo.bar = 2 %][% foo.bar %]" => '2');
-
-process_ok('[% a = "a" %][% (b = a) %][% a %][% b %]' => 'aaa');
-process_ok('[% a = "a" %][% (c = (b = a)) %][% a %][% b %][% c %]' => 'aaaa');
-
-###----------------------------------------------------------------###
-### Reserved words
-
-my $vars = {
- GET => 'named_get',
- get => 'lower_named_get',
- named_get => 'value of named_get',
- hold_get => 'GET',
-};
-process_ok("[% GET %]" => '', $vars);
-process_ok("[% GET GET %]" => 'named_get', $vars) if ! $is_tt;
-process_ok("[% GET get %]" => 'lower_named_get', $vars);
-process_ok("[% GET \${'GET'} %]" => 'bar', {GET => 'bar'});
-
-process_ok("[% GET = 1 %][% GET GET %]" => '', $vars);
-process_ok("[% SET GET = 1 %][% GET GET %]" => '1', $vars) if ! $is_tt;
-
-process_ok("[% GET \$hold_get %]" => 'named_get', $vars);
-process_ok("[% GET \$GET %]" => 'value of named_get', $vars) if ! $is_tt;
-process_ok("[% BLOCK GET %]hi[% END %][% PROCESS GET %]" => 'hi') if ! $is_tt;
-process_ok("[% BLOCK foo %]hi[% END %][% PROCESS foo a = GET %]" => 'hi', $vars) if ! $is_tt;
-process_ok("[% BLOCK foo %]hi[% END %][% PROCESS foo GET = 1 %]" => '');
-process_ok("[% BLOCK foo %]hi[% END %][% PROCESS foo IF GET %]" => 'hi', $vars) if ! $is_tt;
-
-###----------------------------------------------------------------###
-### CALL and DEFAULT
-
-process_ok("[% DEFAULT foo = 7 %][% foo %]" => 7);
-process_ok("[% SET foo = 5 %][% DEFAULT foo = 7 %][% foo %]" => 5);
-process_ok("[% DEFAULT foo.bar.baz.bing = 6 %][% foo.bar.baz.bing %]" => 6);
-
-my $t = 0;
-process_ok("[% foo %]" => 'hi', {foo => sub {$t++; 'hi'}});
-process_ok("[% GET foo %]" => 'hi', {foo => sub {$t++; 'hi'}});
-process_ok("[% CALL foo %]" => '', {foo => sub {$t++; 'hi'}});
-ok($t == 3, "CALL method actually called var");
-
-###----------------------------------------------------------------###
-### virtual methods / filters
-
-process_ok("[% [0 .. 10].reverse.1 %]" => 9) if ! $is_tt;
-process_ok("[% {a => 'A'}.a %]" => 'A') if ! $is_tt;
-process_ok("[% 'This is a string'.length %]" => 16) if ! $is_tt;
-process_ok("[% 123.length %]" => 3) if ! $is_tt;
-process_ok("[% 123.2.length %]" => 5) if ! $is_tt;
-process_ok("[% -123.2.length %]" => -5) if ! $is_tt; # the - doesn't bind as tight as the dot methods
-process_ok("[% (-123.2).length %]" => 6) if ! $is_tt;
-
-process_ok("[% n.repeat %]" => '1', {n => 1}) if ! $is_tt; # tt2 virtual method defaults to 0
-process_ok("[% n.repeat(0) %]" => '', {n => 1});
-process_ok("[% n.repeat(1) %]" => '1', {n => 1});
-process_ok("[% n.repeat(2) %]" => '11', {n => 1});
-process_ok("[% n.repeat(2,'|') %]" => '1|1', {n => 1}) if ! $is_tt;
-
-process_ok("[% n.size %]", => 'SIZE', {n => {size => 'SIZE', a => 'A'}});
-process_ok("[% n|size %]", => '2', {n => {size => 'SIZE', a => 'A'}}) if ! $is_tt; # tt2 | is alias for FILTER
-
-process_ok('[% foo | eval %]' => 'baz', {foo => '[% bar %]', bar => 'baz'});
-process_ok('[% "1" | indent(2) %]' => ' 1');
-
-process_ok("[% n.replace('foo', 'bar') %]" => 'barbar', {n => 'foofoo'});
-process_ok("[% n.replace('(foo)', 'bar\$1') %]" => 'barfoobarfoo', {n => 'foofoo'}) if ! $is_tt;
-process_ok("[% n.replace('foo', 'bar', 0) %]" => 'barfoo', {n => 'foofoo'}) if ! $is_tt;
-
-process_ok("[% n FILTER size %]", => '1', {n => {size => 'SIZE', a => 'A'}}) if ! $is_tt; # tt2 doesn't have size
-
-process_ok("[% n FILTER repeat %]" => '1', {n => 1});
-process_ok("[% n FILTER repeat(0) %]" => '', {n => 1});
-process_ok("[% n FILTER repeat(1) %]" => '1', {n => 1});
-process_ok("[% n FILTER repeat(2) %]" => '11', {n => 1});
-process_ok("[% n FILTER repeat(2,'|') %]" => '1|1', {n => 1}) if ! $is_tt;
-
-process_ok("[% n FILTER echo = repeat(2) %][% n FILTER echo %]" => '1111', {n => 1});
-process_ok("[% n FILTER echo = repeat(2) %][% n | echo %]" => '1111', {n => 1});
-process_ok("[% n FILTER echo = repeat(2) %][% n|echo.length %]" => '112', {n => 1}) if ! $is_tt;
-process_ok("[% n FILTER echo = repeat(2) %][% n FILTER \$foo %]" => '1111', {n => 1, foo => 'echo'});
-process_ok("[% n FILTER echo = repeat(2) %][% n | \$foo %]" => '1111', {n => 1, foo => 'echo'});
-process_ok("[% n FILTER echo = repeat(2) %][% n|\$foo.length %]" => '112', {n => 1, foo => 'echo'}) if ! $is_tt;
-
-process_ok('[% "hi" FILTER $foo %]' => 'hihi', {foo => sub {sub {$_[0]x2}}}); # filter via a passed var
-process_ok('[% FILTER $foo %]hi[% END %]' => 'hihi', {foo => sub {sub {$_[0]x2}}}); # filter via a passed var
-process_ok('[% "hi" FILTER foo %]' => 'hihi', {tt_config => [FILTERS => {foo => sub {$_[0]x2}}]});
-process_ok('[% "hi" FILTER foo %]' => 'hihi', {tt_config => [FILTERS => {foo => [sub {$_[0]x2},0]}]});
-process_ok('[% "hi" FILTER foo(2) %]' => 'hihi', {tt_config => [FILTERS => {foo => [sub {my$a=$_[1];sub{$_[0]x$a}},1]}]});
-
-### this does work - but requires that Template::Filters is installed
-#process_ok("[% ' ' | uri %]" => '%20');
-
-###----------------------------------------------------------------###
-### chomping
-
-process_ok(" [% foo %]" => ' ');
-process_ok(" [%- foo %]" => '');
-process_ok("\n[%- foo %]" => '');
-process_ok("\n [%- foo %]" => '');
-process_ok("\n\n[%- foo %]" => "\n");
-process_ok(" \n\n[%- foo %]" => " \n");
-process_ok(" \n[%- foo %]" => " ") if ! $is_tt;
-process_ok(" \n \n[%- foo %]" => " \n ") if ! $is_tt;
-
-process_ok("[% foo %] " => ' ');
-process_ok("[% foo -%] " => ' ');
-process_ok("[% foo -%]\n" => '');
-process_ok("[% foo -%] \n" => '');
-process_ok("[% foo -%]\n " => ' ');
-process_ok("[% foo -%]\n\n\n" => "\n\n");
-process_ok("[% foo -%] \n " => ' ');
-
-###----------------------------------------------------------------###
-### math operations
-
-process_ok("[% 1 + 2 %]" => 3);
-process_ok("[% 1 + 2 + 3 %]" => 6);
-process_ok("[% (1 + 2) %]" => 3);
-process_ok("[% 2 - 1 %]" => 1);
-process_ok("[% -1 + 2 %]" => 1);
-process_ok("[% -1+2 %]" => 1);
-process_ok("[% 2 - 1 %]" => 1);
-process_ok("[% 2-1 %]" => 1) if ! $is_tt;
-process_ok("[% 2 - -1 %]" => 3);
-process_ok("[% 4 * 2 %]" => 8);
-process_ok("[% 4 / 2 %]" => 2);
-process_ok("[% 10 / 3 %]" => qr/^3.333/);
-process_ok("[% 10 div 3 %]" => '3');
-process_ok("[% 2 ** 3 %]" => 8) if ! $is_tt;
-process_ok("[% 1 + 2 * 3 %]" => 7);
-process_ok("[% 3 * 2 + 1 %]" => 7);
-process_ok("[% (1 + 2) * 3 %]" => 9);
-process_ok("[% 3 * (1 + 2) %]" => 9);
-process_ok("[% 1 + 2 ** 3 %]" => 9) if ! $is_tt;
-process_ok("[% 2 * 2 ** 3 %]" => 16) if ! $is_tt;
-process_ok("[% SET foo = 1 %][% foo + 2 %]" => 3);
-process_ok("[% SET foo = 1 %][% (foo + 2) %]" => 3);
-
-###----------------------------------------------------------------###
-### boolean operations
-
-process_ok("[% 5 && 6 %]" => 6);
-process_ok("[% 5 || 6 %]" => 5);
-process_ok("[% 0 || 6 %]" => 6);
-process_ok("[% 0 && 6 %]" => 0);
-process_ok("[% 0 && 0 %]" => 0);
-process_ok("[% 5 && 6 && 7%]" => 7);
-process_ok("[% 0 || 1 || 2 %]" => 1);
-
-process_ok("[% 5 + (0 || 5) %]" => 10);
-
-
-process_ok("[% 1 ? 2 : 3 %]" => '2');
-process_ok("[% 0 ? 2 : 3 %]" => '3');
-process_ok("[% 0 ? (1 ? 2 : 3) : 4 %]" => '4');
-process_ok("[% 0 ? 1 ? 2 : 3 : 4 %]" => '4');
-
-process_ok("[% t = 1 || 0 ? 3 : 4 %][% t %]" => 3);
-process_ok("[% t = 0 or 1 ? 3 : 4 %][% t %]" => 3);
-process_ok("[% t = 1 or 0 ? 3 : 4 %][% t %]" => 1) if ! $is_tt;
-
-process_ok("[% 0 ? 2 : 3 %]" => '3');
-process_ok("[% 1 ? 2 : 3 %]" => '2');
-process_ok("[% 0 ? 1 ? 2 : 3 : 4 %]" => '4');
-process_ok("[% t = 0 ? 1 ? [1..4] : [2..4] : [3..4] %][% t.0 %]" => '3');
-process_ok("[% t = 1 || 0 ? 0 : 1 || 2 ? 2 : 3 %][% t %]" => '0');
-process_ok("[% t = 0 or 0 ? 0 : 1 or 2 ? 2 : 3 %][% t %]" => '1') if ! $is_tt;
-process_ok("[% t = 0 or 0 ? 0 : 0 or 2 ? 2 : 3 %][% t %]" => '2');
-
-process_ok("[% 0 ? 1 ? 1 + 2 * 3 : 1 + 2 * 4 : 1 + 2 * 5 %]" => '11');
-
-###----------------------------------------------------------------###
-### blocks
-
-process_ok("[% PROCESS foo %]" => '');
-process_ok("[% BLOCK foo %]" => '');
-process_ok("[% BLOCK foo %][% END %]" => '');
-process_ok("[% BLOCK %][% END %]one" => 'one');
-process_ok("[% BLOCK foo %]hi there[% END %]" => '');
-process_ok("[% BLOCK foo %][% BLOCK foo %][% END %][% END %]" => '');
-process_ok("[% BLOCK foo %]hi there[% END %][% PROCESS foo %]" => 'hi there');
-process_ok("[% PROCESS foo %][% BLOCK foo %]hi there[% END %]" => 'hi there');
-process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% PROCESS foo %]" => 'hi ONE there', {one => 'ONE'});
-process_ok("[% BLOCK foo %]hi [% IF 1 %]Yes[% END %] there[% END %]<<[% PROCESS foo %]>>" => '<<hi Yes there>>');
-process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% PROCESS foo one = 'two' %]" => 'hi two there');
-process_ok("[% BLOCK foo %]hi [% one.two %] there[% END %][% PROCESS foo one.two = 'two' %]" => 'hi two there');
-process_ok("[% BLOCK foo %]hi [% one.two %] there[% END %][% PROCESS foo + foo one.two = 'two' %]" => 'hi two there'x2);
-
-process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% PROCESS foo one = 'two' %][% one %]" => 'hi two theretwo');
-process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% INCLUDE foo one = 'two' %][% one %]" => 'hi two there');
-
-###----------------------------------------------------------------###
-### if/unless/elsif/else
-
-process_ok("[% IF 1 %]Yes[% END %]" => 'Yes');
-process_ok("[% IF 0 %]Yes[% END %]" => '');
-process_ok("[% IF 0 %]Yes[% ELSE %]No[% END %]" => 'No');
-process_ok("[% IF 0 %]Yes[% ELSIF 1 %]No[% END %]" => 'No');
-process_ok("[% IF 0 %]Yes[% ELSIF 0 %]No[% END %]" => '');
-process_ok("[% IF 0 %]Yes[% ELSIF 0 %]No[% ELSE %]hmm[% END %]" => 'hmm');
-
-process_ok("[% UNLESS 1 %]Yes[% END %]" => '');
-process_ok("[% UNLESS 0 %]Yes[% END %]" => 'Yes');
-process_ok("[% UNLESS 0 %]Yes[% ELSE %]No[% END %]" => 'Yes');
-process_ok("[% UNLESS 1 %]Yes[% ELSIF 1 %]No[% END %]" => 'No');
-process_ok("[% UNLESS 1 %]Yes[% ELSIF 0 %]No[% END %]" => '');
-process_ok("[% UNLESS 1 %]Yes[% ELSIF 0 %]No[% ELSE %]hmm[% END %]" => 'hmm');
-
-###----------------------------------------------------------------###
-### comments
-
-process_ok("[%# one %]" => '', {one => 'ONE'});
-process_ok("[%#\n one %]" => '', {one => 'ONE'});
-process_ok("[%-#\n one %]" => '', {one => 'ONE'}) if ! $is_tt;
-process_ok("[% #\n one %]" => 'ONE', {one => 'ONE'});
-process_ok("[%# BLOCK one %]" => '');
-process_ok("[%# BLOCK one %]two" => 'two');
-process_ok("[%# BLOCK one %]two[% END %]" => '');
-process_ok("[%# BLOCK one %]two[% END %]three" => '');
-
-###----------------------------------------------------------------###
-### foreach, next, last
-
-process_ok("[% FOREACH foo %]" => '');
-process_ok("[% FOREACH foo %][% END %]" => '');
-process_ok("[% FOREACH foo %]bar[% END %]" => '');
-process_ok("[% FOREACH foo %]bar[% END %]" => 'bar', {foo => 1});
-process_ok("[% FOREACH f IN foo %]bar[% f %][% END %]" => 'bar1bar2', {foo => [1,2]});
-process_ok("[% FOREACH f = foo %]bar[% f %][% END %]" => 'bar1bar2', {foo => [1,2]});
-process_ok("[% FOREACH f = [1,2] %]bar[% f %][% END %]" => 'bar1bar2');
-process_ok("[% FOREACH f = [1..3] %]bar[% f %][% END %]" => 'bar1bar2bar3');
-process_ok("[% FOREACH f = [{a=>'A'},{a=>'B'}] %]bar[% f.a %][% END %]" => 'barAbarB');
-process_ok("[% FOREACH [{a=>'A'},{a=>'B'}] %]bar[% a %][% END %]" => 'barAbarB');
-process_ok("[% FOREACH [{a=>'A'},{a=>'B'}] %]bar[% a %][% END %][% a %]" => 'barAbarB');
-process_ok("[% FOREACH f = [1..3] %][% loop.count %]/[% loop.size %] [% END %]" => '1/3 2/3 3/3 ');
-process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% f %][% END %][% END %]" => '1');
-process_ok("[% FOREACH f = [1..3] %][% IF loop.last %][% f %][% END %][% END %]" => '3');
-process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% NEXT %][% END %][% f %][% END %]" => '23');
-process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% LAST %][% END %][% f %][% END %]" => '');
-process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% NEXT %][% END %][% END %]" => '123');
-process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% LAST %][% END %][% END %]" => '1');
-
-### TT is not consistent in what is localized - well it is documented
-### if you set a variable in the FOREACH tag, then nothing in the loop gets localized
-### if you don't set a variable - everything gets localized
-process_ok("[% foo = 1 %][% FOREACH [1..10] %][% foo %][% foo = 2 %][% END %]" => '1222222222');
-process_ok("[% f = 1 %][% FOREACH i = [1..10] %][% i %][% f = 2 %][% END %][% f %]" => '123456789102');
-process_ok("[% f = 1 %][% FOREACH [1..10] %][% f = 2 %][% END %][% f %]" => '1');
-process_ok("[% f = 1 %][% FOREACH f = [1..10] %][% f %][% END %][% f %]" => '1234567891010');
-process_ok("[% FOREACH [1] %][% SET a = 1 %][% END %][% a %]" => '');
-process_ok("[% a %][% FOREACH [1] %][% SET a = 1 %][% END %][% a %]" => '');
-process_ok("[% a = 2 %][% FOREACH [1] %][% SET a = 1 %][% END %][% a %]" => '2');
-process_ok("[% a = 2 %][% FOREACH [1] %][% a = 1 %][% END %][% a %]" => '2');
-process_ok("[% a = 2 %][% FOREACH i = [1] %][% a = 1 %][% END %][% a %]" => '1');
-process_ok("[% FOREACH i = [1] %][% SET a = 1 %][% END %][% a %]" => '1');
-process_ok("[% f.b = 1 %][% FOREACH f.b = [1..10] %][% f.b %][% END %][% f.b %]" => '1234567891010') if ! $is_tt;
-process_ok("[% a = 1 %][% FOREACH [{a=>'A'},{a=>'B'}] %]bar[% a %][% END %][% a %]" => 'barAbarB1');
-process_ok("[% FOREACH [1..3] %][% loop.size %][% END %][% loop.size %]" => '333');
-process_ok("[% FOREACH i = [1..3] %][% loop.size %][% END %][% loop.size %]" => '333') if ! $is_tt;
-process_ok("[% FOREACH i = [1..3] %][% loop.size %][% END %][% loop.size %]" => '3331') if $is_tt;