]> Dogcows Code - chaz/p5-CGI-Ex/blob - t/7_template_00_base.t
CGI::Ex 2.13
[chaz/p5-CGI-Ex] / t / 7_template_00_base.t
1 # -*- Mode: Perl; -*-
2
3 =head1 NAME
4
5 7_template_00_base.t - Test the basic language functionality of CGI::Ex::Template - including many edge cases
6
7 =cut
8
9 use vars qw($module $is_tt);
10 BEGIN {
11 $module = 'CGI::Ex::Template'; #real 0m0.885s #user 0m0.432s #sys 0m0.004s
12 # $module = 'Template'; #real 0m2.133s #user 0m1.108s #sys 0m0.024s
13 $is_tt = $module eq 'Template';
14 };
15
16 use strict;
17 use Test::More tests => ! $is_tt ? 894 : 613;
18 use Data::Dumper qw(Dumper);
19 use constant test_taint => 0 && eval { require Taint::Runtime };
20
21 use_ok($module);
22
23 Taint::Runtime::taint_start() if test_taint;
24
25 ###----------------------------------------------------------------###
26
27 sub process_ok { # process the value and say if it was ok
28 my $str = shift;
29 my $test = shift;
30 my $vars = shift || {};
31 my $conf = local $vars->{'tt_config'} = $vars->{'tt_config'} || [];
32 my $obj = shift || $module->new(@$conf); # new object each time
33 my $out = '';
34 my $line = (caller)[2];
35 delete $vars->{'tt_config'};
36
37 Taint::Runtime::taint(\$str) if test_taint;
38
39 $obj->process(\$str, $vars, \$out);
40 my $ok = ref($test) ? $out =~ $test : $out eq $test;
41 if ($ok) {
42 ok(1, "Line $line \"$str\" => \"$out\"");
43 return $obj;
44 } else {
45 ok(0, "Line $line \"$str\"");
46 warn "# Was:\n$out\n# Should've been:\n$test\n";
47 print $obj->error if $obj->can('error');
48 print Dumper $obj->parse_tree(\$str) if $obj->can('parse_tree');
49 exit;
50 }
51 }
52
53 ###----------------------------------------------------------------###
54
55 ### set up some dummy packages for various tests
56 {
57 package MyTestPlugin::Foo;
58 $INC{'MyTestPlugin/Foo.pm'} = $0;
59 sub load { $_[0] }
60 sub new {
61 my $class = shift;
62 my $context = shift; # note the plugin style object that needs to shift off context
63 my $args = shift || {};
64 return bless $args, $class;
65 }
66 sub bar { my $self = shift; return join('', map {"$_$self->{$_}"} sort keys %$self) }
67 sub seven { 7 }
68 sub many { return 1, 2, 3 }
69 sub echo { my $self = shift; $_[0] }
70 }
71 {
72 package Foo2;
73 $INC{'Foo2.pm'} = $0;
74 use base qw(MyTestPlugin::Foo);
75 use vars qw($AUTOLOAD);
76 sub new {
77 my $class = shift;
78 my $args = shift || {}; # note - no plugin context
79 return bless $args, $class;
80 }
81 sub leave {} # hacks to allow tt to do the plugins passed via PLUGINS
82 sub delocalise {} # hacks to allow tt to do the plugins passed via PLUGINS
83 }
84
85 my $obj = Foo2->new;
86 my $vars;
87
88 ###----------------------------------------------------------------###
89 print "### GET ##############################################################\n";
90
91 process_ok("[% foo %]" => "");
92 process_ok("[% foo %]" => "7", {foo => 7});
93 process_ok("[% foo %]" => "7", {tt_config => [VARIABLES => {foo => 7}]});
94 process_ok("[% foo %]" => "7", {tt_config => [PRE_DEFINE => {foo => 7}]});
95 process_ok("[% foo %][% foo %][% foo %]" => "777", {foo => 7});
96 process_ok("[% foo() %]" => "7", {foo => 7});
97 process_ok("[% foo.bar %]" => "");
98 process_ok("[% foo.bar %]" => "", {foo => {}});
99 process_ok("[% foo.bar %]" => "7", {foo => {bar => 7}});
100 process_ok("[% foo().bar %]" => "7", {foo => {bar => 7}});
101 process_ok("[% foo.0 %]" => "7", {foo => [7, 2, 3]});
102 process_ok("[% foo.10 %]" => "", {foo => [7, 2, 3]});
103 process_ok("[% foo %]" => 7, {foo => sub { 7 }});
104 process_ok("[% foo(7) %]" => 7, {foo => sub { $_[0] }});
105 process_ok("[% foo.length %]" => 1, {foo => sub { 7 }});
106 process_ok("[% foo.0 %]" => 7, {foo => sub { return 7, 2, 3 }});
107 process_ok("[% foo(bar) %]" => 7, {foo => sub { $_[0] }, bar => 7});
108 process_ok("[% foo(bar.baz) %]" => 7,{foo => sub { $_[0] }, bar => {baz => 7}});
109 process_ok("[% foo.seven %]" => 7, {foo => $obj});
110 process_ok("[% foo.seven() %]" => 7, {foo => $obj});
111 process_ok("[% foo.seven.length %]" => 1, {foo => $obj});
112 process_ok("[% foo.echo(7) %]" => 7, {foo => $obj});
113 process_ok("[% foo.many.0 %]" => 1, {foo => $obj});
114 process_ok("[% foo.many.10 %]" => '',{foo => $obj});
115 process_ok("[% foo.nomethod %]" => '',{foo => $obj});
116 process_ok("[% foo.nomethod.0 %]" => '',{foo => $obj});
117
118 process_ok("[% GET foo %]" => "");
119 process_ok("[% GET foo %]" => "7", {foo => 7});
120 process_ok("[% GET foo.bar %]" => "");
121 process_ok("[% GET foo.bar %]" => "", {foo => {}});
122 process_ok("[% GET foo.bar %]" => "7", {foo => {bar => 7}});
123 process_ok("[% GET foo.0 %]" => "7", {foo => [7, 2, 3]});
124 process_ok("[% GET foo %]" => 7, {foo => sub { 7 }});
125 process_ok("[% GET foo(7) %]" => 7, {foo => sub { $_[0] }});
126
127 process_ok("[% \$name %]" => "", {name => 'foo'});
128 process_ok("[% \$name %]" => "7", {name => 'foo', foo => 7});
129 process_ok("[% \$name.bar %]" => "", {name => 'foo'});
130 process_ok("[% \$name.bar %]" => "", {name => 'foo', foo => {}});
131 process_ok("[% \$name.bar %]" => "7", {name => 'foo', foo => {bar => 7}});
132 process_ok("[% \$name().bar %]" => "7", {name => 'foo', foo => {bar => 7}});
133 process_ok("[% \$name.0 %]" => "7", {name => 'foo', foo => [7, 2, 3]});
134 process_ok("[% \$name %]" => 7, {name => 'foo', foo => sub { 7 }});
135 process_ok("[% \$name(7) %]" => 7, {name => 'foo', foo => sub { $_[0] }});
136
137 process_ok("[% GET \$name %]" => "", {name => 'foo'});
138 process_ok("[% GET \$name %]" => "7", {name => 'foo', foo => 7});
139 process_ok("[% GET \$name.bar %]" => "", {name => 'foo'});
140 process_ok("[% GET \$name.bar %]" => "", {name => 'foo', foo => {}});
141 process_ok("[% GET \$name.bar %]" => "7", {name => 'foo', foo => {bar => 7}});
142 process_ok("[% GET \$name.0 %]" => "7", {name => 'foo', foo => [7, 2, 3]});
143 process_ok("[% GET \$name %]" => 7, {name => 'foo', foo => sub { 7 }});
144 process_ok("[% GET \$name(7) %]" => 7, {name => 'foo', foo => sub { $_[0] }});
145
146 process_ok("[% \$name %]" => "", {name => 'foo foo', foo => 7});
147 process_ok("[% GET \$name %]" => "", {name => 'foo foo', foo => 7});
148
149 process_ok("[% \${name} %]" => "", {name => 'foo'});
150 process_ok("[% \${name} %]" => "7", {name => 'foo', foo => 7});
151 process_ok("[% \${name}.bar %]" => "", {name => 'foo'});
152 process_ok("[% \${name}.bar %]" => "", {name => 'foo', foo => {}});
153 process_ok("[% \${name}.bar %]" => "7", {name => 'foo', foo => {bar => 7}});
154 process_ok("[% \${name}().bar %]" => "7", {name => 'foo', foo => {bar => 7}});
155 process_ok("[% \${name}.0 %]" => "7", {name => 'foo', foo => [7, 2, 3]});
156 process_ok("[% \${name} %]" => 7, {name => 'foo', foo => sub { 7 }});
157 process_ok("[% \${name}(7) %]" => 7, {name => 'foo', foo => sub { $_[0] }});
158
159 process_ok("[% GET \${name} %]" => "", {name => 'foo'});
160 process_ok("[% GET \${name} %]" => "7", {name => 'foo', foo => 7});
161 process_ok("[% GET \${name}.bar %]" => "", {name => 'foo'});
162 process_ok("[% GET \${name}.bar %]" => "", {name => 'foo', foo => {}});
163 process_ok("[% GET \${name}.bar %]" => "7", {name => 'foo', foo => {bar => 7}});
164 process_ok("[% GET \${name}.0 %]" => "7", {name => 'foo', foo => [7, 2, 3]});
165 process_ok("[% GET \${name} %]" => 7, {name => 'foo', foo => sub { 7 }});
166 process_ok("[% GET \${name}(7) %]" => 7, {name => 'foo', foo => sub { $_[0] }});
167
168 process_ok("[% \${name} %]" => "", {name => 'foo foo', foo => 7});
169 process_ok("[% GET \${name} %]" => "", {name => 'foo foo', foo => 7});
170 process_ok("[% GET \${'foo'} %]" => 'bar', {foo => 'bar'});
171
172 process_ok("[% foo.\$name %]" => '', {name => 'bar'});
173 process_ok("[% foo.\$name %]" => 7, {name => 'bar', foo => {bar => 7}});
174 process_ok("[% foo.\$name.baz %]" => '', {name => 'bar', bar => {baz => 7}});
175
176 process_ok("[% \"hi\" %]" => 'hi');
177 process_ok("[% \"hi %]" => '');
178 process_ok("[% 'hi' %]" => 'hi');
179 process_ok("[% 'hi %]" => '');
180 process_ok("[% \"\$foo\" %]" => '7', {foo => 7});
181 process_ok("[% \"hi \$foo\" %]" => 'hi 7', {foo => 7});
182 process_ok("[% \"hi \${foo}\" %]" => 'hi 7', {foo => 7});
183 process_ok("[% 'hi \$foo' %]" => 'hi $foo', {foo => 7});
184 process_ok("[% 'hi \${foo}' %]" => 'hi ${foo}', {foo => 7});
185 process_ok("[% 7 %]" => 7);
186 process_ok("[% -7 %]" => -7);
187
188 process_ok("[% \"hi \${foo.seven}\" %]" => 'hi 7', {foo => $obj});
189 process_ok("[% \"hi \${foo.echo(7)}\" %]" => 'hi 7', {foo => $obj});
190
191 process_ok("[% _foo %]2" => '2', {_foo => 1});
192 process_ok("[% \$bar %]2" => '2', {_foo => 1, bar => '_foo'});
193 process_ok("[% __foo %]2" => '2', {__foo => 1});
194
195 process_ok("[% qw/Foo Bar Baz/.0 %]" => 'Foo') if ! $is_tt;
196 process_ok('[% [0..10].-1 %]' => '10') if ! $is_tt;
197 process_ok('[% [0..10].${ 2.3 } %]' => '2') if ! $is_tt;
198
199 process_ok("[% (1 + 2)() %]" => ''); # parse error
200 process_ok("[% (1 + 2) %]" => '3');
201 process_ok("[% (a) %]" => '2', {a => 2});
202 process_ok("[% ('foo') %]" => 'foo');
203 process_ok("[% (a(2)) %]" => '2', {a => sub { $_[0] }});
204
205 ###----------------------------------------------------------------###
206 print "### SET ##############################################################\n";
207
208 process_ok("[% SET foo bar %][% foo %]" => '');
209 process_ok("[% SET foo = 1 %][% foo %]" => '1');
210 process_ok("[% SET foo = 1 bar = 2 %][% foo %][% bar %]" => '12');
211 process_ok("[% SET foo bar = 1 %][% foo %]" => '');
212 process_ok("[% SET foo = 1 ; bar = 1 %][% foo %]" => '1');
213 process_ok("[% SET foo = 1 %][% SET foo %][% foo %]" => '');
214
215 process_ok("[% SET foo = [] %][% foo.0 %]" => "");
216 process_ok("[% SET foo = [1, 2, 3] %][% foo.1 %]" => 2);
217 process_ok("[% SET foo = {} %][% foo.0 %]" => "");
218 process_ok("[% SET foo = {1 => 2} %][% foo.1 %]" => "2") if ! $is_tt;
219 process_ok("[% SET foo = {'1' => 2} %][% foo.1 %]" => "2");
220
221 process_ok("[% SET name = 1 %][% SET foo = name %][% foo %]" => "1");
222 process_ok("[% SET name = 1 %][% SET foo = \$name %][% foo %]" => "");
223 process_ok("[% SET name = 1 %][% SET foo = \${name} %][% foo %]" => "");
224 process_ok("[% SET name = 1 %][% SET foo = \"\$name\" %][% foo %]" => "1");
225 process_ok("[% SET name = 1 foo = name %][% foo %]" => '1');
226 process_ok("[% SET name = 1 %][% SET foo = {\$name => 2} %][% foo.1 %]" => "2");
227 process_ok("[% SET name = 1 %][% SET foo = {\"\$name\" => 2} %][% foo.1 %]" => "2") if ! $is_tt;
228 process_ok("[% SET name = 1 %][% SET foo = {\${name} => 2} %][% foo.1 %]" => "2");
229
230 process_ok("[% SET name = 7 %][% SET foo = {'2' => name} %][% foo.2 %]" => "7");
231 process_ok("[% SET name = 7 %][% SET foo = {'2' => \"\$name\"} %][% foo.2 %]" => "7");
232
233 process_ok("[% SET name = 7 %][% SET foo = [1, name, 3] %][% foo.1 %]" => "7");
234 process_ok("[% SET name = 7 %][% SET foo = [1, \"\$name\", 3] %][% foo.1 %]" => "7");
235
236 process_ok("[% SET foo = { bar => { baz => [0, 7, 2] } } %][% foo.bar.baz.1 %]" => "7");
237
238 process_ok("[% SET foo.bar = 1 %][% foo.bar %]" => '1');
239 process_ok("[% SET foo.bar.baz.bing = 1 %][% foo.bar.baz.bing %]" => '1');
240 process_ok("[% SET foo.bar.2 = 1 %][% foo.bar.2 %] [% foo.bar.size %]" => '1 1');
241 process_ok("[% SET foo.bar = [] %][% SET foo.bar.2 = 1 %][% foo.bar.2 %] [% foo.bar.size %]" => '1 3');
242
243 process_ok("[% SET name = 'two' %][% SET \$name = 3 %][% two %]" => 3);
244 process_ok("[% SET name = 'two' %][% SET \${name} = 3 %][% two %]" => 3);
245 process_ok("[% SET name = 2 %][% SET foo.\$name = 3 %][% foo.2 %]" => 3);
246 process_ok("[% SET name = 2 %][% SET foo.\$name = 3 %][% foo.\$name %]" => 3);
247 process_ok("[% SET name = 2 %][% SET foo.\${name} = 3 %][% foo.2 %]" => 3);
248 process_ok("[% SET name = 2 %][% SET foo.\${name} = 3 %][% foo.2 %]" => 3);
249 process_ok("[% SET name = 'two' %][% SET \$name.foo = 3 %][% two.foo %]" => 3);
250 process_ok("[% SET name = 'two' %][% SET \${name}.foo = 3 %][% two.foo %]" => 3);
251 process_ok("[% SET name = 'two' %][% SET foo.\$name.foo = 3 %][% foo.two.foo %]" => 3);
252 process_ok("[% SET name = 'two' %][% SET foo.\${name}.foo = 3 %][% foo.two.foo %]" => 3);
253
254 process_ok("[% SET foo = [1..10] %][% foo.6 %]" => 7);
255 process_ok("[% SET foo = [10..1] %][% foo.6 %]" => '');
256 process_ok("[% SET foo = [-10..-1] %][% foo.6 %]" => -4);
257 process_ok("[% SET foo = [1..10, 21..30] %][% foo.12 %]" => 23) if ! $is_tt;
258 process_ok("[% SET foo = [..100] bar = 7 %][% bar %][% foo.0 %]" => '');
259 process_ok("[% SET foo = [100..] bar = 7 %][% bar %][% foo.0 %]" => '');
260 process_ok("[% SET foo = ['a'..'z'] %][% foo.6 %]" => 'g');
261 process_ok("[% SET foo = ['z'..'a'] %][% foo.6 %]" => '');
262 process_ok("[% SET foo = ['a'..'z'].reverse %][% foo.6 %]" => 't') if ! $is_tt;
263
264 process_ok("[% foo = 1 %][% foo %]" => '1');
265 process_ok("[% foo = 1 ; bar = 2 %][% foo %][% bar %]" => '12');
266 process_ok("[% foo.bar = 2 %][% foo.bar %]" => '2');
267
268 process_ok('[% a = "a" %]|[% (b = a) %]|[% a %]|[% b %]' => '|a|a|a');
269 process_ok('[% a = "a" %][% (c = (b = a)) %][% a %][% b %][% c %]' => 'aaaa');
270
271 process_ok("[% a = qw{Foo Bar Baz} ; a.2 %]" => 'Baz') if ! $is_tt;
272
273 process_ok("[% _foo = 1 %][% _foo %]2" => '2');
274 process_ok("[% foo._bar %]2" => '2', {foo => {_bar =>1}});
275
276 ###----------------------------------------------------------------###
277 print "### multiple statements in same tag ##################################\n";
278
279 process_ok("[% foo; %]" => '1', {foo => 1});
280 process_ok("[% GET foo; %]" => '1', {foo => 1});
281 process_ok("[% GET foo; GET foo %]" => '11', {foo => 1});
282 process_ok("[% GET foo GET foo %]" => '11', {foo => 1}) if ! $is_tt;
283 process_ok("[% GET foo GET foo %]" => '', {foo => 1, tt_config => [SEMICOLONS => 1]});
284
285 process_ok("[% foo = 1 bar = 2 %][% foo %][% bar %]" => '12');
286 process_ok("[% foo = 1 bar = 2 %][% foo = 3 bar %][% foo %][% bar %]" => '232') if ! $is_tt;
287 process_ok("[% a = 1 a = a + 2 a %]" => '3') if ! $is_tt;
288
289 process_ok("[% foo = 1 bar = 2 %][% foo %][% bar %]" => '', {tt_config => [SEMICOLONS => 1]}) if ! $is_tt;
290 process_ok("[% foo = 1 bar = 2 %][% foo = 3 bar %][% foo %][% bar %]" => '', {tt_config => [SEMICOLONS => 1]});
291 process_ok("[% a = 1 a = a + 2 a %]" => '', {tt_config => [SEMICOLONS => 1]});
292
293
294 ###----------------------------------------------------------------###
295 print "### CALL / DEFAULT ###################################################\n";
296
297 process_ok("[% DEFAULT foo = 7 %][% foo %]" => 7);
298 process_ok("[% SET foo = 5 %][% DEFAULT foo = 7 %][% foo %]" => 5);
299 process_ok("[% DEFAULT foo.bar.baz.bing = 6 %][% foo.bar.baz.bing %]" => 6);
300
301 my $t = 0;
302 process_ok("[% foo %]" => 'hi', {foo => sub {$t++; 'hi'}});
303 process_ok("[% GET foo %]" => 'hi', {foo => sub {$t++; 'hi'}});
304 process_ok("[% CALL foo %]" => '', {foo => sub {$t++; 'hi'}});
305 ok($t == 3, "CALL method actually called var");
306
307 ###----------------------------------------------------------------###
308 print "### scalar vmethods ##################################################\n";
309
310 process_ok("[% n.0 %]" => '7', {n => 7}) if ! $is_tt;
311 process_ok("[% n.abs %]" => '7', {n => 7}) if ! $is_tt;
312 process_ok("[% n.abs %]" => '7', {n => -7}) if ! $is_tt;
313 process_ok("[% n.atan2.substr(0, 6) %]" => '1.5707', {n => 7}) if ! $is_tt;
314 process_ok("[% (4 * n.atan2(1)).substr(0, 7) %]" => '3.14159', {n => 1}) if ! $is_tt;
315 process_ok("[% n.chunk(3).join %]" => 'abc def g', {n => 'abcdefg'});
316 process_ok("[% n.chunk(-3).join %]" => 'a bcd efg', {n => 'abcdefg'});
317 process_ok("[% n|collapse %]" => "a b", {n => ' a b '}); # TT2 filter
318 process_ok("[% n.cos.substr(0,5) %]" => "1", {n => 0}) if ! $is_tt;
319 process_ok("[% n.cos.substr(0,5) %]" => "0.707", {n => atan2(1,1)}) if ! $is_tt;
320 process_ok("[% n.defined %]" => "1", {n => ''});
321 process_ok("[% n.defined %]" => "", {n => undef});
322 process_ok("[% n.defined %]" => "1", {n => '1'});
323 process_ok("[% n.exp.substr(0,5) %]" => "2.718", {n => 1}) if ! $is_tt;
324 process_ok("[% n.exp.log.substr(0,5) %]" => "8", {n => 8}) if ! $is_tt;
325 process_ok("[% n.fmt %]" => '7', {n => 7}) if ! $is_tt;
326 process_ok("[% n.fmt('%02d') %]" => '07', {n => 7}) if ! $is_tt;
327 process_ok("[% n.fmt('%0*d', 3) %]" => '007', {n => 7}) if ! $is_tt;
328 process_ok("[% n.fmt('(%s)') %]" => "(a\nb)", {n => "a\nb"}) if ! $is_tt;
329 process_ok("[% n|format('%02d') %]" => '07', {n => 7}); # TT2 filter
330 process_ok("[% n|format('%0*d', 3) %]" => '007', {n => 7}) if ! $is_tt;
331 process_ok("[% n|format('(%s)') %]" => "(a)\n(b)", {n => "a\nb"}); # TT2 filter
332 process_ok("[% n.hash.items.1 %]" => "b", {n => {a => "b"}});
333 process_ok("[% n.hex %]" => "255", {n => "FF"}) if ! $is_tt;
334 process_ok("[% n|html %]" => "&", {n => '&'}); # TT2 filter
335 process_ok("[% n|indent %]" => " a\n b", {n => "a\nb"}); # TT2 filter
336 process_ok("[% n|indent(2) %]" => " a\n b", {n => "a\nb"}); # TT2 filter
337 process_ok("[% n|indent('wow ') %]" => "wow a\nwow b", {n => "a\nb"}); # TT2 filter
338 process_ok("[% n.int %]" => "123", {n => "123.234"}) if ! $is_tt;
339 process_ok("[% n.int %]" => "123", {n => "123gggg"}) if ! $is_tt;
340 process_ok("[% n.int %]" => "0", {n => "ff123.234"}) if ! $is_tt;
341 process_ok("[% n.item %]" => '7', {n => 7});
342 process_ok("[% n.lc %]" => 'abc', {n => "ABC"}) if ! $is_tt;
343 process_ok("[% n|lcfirst %]" => 'fOO', {n => "FOO"}); # TT2 filter
344 process_ok("[% n.length %]" => 3, {n => "abc"});
345 process_ok("[% n.list.0 %]" => 'abc', {n => "abc"});
346 process_ok("[% n.log.substr(0,5) %]" => "4.605", {n => 100}) if ! $is_tt;
347 process_ok("[% n|lower %]" => 'abc', {n => "ABC"}); # TT2 filter
348 process_ok("[% n.match('foo').join %]" => '', {n => "bar"});
349 process_ok("[% n.match('foo').join %]" => '1', {n => "foo"});
350 process_ok("[% n.match('foo',1).join %]" => 'foo', {n => "foo"});
351 process_ok("[% n.match('(foo)').join %]" => 'foo', {n => "foo"});
352 process_ok("[% n.match('(foo)').join %]" => 'foo', {n => "foofoo"});
353 process_ok("[% n.match('(foo)',1).join %]" => 'foo foo', {n => "foofoo"});
354 process_ok("[% n.null %]" => '', {n => "abc"});
355 process_ok("[% n.oct %]" => "255", {n => "377"}) if ! $is_tt;
356 process_ok("[% n.rand %]" => qr{^\d+\.\d+}, {n => "2"}) if ! $is_tt;
357 process_ok("[% n.rand %]" => qr{^\d+\.\d+}, {n => "ab"}) if ! $is_tt;
358 process_ok("[% n.remove('bc') %]" => "a", {n => "abc"});
359 process_ok("[% n.remove('bc') %]" => "aa", {n => "abcabc"});
360 process_ok("[% n.repeat %]" => '1', {n => 1}) if ! $is_tt; # tt2 virtual method defaults to 0
361 process_ok("[% n.repeat(0) %]" => '', {n => 1});
362 process_ok("[% n.repeat(1) %]" => '1', {n => 1});
363 process_ok("[% n.repeat(2) %]" => '11', {n => 1});
364 process_ok("[% n.repeat(2,'|') %]" => '1|1', {n => 1}) if ! $is_tt;
365 process_ok("[% n.replace('foo', 'bar') %]" => 'barbar', {n => 'foofoo'});
366 process_ok("[% n.replace('(foo)', 'bar\$1') %]" => 'barfoobarfoo', {n => 'foofoo'}) if ! $is_tt;
367 process_ok("[% n.replace('foo', 'bar', 0) %]" => 'barfoo', {n => 'foofoo'}) if ! $is_tt;
368 process_ok("[% n.search('foo') %]" => '', {n => "bar"});
369 process_ok("[% n.search('foo') %]" => '1', {n => "foo"});
370 process_ok("[% n.sin.substr(0,5) %]" => "0", {n => 0}) if ! $is_tt;
371 process_ok("[% n.sin.substr(0,5) %]" => "1", {n => 2*atan2(1,1)}) if ! $is_tt;
372 process_ok("[% n.size %]" => '1', {n => "foo"});
373 process_ok("[% n.split.join('|') %]" => "abc", {n => "abc"});
374 process_ok("[% n.split.join('|') %]" => "a|b|c", {n => "a b c"});
375 process_ok("[% n.split.join('|') %]" => "a|b|c", {n => "a b c"});
376 process_ok("[% n.split(u,2).join('|') %]" => "a|b c", {n => "a b c", u => undef}) if ! $is_tt;
377 process_ok("[% n.split(u,2).join('|') %]" => "a| b c", {n => "a b c", u => undef}) if $is_tt;
378 process_ok("[% n.split('/').join('|') %]" => "a|b|c", {n => "a/b/c"});
379 process_ok("[% n.split('/', 2).join('|') %]" => "a|b/c", {n => "a/b/c"});
380 process_ok("[% n.sprintf(7) %]" => '7', {n => '%d'}) if ! $is_tt;
381 process_ok("[% n.sprintf(3, 7, 12) %]" => '007 12', {n => '%0*d %d'}) if ! $is_tt;
382 process_ok("[% n.sqrt %]" => "3", {n => 9}) if ! $is_tt;
383 process_ok("[% n.srand; 12 %]" => "12", {n => 9}) if ! $is_tt;
384 process_ok("[% n.stderr %]" => "", {n => "# testing stderr ... ok\r"});
385 process_ok("[% n|trim %]" => "a b", {n => ' a b '}); # TT2 filter
386 process_ok("[% n.uc %]" => 'FOO', {n => "foo"}) if ! $is_tt; # TT2 filter
387 process_ok("[% n|ucfirst %]" => 'Foo', {n => "foo"}); # TT2 filter
388 process_ok("[% n|upper %]" => 'FOO', {n => "foo"}); # TT2 filter
389 process_ok("[% n|uri %]" => 'a%20b', {n => "a b"}); # TT2 filter
390
391 ###----------------------------------------------------------------###
392 print "### list vmethods ####################################################\n";
393
394 process_ok("[% a.defined %]" => '1', {a => [2,3]});
395 process_ok("[% a.defined(1) %]" => '1', {a => [2,3]});
396 process_ok("[% a.defined(3) %]" => '', {a => [2,3]});
397 process_ok("[% a.first %]" => '2', {a => [2..10]});
398 process_ok("[% a.first(3).join %]" => '2 3 4', {a => [2..10]});
399 process_ok("[% a.fmt %]" => '2 3', {a => [2,3]}) if ! $is_tt;
400 process_ok("[% a.fmt('%02d') %]" => '02 03', {a => [2,3]}) if ! $is_tt;
401 process_ok("[% a.fmt('%02d',' ') %]" => '02 03', {a => [2,3]}) if ! $is_tt;
402 process_ok("[% a.fmt('%02d','|') %]" => '02|03', {a => [2,3]}) if ! $is_tt;
403 process_ok("[% a.fmt('%0*d','|', 3) %]" => '002|003', {a => [2,3]}) if ! $is_tt;
404 process_ok("[% a.grep.join %]" => '2 3', {a => [2,3]});
405 process_ok("[% a.grep(2).join %]" => '2', {a => [2,3]});
406 process_ok("[% a.hash.items.join %]" => '2 3', {a => [2,3]});
407 process_ok("[% a.hash(5).items.sort.join %]" => '2 3 5 6', {a => [2,3]});
408 process_ok("[% a.import(5) %]|[% a.join %]" => '|2 3', {a => [2,3]}) if ! $is_tt;
409 process_ok("[% a.import(5) %]|[% a.join %]" => qr{^ARRAY.+|2 3$ }x, {a => [2,3]}) if $is_tt;
410 process_ok("[% a.import([5]) %]|[% a.join %]" => '|2 3 5', {a => [2,3]}) if ! $is_tt;
411 process_ok("[% a.import([5]) %]|[% a.join %]" => qr{ARRAY.+|2 3 5$ }x, {a => [2,3]}) if $is_tt;
412 process_ok("[% a.item %]" => '2', {a => [2,3]});
413 process_ok("[% a.item(1) %]" => '3', {a => [2,3]});
414 process_ok("[% a.join %]" => '2 3', {a => [2,3]});
415 process_ok("[% a.join('|') %]" => '2|3', {a => [2,3]});
416 process_ok("[% a.last %]" => '10', {a => [2..10]});
417 process_ok("[% a.last(3).join %]" => '8 9 10', {a => [2..10]});
418 process_ok("[% a.list.join %]" => '2 3', {a => [2, 3]});
419 process_ok("[% a.max %]" => '1', {a => [2, 3]});
420 process_ok("[% a.merge(5).join %]" => '2 3', {a => [2,3]});
421 process_ok("[% a.merge([5]).join %]" => '2 3 5', {a => [2,3]});
422 process_ok("[% a.merge([5]).null %][% a.join %]" => '2 3', {a => [2,3]});
423 process_ok("[% a.nsort.join %]" => '1 2 3', {a => [2, 3, 1]});
424 process_ok("[% a.nsort('b').0.b %]" => '7', {a => [{b => 23}, {b => 7}]});
425 process_ok("[% a.pop %][% a.join %]" => '32', {a => [2, 3]});
426 process_ok("[% a.push(3) %][% a.join %]" => '2 3 3', {a => [2, 3]});
427 process_ok("[% a.pick %]" => qr{ ^[23]$ }x, {a => [2, 3]}) if ! $is_tt;
428 process_ok("[% a.pick(5).join('') %]" => qr{ ^[23]{5}$ }x, {a => [2, 3]}) if ! $is_tt;
429 process_ok("[% a.reverse.join %]" => '3 2', {a => [2, 3]});
430 process_ok("[% a.shift %][% a.join %]" => '23', {a => [2, 3]});
431 process_ok("[% a.size %]" => '2', {a => [2, 3]});
432 process_ok("[% a.slice.join %]" => '2 3 4 5', {a => [2..5]});
433 process_ok("[% a.slice(2).join %]" => '4 5', {a => [2..5]});
434 process_ok("[% a.slice(0,2).join %]" => '2 3 4', {a => [2..5]});
435 process_ok("[% a.sort.join %]" => '1 2 3', {a => [2, 3, 1]});
436 process_ok("[% a.sort('b').0.b %]" => 'wee', {a => [{b => "wow"}, {b => "wee"}]});
437 process_ok("[% a.splice.join %]|[% a.join %]" => '2 3 4 5|', {a => [2..5]});
438 process_ok("[% a.splice(2).join %]|[% a.join %]" => '4 5|2 3', {a => [2..5]});
439 process_ok("[% a.splice(0,2).join %]|[% a.join %]" => '2 3|4 5', {a => [2..5]});
440 process_ok("[% a.splice(0,2,'hrm').join %]|[% a.join %]" => '2 3|hrm 4 5', {a => [2..5]});
441 process_ok("[% a.unique.join %]" => '2 3', {a => [2,3,3,3,2]});
442 process_ok("[% a.unshift(3) %][% a.join %]" => '3 2 3', {a => [2, 3]});
443
444 ###----------------------------------------------------------------###
445 print "### hash vmethods ####################################################\n";
446
447 process_ok("[% h.defined %]" => "1", {h => {}});
448 process_ok("[% h.defined('a') %]" => "1", {h => {a => 1}});
449 process_ok("[% h.defined('b') %]" => "", {h => {a => 1}});
450 process_ok("[% h.defined('a') %]" => "", {h => {a => undef}});
451 process_ok("[% h.delete('a') %]|[% h.keys.0 %]" => "|b", {h => {a => 1, b=> 2}});
452 process_ok("[% h.delete('a', 'b').join %]|[% h.keys.0 %]" => "|", {h => {a => 1, b=> 2}});
453 process_ok("[% h.delete('a', 'c').join %]|[% h.keys.0 %]" => "|b", {h => {a => 1, b=> 2}});
454 process_ok("[% h.each.sort.join %]" => "1 2 a b", {h => {a => 1, b=> 2}});
455 process_ok("[% h.exists('a') %]" => "1", {h => {a => 1}});
456 process_ok("[% h.exists('b') %]" => "", {h => {a => 1}});
457 process_ok("[% h.exists('a') %]" => "1", {h => {a => undef}});
458 process_ok("[% h.fmt %]" => "b\tB\nc\tC", {h => {b => "B", c => "C"}}) if ! $is_tt;
459 process_ok("[% h.fmt('%s => %s') %]" => "b => B\nc => C", {h => {b => "B", c => "C"}}) if ! $is_tt;
460 process_ok("[% h.fmt('%s => %s', '|') %]" => "b => B|c => C", {h => {b => "B", c => "C"}}) if ! $is_tt;
461 process_ok("[% h.fmt('%*s=>%s', '|', 3) %]" => " b=>B| c=>C", {h => {b => "B", c => "C"}}) if ! $is_tt;
462 process_ok("[% h.fmt('%*s=>%*s', '|', 3, 4) %]" => " b=> B| c=> C", {h => {b => "B", c => "C"}}) if ! $is_tt;
463 process_ok("[% h.hash.fmt %]" => "b\tB\nc\tC", {h => {b => "B", c => "C"}}) if ! $is_tt;
464 process_ok("[% h.import('a') %]|[% h.items.sort.join %]" => "|b B c C", {h => {b => "B", c => "C"}});
465 process_ok("[% h.import({'b' => 'boo'}) %]|[% h.items.sort.join %]" => "|b boo c C", {h => {b => "B", c => "C"}});
466 process_ok("[% h.item('a') %]" => 'A', {h => {a => 'A'}});
467 process_ok("[% h.item('_a') %]" => '', {h => {_a => 'A'}}) if ! $is_tt;
468 process_ok("[% h.items.sort.join %]" => "1 2 a b", {h => {a => 1, b=> 2}});
469 process_ok("[% h.keys.sort.join %]" => "a b", {h => {a => 1, b=> 2}});
470 process_ok("[% h.list('each').sort.join %]" => "1 2 a b", {h => {a => 1, b=> 2}});
471 process_ok("[% h.list('keys').sort.join %]" => "a b", {h => {a => 1, b=> 2}});
472 process_ok("[% h.list('pairs').0.items.sort.join %]" => "1 a key value", {h => {a => 1, b=> 2}});
473 process_ok("[% h.list('values').sort.join %]" => "1 2", {h => {a => 1, b=> 2}});
474 process_ok("[% h.null %]" => "", {h => {}});
475 process_ok("[% h.nsort.join %]" => "b a", {h => {a => 7, b => 2}});
476 process_ok("[% h.pairs.0.items.sort.join %]" => "1 a key value", {h => {a => 1, b=> 2}});
477 process_ok("[% h.size %]" => "2", {h => {a => 1, b=> 2}});
478 process_ok("[% h.sort.join %]" => "b a", {h => {a => "BBB", b => "A"}});
479 process_ok("[% h.values.sort.join %]" => "1 2", {h => {a => 1, b=> 2}});
480
481 ###----------------------------------------------------------------###
482 print "### vmethods as functions ############################################\n";
483
484 process_ok("[% sprintf('%d %d', 7, 8) %] d" => '7 8 d') if ! $is_tt;
485 process_ok("[% sprintf('%d %d', 7, 8) %] d" => '7 8 d', {tt_config => [VMETHOD_FUNCTIONS => 1]}) if ! $is_tt;
486 process_ok("[% sprintf('%d %d', 7, 8) %] d" => ' d', {tt_config => [VMETHOD_FUNCTIONS => 0]}) if ! $is_tt;
487 process_ok("[% int(2.234) %]" => '2') if ! $is_tt;
488
489 process_ok("[% int(2.234) ; int = 44; int(2.234) ; SET int; int(2.234) %]" => '2442') if ! $is_tt; # hide and unhide
490
491 ###----------------------------------------------------------------###
492 print "### more virtual methods / filters ###################################\n";
493
494 process_ok("[% [0 .. 10].reverse.1 %]" => 9) if ! $is_tt;
495 process_ok("[% {a => 'A'}.a %]" => 'A') if ! $is_tt;
496 process_ok("[% 'This is a string'.length %]" => 16) if ! $is_tt;
497 process_ok("[% 123.length %]" => 3) if ! $is_tt;
498 process_ok("[% 123.2.length %]" => 5) if ! $is_tt;
499 process_ok("[% -123.2.length %]" => -5) if ! $is_tt; # the - doesn't bind as tight as the dot methods
500 process_ok("[% (-123.2).length %]" => 6) if ! $is_tt;
501 process_ok("[% a = 23; a.0 %]" => 23) if ! $is_tt; # '0' is a scalar_op
502 process_ok('[% 1.rand %]' => qr/^0\.\d+(?:e-?\d+)?$/) if ! $is_tt;
503
504 process_ok("[% n.size %]", => 'SIZE', {n => {size => 'SIZE', a => 'A'}});
505 process_ok("[% n|size %]", => '2', {n => {size => 'SIZE', a => 'A'}}) if ! $is_tt; # tt2 | is alias for FILTER
506
507 process_ok('[% foo | eval %]' => 'baz', {foo => '[% bar %]', bar => 'baz'});
508 process_ok('[% "1" | indent(2) %]' => ' 1');
509
510
511 process_ok("[% n FILTER size %]", => '1', {n => {size => 'SIZE', a => 'A'}}) if ! $is_tt; # tt2 doesn't have size
512
513 process_ok("[% n FILTER repeat %]" => '1', {n => 1});
514 process_ok("[% n FILTER repeat(0) %]" => '', {n => 1});
515 process_ok("[% n FILTER repeat(1) %]" => '1', {n => 1});
516 process_ok("[% n FILTER repeat(2) %]" => '11', {n => 1});
517 process_ok("[% n FILTER repeat(2,'|') %]" => '1|1', {n => 1}) if ! $is_tt;
518
519 process_ok("[% n FILTER echo = repeat(2) %][% n FILTER echo %]" => '1111', {n => 1});
520 process_ok("[% n FILTER echo = repeat(2) %][% n | echo %]" => '1111', {n => 1});
521 process_ok("[% n FILTER echo = repeat(2) %][% n|echo.length %]" => '112', {n => 1}) if ! $is_tt;
522 process_ok("[% n FILTER echo = repeat(2) %][% n FILTER \$foo %]" => '1111', {n => 1, foo => 'echo'});
523 process_ok("[% n FILTER echo = repeat(2) %][% n | \$foo %]" => '1111', {n => 1, foo => 'echo'});
524 process_ok("[% n FILTER echo = repeat(2) %][% n|\$foo.length %]" => '112', {n => 1, foo => 'echo'}) if ! $is_tt;
525
526 process_ok('[% "hi" FILTER $foo %]' => 'hihi', {foo => sub {sub {$_[0]x2}}}); # filter via a passed var
527 process_ok('[% FILTER $foo %]hi[% END %]' => 'hihi', {foo => sub {sub {$_[0]x2}}}); # filter via a passed var
528 process_ok('[% "hi" FILTER foo %]' => 'hihi', {tt_config => [FILTERS => {foo => sub {$_[0]x2}}]});
529 process_ok('[% "hi" FILTER foo %]' => 'hihi', {tt_config => [FILTERS => {foo => [sub {$_[0]x2},0]}]});
530 process_ok('[% "hi" FILTER foo(2) %]' => 'hihi', {tt_config => [FILTERS => {foo => [sub {my$a=$_[1];sub{$_[0]x$a}},1]}]});
531
532 process_ok('[% ["a".."z"].pick %]' => qr/^[a-z]/) if ! $is_tt;
533
534 process_ok("[% ' ' | uri %]" => '%20');
535
536 process_ok('[% "one".fmt %]' => "one") if ! $is_tt;
537 process_ok('[% 2.fmt("%02d") %]' => "02") if ! $is_tt;
538
539 process_ok('[% [1..3].fmt %]' => "1 2 3") if ! $is_tt;
540 process_ok('[% [1..3].fmt("%02d") %]' => '01 02 03') if ! $is_tt;
541 process_ok('[% [1..3].fmt("%s", ", ") %]' => '1, 2, 3') if ! $is_tt;
542
543 process_ok('[% {a => "B", c => "D"}.fmt %]' => "a\tB\nc\tD") if ! $is_tt;
544 process_ok('[% {a => "B", c => "D"}.fmt("%s:%s") %]' => "a:B\nc:D") if ! $is_tt;
545 process_ok('[% {a => "B", c => "D"}.fmt("%s:%s", "; ") %]' => "a:B; c:D") if ! $is_tt;
546
547 process_ok('[% 1|format("%s") %]' => '1') if ! $is_tt;
548 process_ok('[% 1|format("%*s", 6) %]' => ' 1') if ! $is_tt;
549 process_ok('[% 1|format("%-*s", 6) %]' => '1 ') if ! $is_tt;
550
551 process_ok('[% 1.fmt("%-*s", 6) %]' => '1 ') if ! $is_tt;
552 process_ok('[% [1,2].fmt("%-*s", "|", 6) %]' => '1 |2 ') if ! $is_tt;
553 process_ok('[% {1=>2,3=>4}.fmt("%*s:%*s", "|", 3, 3) %]' => ' 1: 2| 3: 4') if ! $is_tt;
554
555 ###----------------------------------------------------------------###
556 print "### virtual objects ##################################################\n";
557
558 process_ok('[% a = "foobar" %][% Text.length(a) %]' => 6) if ! $is_tt;
559 process_ok('[% a = [1 .. 10] %][% List.size(a) %]' => 10) if ! $is_tt;
560 process_ok('[% a = {a=>"A", b=>"B"} ; Hash.size(a) %]' => 2) if ! $is_tt;
561
562 process_ok('[% a = Text.new("This is a string") %][% a.length %]' => 16) if ! $is_tt;
563 process_ok('[% a = List.new("one", "two", "three") %][% a.size %]' => 3) if ! $is_tt;
564 process_ok('[% a = Hash.new("one", "ONE") %][% a.one %]' => 'ONE') if ! $is_tt;
565 process_ok('[% a = Hash.new(one = "ONE") %][% a.one %]' => 'ONE') if ! $is_tt;
566 process_ok('[% a = Hash.new(one => "ONE") %][% a.one %]' => 'ONE') if ! $is_tt;
567
568 process_ok('[% {a => 1, b => 2} | Hash.keys | List.join(", ") %]' => 'a, b') if ! $is_tt;
569
570 ###----------------------------------------------------------------###
571 print "### chomping #########################################################\n";
572
573 process_ok(" [% foo %]" => ' ');
574 process_ok(" [%- foo %]" => '');
575 process_ok("\n[%- foo %]" => '');
576 process_ok("\n [%- foo %]" => '');
577 process_ok("\n\n[%- foo %]" => "\n");
578 process_ok(" \n\n[%- foo %]" => " \n");
579 process_ok(" \n[%- foo %]" => " ") if ! $is_tt;
580 process_ok(" \n \n[%- foo %]" => " \n ") if ! $is_tt;
581
582 process_ok("[% 7 %] " => '7 ');
583 process_ok("[% 7 -%] " => '7 ');
584 process_ok("[% 7 -%]\n" => '7');
585 process_ok("[% 7 -%] \n" => '7');
586 process_ok("[% 7 -%]\n " => '7 ');
587 process_ok("[% 7 -%]\n\n\n" => "7\n\n");
588 process_ok("[% 7 -%] \n " => '7 ');
589
590 ###----------------------------------------------------------------###
591 print "### string operators #################################################\n";
592
593 process_ok('[% a = "foo"; a _ "bar" %]' => 'foobar');
594 process_ok('[% a = "foo"; a ~ "bar" %]' => 'foobar') if ! $is_tt;
595 process_ok('[% a = "foo"; a ~= "bar"; a %]' => 'foobar') if ! $is_tt;
596 process_ok('[% "b" gt "c" %]<<<' => '<<<') if ! $is_tt;
597 process_ok('[% "b" gt "a" %]<<<' => '1<<<') if ! $is_tt;
598 process_ok('[% "b" ge "c" %]<<<' => '<<<') if ! $is_tt;
599 process_ok('[% "b" ge "b" %]<<<' => '1<<<') if ! $is_tt;
600 process_ok('[% "b" lt "c" %]<<<' => '1<<<') if ! $is_tt;
601 process_ok('[% "b" lt "a" %]<<<' => '<<<') if ! $is_tt;
602 process_ok('[% "b" le "a" %]<<<' => '<<<') if ! $is_tt;
603 process_ok('[% "b" le "b" %]<<<' => '1<<<') if ! $is_tt;
604 process_ok('[% "a" cmp "b" %]<<<' => '-1<<<') if ! $is_tt;
605 process_ok('[% "b" cmp "b" %]<<<' => '0<<<') if ! $is_tt;
606 process_ok('[% "c" cmp "b" %]<<<' => '1<<<') if ! $is_tt;
607
608 ###----------------------------------------------------------------###
609 print "### math operators ###################################################\n";
610
611 process_ok("[% 1 + 2 %]" => 3);
612 process_ok("[% 1 + 2 + 3 %]" => 6);
613 process_ok("[% (1 + 2) %]" => 3);
614 process_ok("[% 2 - 1 %]" => 1);
615 process_ok("[% -1 + 2 %]" => 1);
616 process_ok("[% -1+2 %]" => 1);
617 process_ok("[% 2 - 1 %]" => 1);
618 process_ok("[% 2-1 %]" => 1) if ! $is_tt;
619 process_ok("[% 2 - -1 %]" => 3);
620 process_ok("[% 4 * 2 %]" => 8);
621 process_ok("[% 4 / 2 %]" => 2);
622 process_ok("[% 10 / 3 %]" => qr/^3.333/);
623 process_ok("[% 10 div 3 %]" => '3');
624 process_ok("[% 2 ** 3 %]" => 8) if ! $is_tt;
625 process_ok("[% 1 + 2 * 3 %]" => 7);
626 process_ok("[% 3 * 2 + 1 %]" => 7);
627 process_ok("[% (1 + 2) * 3 %]" => 9);
628 process_ok("[% 3 * (1 + 2) %]" => 9);
629 process_ok("[% 1 + 2 ** 3 %]" => 9) if ! $is_tt;
630 process_ok("[% 2 * 2 ** 3 %]" => 16) if ! $is_tt;
631 process_ok("[% SET foo = 1 %][% foo + 2 %]" => 3);
632 process_ok("[% SET foo = 1 %][% (foo + 2) %]" => 3);
633
634 process_ok("[% a = 1; (a += 2) %]" => 3) if ! $is_tt;
635 process_ok("[% a = 1; (a -= 2) %]" => -1) if ! $is_tt;
636 process_ok("[% a = 4; (a /= 2) %]" => 2) if ! $is_tt;
637 process_ok("[% a = 1; (a *= 2) %]" => 2) if ! $is_tt;
638 process_ok("[% a = 3; (a **= 2) %]" => 9) if ! $is_tt;
639 process_ok("[% a = 1; (a %= 2) %]" => 1) if ! $is_tt;
640
641 process_ok('[% a += 1 %]-[% a %]-[% a += 1 %]-[% a %]' => '-1--2') if ! $is_tt;
642 process_ok('[% (a += 1) %]-[% (a += 1) %]' => '1-2') if ! $is_tt;
643
644 process_ok('[% a = 2; a -= 3; a %]' => '-1') if ! $is_tt;
645 process_ok('[% a = 2; a *= 3; a %]' => '6') if ! $is_tt;
646 process_ok('[% a = 2; a /= .5; a %]' => '4') if ! $is_tt;
647 process_ok('[% a = 8; a %= 3; a %]' => '2') if ! $is_tt;
648 process_ok('[% a = 2; a **= 3; a %]' => '8') if ! $is_tt;
649
650 process_ok('[% a = 1 %][% ++a %][% a %]' => '22') if ! $is_tt;
651 process_ok('[% a = 1 %][% a++ %][% a %]' => '12') if ! $is_tt;
652 process_ok('[% a = 1 %][% --a %][% a %]' => '00') if ! $is_tt;
653 process_ok('[% a = 1 %][% a-- %][% a %]' => '10') if ! $is_tt;
654 process_ok('[% a++ FOR [1..3] %]' => '012') if ! $is_tt;
655 process_ok('[% --a FOR [1..3] %]' => '-1-2-3') if ! $is_tt;
656
657 process_ok('[% 2 > 3 %]<<<' => '<<<');
658 process_ok('[% 2 > 1 %]<<<' => '1<<<');
659 process_ok('[% 2 >= 3 %]<<<' => '<<<');
660 process_ok('[% 2 >= 2 %]<<<' => '1<<<');
661 process_ok('[% 2 < 3 %]<<<' => '1<<<');
662 process_ok('[% 2 < 1 %]<<<' => '<<<');
663 process_ok('[% 2 <= 1 %]<<<' => '<<<');
664 process_ok('[% 2 <= 2 %]<<<' => '1<<<');
665 process_ok('[% 1 <=> 2 %]<<<' => '-1<<<') if ! $is_tt;
666 process_ok('[% 2 <=> 2 %]<<<' => '0<<<') if ! $is_tt;
667 process_ok('[% 3 <=> 2 %]<<<' => '1<<<') if ! $is_tt;
668
669 ###----------------------------------------------------------------###
670 print "### boolean operators ################################################\n";
671
672 process_ok("[% 5 && 6 %]" => 6);
673 process_ok("[% 5 || 6 %]" => 5);
674 process_ok("[% 0 || 6 %]" => 6);
675 process_ok("[% 0 && 6 %]" => 0);
676 process_ok("[% 0 && 0 %]" => 0);
677 process_ok("[% 5 && 6 && 7%]" => 7);
678 process_ok("[% 0 || 1 || 2 %]" => 1);
679
680 process_ok("[% 5 + (0 || 5) %]" => 10);
681
682
683 process_ok("[% 1 ? 2 : 3 %]" => '2');
684 process_ok("[% 0 ? 2 : 3 %]" => '3');
685 process_ok("[% 0 ? (1 ? 2 : 3) : 4 %]" => '4');
686 process_ok("[% 0 ? 1 ? 2 : 3 : 4 %]" => '4');
687
688 process_ok("[% t = 1 || 0 ? 3 : 4 %][% t %]" => 3);
689 process_ok("[% t = 0 or 1 ? 3 : 4 %][% t %]" => 3);
690 process_ok("[% t = 1 or 0 ? 3 : 4 %][% t %]" => 1) if ! $is_tt;
691
692 process_ok("[% 0 ? 2 : 3 %]" => '3');
693 process_ok("[% 1 ? 2 : 3 %]" => '2');
694 process_ok("[% 0 ? 1 ? 2 : 3 : 4 %]" => '4');
695 process_ok("[% t = 0 ? 1 ? [1..4] : [2..4] : [3..4] %][% t.0 %]" => '3');
696 process_ok("[% t = 1 || 0 ? 0 : 1 || 2 ? 2 : 3 %][% t %]" => '0');
697 process_ok("[% t = 0 or 0 ? 0 : 1 or 2 ? 2 : 3 %][% t %]" => '1') if ! $is_tt;
698 process_ok("[% t = 0 or 0 ? 0 : 0 or 2 ? 2 : 3 %][% t %]" => '2');
699
700 process_ok("[% 0 ? 1 ? 1 + 2 * 3 : 1 + 2 * 4 : 1 + 2 * 5 %]" => '11');
701
702 ###----------------------------------------------------------------###
703 print "### regex ############################################################\n";
704
705 process_ok("[% /foo/ %]" => '(?-xism:foo)') if ! $is_tt;
706 process_ok("[% /foo %]" => '') if ! $is_tt;
707 process_ok("[% /foo/x %]" => '(?-xism:(?x:foo))') if ! $is_tt;
708 process_ok("[% /foo/xi %]" => '(?-xism:(?xi:foo))') if ! $is_tt;
709 process_ok("[% /foo/xis %]" => '(?-xism:(?xis:foo))') if ! $is_tt;
710 process_ok("[% /foo/xism %]" => '(?-xism:(?xism:foo))') if ! $is_tt;
711 process_ok("[% /foo/e %]" => '') if ! $is_tt;
712 process_ok("[% /foo/g %]" => '') if ! $is_tt;
713 process_ok("[% /foo %]" => '') if ! $is_tt;
714 process_ok("[% /foo**/ %]" => '') if ! $is_tt;
715 process_ok("[% /fo\\/o/ %]" => '(?-xism:fo/o)') if ! $is_tt;
716 process_ok("[% 'foobar'.match(/(f\\w\\w)/).0 %]" => 'foo') if ! $is_tt;
717
718 ###----------------------------------------------------------------###
719 print "### BLOCK / PROCESS / INCLUDE#########################################\n";
720
721 process_ok("[% PROCESS foo %]one" => '');
722 process_ok("[% BLOCK foo %]one" => '');
723 process_ok("[% BLOCK foo %][% END %]one" => 'one');
724 process_ok("[% BLOCK %][% END %]one" => 'one');
725 process_ok("[% BLOCK foo %]hi there[% END %]one" => 'one');
726 process_ok("[% BLOCK foo %][% BLOCK foo %][% END %][% END %]" => '');
727 process_ok("[% BLOCK foo %]hi there[% END %][% PROCESS foo %]" => 'hi there');
728 process_ok("[% PROCESS foo %][% BLOCK foo %]hi there[% END %]" => 'hi there');
729 process_ok("[% BLOCK foo %]hi there[% END %][% PROCESS foo foo %]" => 'hi therehi there') if ! $is_tt;
730 process_ok("[% BLOCK foo %]hi there[% END %][% PROCESS foo, foo %]" => 'hi therehi there') if ! $is_tt;
731 process_ok("[% BLOCK foo %]hi there[% END %][% PROCESS foo + foo %]" => 'hi therehi there');
732 process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% PROCESS foo %]" => 'hi ONE there', {one => 'ONE'});
733 process_ok("[% BLOCK foo %]hi [% IF 1 %]Yes[% END %] there[% END %]<<[% PROCESS foo %]>>" => '<<hi Yes there>>');
734 process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% PROCESS foo one = 'two' %]" => 'hi two there');
735 process_ok("[% BLOCK foo %]hi [% one.two %] there[% END %][% PROCESS foo one.two = 'two' %]" => 'hi two there');
736 process_ok("[% BLOCK foo %]hi [% one.two %] there[% END %][% PROCESS foo + foo one.two = 'two' %]" => 'hi two there'x2);
737 process_ok("[% BLOCK foo %][% BLOCK bar %]hi [% one %] there[% END %][% END %][% PROCESS foo/bar one => 'two' %]" => 'hi two there');
738
739 process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% PROCESS foo one = 'two' %][% one %]" => 'hi two theretwo');
740 process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% INCLUDE foo one = 'two' %][% one %]" => 'hi two there');
741
742 ###----------------------------------------------------------------###
743 print "### IF / UNLESS / ELSIF / ELSE #######################################\n";
744
745 process_ok("[% IF 1 %]Yes[% END %]" => 'Yes');
746 process_ok("[% IF 0 %]Yes[% END %]" => '');
747 process_ok("[% IF 0 %]Yes[% ELSE %]No[% END %]" => 'No');
748 process_ok("[% IF 0 %]Yes[% ELSIF 1 %]No[% END %]" => 'No');
749 process_ok("[% IF 0 %]Yes[% ELSIF 0 %]No[% END %]" => '');
750 process_ok("[% IF 0 %]Yes[% ELSIF 0 %]No[% ELSE %]hmm[% END %]" => 'hmm');
751
752 process_ok("[% UNLESS 1 %]Yes[% END %]" => '');
753 process_ok("[% UNLESS 0 %]Yes[% END %]" => 'Yes');
754 process_ok("[% UNLESS 0 %]Yes[% ELSE %]No[% END %]" => 'Yes');
755 process_ok("[% UNLESS 1 %]Yes[% ELSIF 1 %]No[% END %]" => 'No');
756 process_ok("[% UNLESS 1 %]Yes[% ELSIF 0 %]No[% END %]" => '');
757 process_ok("[% UNLESS 1 %]Yes[% ELSIF 0 %]No[% ELSE %]hmm[% END %]" => 'hmm');
758
759 ###----------------------------------------------------------------###
760 print "### comments #########################################################\n";
761
762 process_ok("[%# one %]" => '', {one => 'ONE'});
763 process_ok("[%#\n one %]" => '', {one => 'ONE'});
764 process_ok("[%-#\n one %]" => '', {one => 'ONE'}) if ! $is_tt;
765 process_ok("[% #\n one %]" => 'ONE', {one => 'ONE'});
766 process_ok("[%# BLOCK one %]" => '');
767 process_ok("[%# BLOCK one %]two" => 'two');
768 process_ok("[%# BLOCK one %]two[% END %]" => '');
769 process_ok("[%# BLOCK one %]two[% END %]three" => '');
770 process_ok("[%
771 #
772 -%]
773 foo" => "foo");
774
775 ###----------------------------------------------------------------###
776 print "### FOREACH / NEXT / LAST ############################################\n";
777
778 process_ok("[% FOREACH foo %]" => '');
779 process_ok("[% FOREACH foo %][% END %]" => '');
780 process_ok("[% FOREACH foo %]bar[% END %]" => '');
781 process_ok("[% FOREACH foo %]bar[% END %]" => 'bar', {foo => 1});
782 process_ok("[% FOREACH f IN foo %]bar[% f %][% END %]" => 'bar1bar2', {foo => [1,2]});
783 process_ok("[% FOREACH f = foo %]bar[% f %][% END %]" => 'bar1bar2', {foo => [1,2]});
784 process_ok("[% FOREACH f = [1,2] %]bar[% f %][% END %]" => 'bar1bar2');
785 process_ok("[% FOREACH f = [1..3] %]bar[% f %][% END %]" => 'bar1bar2bar3');
786 process_ok("[% FOREACH f = [{a=>'A'},{a=>'B'}] %]bar[% f.a %][% END %]" => 'barAbarB');
787 process_ok("[% FOREACH [{a=>'A'},{a=>'B'}] %]bar[% a %][% END %]" => 'barAbarB');
788 process_ok("[% FOREACH [{a=>'A'},{a=>'B'}] %]bar[% a %][% END %][% a %]" => 'barAbarB');
789 process_ok("[% FOREACH f = [1..3] %][% loop.count %]/[% loop.size %] [% END %]" => '1/3 2/3 3/3 ');
790 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% f %][% END %][% END %]" => '1');
791 process_ok("[% FOREACH f = [1..3] %][% IF loop.last %][% f %][% END %][% END %]" => '3');
792 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% NEXT %][% END %][% f %][% END %]" => '23');
793 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% LAST %][% END %][% f %][% END %]" => '');
794 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% NEXT %][% END %][% END %]" => '123');
795 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% LAST %][% END %][% END %]" => '1');
796
797 process_ok('[% a = ["Red", "Blue"] ; FOR [0..3] ; a.${ loop.index % a.size } ; END %]' => 'RedBlueRedBlue') if ! $is_tt;
798
799 ### TT is not consistent in what is localized - well it is documented
800 ### if you set a variable in the FOREACH tag, then nothing in the loop gets localized
801 ### if you don't set a variable - everything gets localized
802 process_ok("[% foo = 1 %][% FOREACH [1..10] %][% foo %][% foo = 2 %][% END %]" => '1222222222');
803 process_ok("[% f = 1 %][% FOREACH i = [1..10] %][% i %][% f = 2 %][% END %][% f %]" => '123456789102');
804 process_ok("[% f = 1 %][% FOREACH [1..10] %][% f = 2 %][% END %][% f %]" => '1');
805 process_ok("[% f = 1 %][% FOREACH f = [1..10] %][% f %][% END %][% f %]" => '1234567891010');
806 process_ok("[% FOREACH [1] %][% SET a = 1 %][% END %][% a %]" => '');
807 process_ok("[% a %][% FOREACH [1] %][% SET a = 1 %][% END %][% a %]" => '');
808 process_ok("[% a = 2 %][% FOREACH [1] %][% SET a = 1 %][% END %][% a %]" => '2');
809 process_ok("[% a = 2 %][% FOREACH [1] %][% a = 1 %][% END %][% a %]" => '2');
810 process_ok("[% a = 2 %][% FOREACH i = [1] %][% a = 1 %][% END %][% a %]" => '1');
811 process_ok("[% FOREACH i = [1] %][% SET a = 1 %][% END %][% a %]" => '1');
812 process_ok("[% f.b = 1 %][% FOREACH f.b = [1..10] %][% f.b %][% END %][% f.b %]" => '1234567891010') if ! $is_tt;
813 process_ok("[% a = 1 %][% FOREACH [{a=>'A'},{a=>'B'}] %]bar[% a %][% END %][% a %]" => 'barAbarB1');
814 process_ok("[% FOREACH [1..3] %][% loop.size %][% END %][% loop.size %]" => '333');
815 process_ok("[% FOREACH i = [1..3] %][% loop.size %][% END %][% loop.size %]" => '333') if ! $is_tt;
816 process_ok("[% FOREACH i = [1..3] %][% loop.size %][% END %][% loop.size %]" => '3331') if $is_tt;
817
818 process_ok('[% FOREACH f = [1..3]; 1; END %]' => '111');
819 process_ok('[% FOREACH f = [1..3]; f; END %]' => '123');
820 process_ok('[% FOREACH f = [1..3]; "$f"; END %]' => '123');
821 process_ok('[% FOREACH f = [1..3]; f + 1; END %]' => '234');
822
823 ###----------------------------------------------------------------###
824 print "### LOOP #############################################################\n";
825
826 process_ok("[% var = [{key => 'a'}, {key => 'b'}] -%]
827 [% LOOP var -%]
828 ([% key %])
829 [% END %]" => " (a)\n (b)\n") if ! $is_tt;
830
831 process_ok("[% var = [{key => 'a'}, {key => 'b'}] -%]
832 [% LOOP var -%]
833 [%- NEXT IF key eq 'a' -%]
834 ([% key %])
835 [% END %]" => " (b)\n") if ! $is_tt;
836
837 if (! $is_tt) {
838 local $CGI::Ex::Template::QR_PRIVATE = 0;
839 local $CGI::Ex::Template::QR_PRIVATE = 0; # warn clean
840 CGI::Ex::Template->define_vmethod('scalar', textjoin => sub {join(shift, @_)});
841
842 process_ok("[% var = [{key => 'a'}, {key => 'b'}, {key => 'c'}] -%]
843 [% LOOP var -%]
844 ([% textjoin('|', key, __first__, __last__, __inner__, __odd__) %])
845 [% END -%]" => "(a|1|0|0|1)
846 (b|0|0|1|0)
847 (c|0|1|0|1)
848 ", {tt_config => [LOOP_CONTEXT_VARS => 1]});
849 }
850
851 ###----------------------------------------------------------------###
852 print "### WHILE ############################################################\n";
853
854 process_ok("[% WHILE foo %]" => '');
855 process_ok("[% WHILE foo %][% END %]" => '');
856 process_ok("[% WHILE (foo = foo - 1) %][% END %]" => '');
857 process_ok("[% WHILE (foo = foo - 1) %][% foo %][% END %]" => '21', {foo => 3});
858 process_ok("[% WHILE foo %][% foo %][% foo = foo - 1 %][% END %]" => '321', {foo => 3});
859
860 process_ok("[% WHILE 1 %][% foo %][% foo = foo - 1 %][% LAST IF foo == 1 %][% END %]" => '32', {foo => 3});
861 process_ok("[% f = 10; WHILE f; f = f - 1 ; f ; END %]" => '9876543210');
862 process_ok("[% f = 10; WHILE f; f = f - 1 ; f ; END ; f %]" => '98765432100');
863 process_ok("[% f = 10; a = 2; WHILE f; f = f - 1 ; f ; a=3; END ; a%]" => '98765432103');
864
865 process_ok("[% f = 10; WHILE (g=f); f = f - 1 ; f ; END %]" => '9876543210');
866 process_ok("[% f = 10; WHILE (g=f); f = f - 1 ; f ; END ; f %]" => '98765432100');
867 process_ok("[% f = 10; a = 2; WHILE (g=f); f = f - 1 ; f ; a=3; END ; a%]" => '98765432103');
868 process_ok("[% f = 10; a = 2; WHILE (a=f); f = f - 1 ; f ; a=3; END ; a%]" => '98765432100');
869
870 ###----------------------------------------------------------------###
871 print "### STOP / RETURN / CLEAR ############################################\n";
872
873 process_ok("[% STOP %]" => '');
874 process_ok("One[% STOP %]Two" => 'One');
875 process_ok("[% BLOCK foo %]One[% STOP %]Two[% END %]First[% PROCESS foo %]Last" => 'FirstOne');
876 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% STOP %][% END %][% END %]" => '1');
877 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% STOP %][% END %][% f %][% END %]" => '');
878
879 process_ok("[% RETURN %]" => '');
880 process_ok("One[% RETURN %]Two" => 'One');
881 process_ok("[% BLOCK foo %]One[% RETURN %]Two[% END %]First[% PROCESS foo %]Last" => 'FirstOneLast');
882 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% RETURN %][% END %][% END %]" => '1');
883 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% RETURN %][% END %][% f %][% END %]" => '');
884
885 process_ok("[% CLEAR %]" => '');
886 process_ok("One[% CLEAR %]Two" => 'Two');
887 process_ok("[% BLOCK foo %]One[% CLEAR %]Two[% END %]First[% PROCESS foo %]Last" => 'FirstTwoLast');
888 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% CLEAR %][% END %][% END %]" => '23');
889 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% CLEAR %][% END %][% f %][% END %]" => '123');
890 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.last %][% CLEAR %][% END %][% END %]" => '');
891 process_ok("[% FOREACH f = [1..3] %][% IF loop.last %][% CLEAR %][% END %][% f %][% END %]" => '3');
892
893 ###----------------------------------------------------------------###
894 print "### post opererative directives ######################################\n";
895
896 process_ok("[% GET foo IF 1 %]" => '1', {foo => 1});
897 process_ok("[% f FOREACH f = [1..3] %]" => '123');
898
899 process_ok("2[% GET foo IF 1 IF 2 %]" => '21', {foo => 1}) if ! $is_tt;
900 process_ok("2[% GET foo IF 1 IF 0 %]" => '2', {foo => 1}) if ! $is_tt;
901 process_ok("[% f FOREACH f = [1..3] IF 1 %]" => '123') if ! $is_tt;
902 process_ok("[% f FOREACH f = [1..3] IF 0 %]" => '') if ! $is_tt;
903 process_ok("[% f FOREACH f = g FOREACH g = [1..3] %]" => '123') if ! $is_tt;
904 process_ok("[% f FOREACH f = g.a FOREACH g = [{a=>1}, {a=>2}, {a=>3}] %]" => '123') if ! $is_tt;
905 process_ok("[% f FOREACH f = a FOREACH [{a=>1}, {a=>2}, {a=>3}] %]" => '123') if ! $is_tt;
906
907 process_ok("[% FOREACH f = [1..3] IF 1 %]([% f %])[% END %]" => '(1)(2)(3)') if ! $is_tt;
908 process_ok("[% FOREACH f = [1..3] IF 0 %]([% f %])[% END %]" => '') if ! $is_tt;
909
910 process_ok("[% BLOCK bar %][% foo %][% foo = foo - 1 %][% END %][% PROCESS bar WHILE foo %]" => '321', {foo => 3});
911
912 ###----------------------------------------------------------------###
913 print "### capturing ########################################################\n";
914
915 process_ok("[% foo = BLOCK %]Hi[% END %][% foo %][% foo %]" => 'HiHi');
916 process_ok("[% BLOCK foo %]Hi[% END %][% bar = PROCESS foo %]-[% bar %]" => '-Hi');
917 process_ok("[% foo = IF 1 %]Hi[% END %][% foo %]" => 'Hi');
918
919 ###----------------------------------------------------------------###
920 print "### TAGS #############################################################\n";
921
922 process_ok("[% TAGS asp %]<% 1 + 2 %>" => 3);
923 process_ok("[% TAGS default %][% 1 + 2 %]" => 3);
924 process_ok("[% TAGS html %]<!-- 1 + 2 -->" => '3');
925 process_ok("[% TAGS mason %]<% 1 + 2 >" => 3);
926 process_ok("[% TAGS metatext %]%% 1 + 2 %%" => 3);
927 process_ok("[% TAGS php %]<? 1 + 2 ?>" => 3);
928 process_ok("[% TAGS star %][* 1 + 2 *]" => 3);
929 process_ok("[% TAGS template %][% 1 + 2 %]" => 3);
930 process_ok("[% TAGS template1 %][% 1 + 2 %]" => 3);
931 process_ok("[% TAGS template1 %]%% 1 + 2 %%" => 3);
932 process_ok("[% TAGS tt2 %][% 1 + 2 %]" => 3);
933
934 process_ok("[% TAGS html %] <!--- 1 + 2 -->" => '3');
935 process_ok("[% TAGS html %]<!-- 1 + 2 --->" => '3') if ! $is_tt;
936 process_ok("[% TAGS html %]<!-- 1 + 2 --->\n" => '3');
937 process_ok("[% BLOCK foo %][% TAGS html %]<!-- 1 + 2 --><!-- END --><!-- PROCESS foo --> <!-- 1 + 2 -->" => '3 3');
938 process_ok("[% BLOCK foo %][% TAGS html %]<!-- 1 + 2 -->[% END %][% PROCESS foo %] [% 1 + 2 %]" => '');
939
940 process_ok("[% TAGS <!-- --> %]<!-- 1 + 2 -->" => '3');
941
942 process_ok("[% TAGS [<] [>] %][<] 1 + 2 [>]" => 3);
943 process_ok("[% TAGS '[<]' '[>]' %][<] 1 + 2 [>]" => 3) if ! $is_tt;
944 process_ok("[% TAGS /[<]/ /[>]/ %]< 1 + 2 >" => 3) if ! $is_tt;
945 process_ok("[% TAGS ** ** %]** 1 + 2 **" => 3);
946 process_ok("[% TAGS '**' '**' %]** 1 + 2 **" => 3) if ! $is_tt;
947 process_ok("[% TAGS /**/ /**/ %]** 1 + 2 **" => "") if ! $is_tt;
948
949 process_ok("[% TAGS html --><!-- 1 + 2 -->" => '3') if ! $is_tt;
950 process_ok("[% TAGS html ; 7 --><!-- 1 + 2 -->" => '73') if ! $is_tt;
951 process_ok("[% TAGS html ; 7 %]<!-- 1 + 2 -->" => '') if ! $is_tt; # error - the old closing tag must come next
952
953 ###----------------------------------------------------------------###
954 print "### SWITCH / CASE ####################################################\n";
955
956 process_ok("[% SWITCH 1 %][% END %]hi" => 'hi');
957 process_ok("[% SWITCH 1 %][% CASE %]bar[% END %]hi" => 'barhi');
958 process_ok("[% SWITCH 1 %]Pre[% CASE %]bar[% END %]hi" => 'barhi');
959 process_ok("[% SWITCH 1 %][% CASE DEFAULT %]bar[% END %]hi" => 'barhi');
960 process_ok("[% SWITCH 1 %][% CASE 0 %]bar[% END %]hi" => 'hi');
961 process_ok("[% SWITCH 1 %][% CASE 1 %]bar[% END %]hi" => 'barhi');
962 process_ok("[% SWITCH 1 %][% CASE foo %][% CASE 1 %]bar[% END %]hi" => 'barhi');
963 process_ok("[% SWITCH 1 %][% CASE [1..10] %]bar[% END %]hi" => 'barhi');
964 process_ok("[% SWITCH 11 %][% CASE [1..10] %]bar[% END %]hi" => 'hi');
965
966 process_ok("[% SWITCH 1.0 %][% CASE [1..10] %]bar[% END %]hi" => 'barhi');
967 process_ok("[% SWITCH '1.0' %][% CASE [1..10] %]bar[% END %]hi" => 'barhi') if ! $is_tt;
968
969 ###----------------------------------------------------------------###
970 print "### TRY / THROW / CATCH / FINAL ######################################\n";
971
972 process_ok("[% TRY %][% END %]hi" => 'hi');
973 process_ok("[% TRY %]Foo[% END %]hi" => 'Foohi');
974 process_ok("[% TRY %]Foo[% THROW foo 'for fun' %]bar[% END %]hi" => '');
975 process_ok("[% TRY %]Foo[% THROW foo 'for fun' %]bar[% CATCH %][% END %]hi" => 'Foohi') if ! $is_tt;
976 process_ok("[% TRY %]Foo[% THROW foo 'for fun' %]bar[% CATCH %]there[% END %]hi" => 'Footherehi');
977 process_ok("[% TRY %]Foo[% THROW foo 'for fun' %]bar[% CATCH foo %]there[% END %]hi" => 'Footherehi');
978 process_ok("[% TRY %]Foo[% TRY %]Foo[% THROW foo 'for fun' %][% CATCH bar %]one[% END %][% CATCH %]two[% END %]hi" => 'FooFootwohi');
979 process_ok("[% TRY %]Foo[% TRY %]Foo[% THROW foo 'for fun' %][% CATCH bar %]one[% END %][% CATCH s %]two[% END %]hi" => '');
980 process_ok("[% TRY %]Foo[% THROW foo.bar 'for fun' %][% CATCH foo %]one[% CATCH foo.bar %]two[% END %]hi" => 'Footwohi');
981
982 process_ok("[% TRY %]Foo[% FINAL %]Bar[% END %]hi" => 'FooBarhi');
983 process_ok("[% TRY %]Foo[% THROW foo %][% FINAL %]Bar[% CATCH %]one[% END %]hi" => '');
984 process_ok("[% TRY %]Foo[% THROW foo %][% CATCH %]one[% FINAL %]Bar[% END %]hi" => 'FoooneBarhi');
985 process_ok("[% TRY %]Foo[% THROW foo %][% CATCH bar %]one[% FINAL %]Bar[% END %]hi" => '');
986
987 process_ok("[% TRY %][% THROW foo 'bar' %][% CATCH %][% error %][% END %]" => 'foo error - bar');
988 process_ok("[% TRY %][% THROW foo 'bar' %][% CATCH %][% error.type %][% END %]" => 'foo');
989 process_ok("[% TRY %][% THROW foo 'bar' %][% CATCH %][% error.info %][% END %]" => 'bar');
990 process_ok("[% TRY %][% THROW foo %][% CATCH %][% error.type %][% END %]" => 'undef');
991 process_ok("[% TRY %][% THROW foo %][% CATCH %][% error.info %][% END %]" => 'foo');
992
993 ###----------------------------------------------------------------###
994 print "### named args #######################################################\n";
995
996 process_ok("[% foo(bar = 'one', baz = 'two') %]" => "baronebaztwo",
997 {foo=>sub{my $n=$_[-1];join('',map{"$_$n->{$_}"} sort keys %$n)}});
998 process_ok("[%bar='ONE'%][% foo(\$bar = 'one') %]" => "ONEone",
999 {foo=>sub{my $n=$_[-1];join('',map{"$_$n->{$_}"} sort keys %$n)}});
1000
1001 ###----------------------------------------------------------------###
1002 print "### USE ##############################################################\n";
1003
1004 my @config_p = (PLUGIN_BASE => 'MyTestPlugin', LOAD_PERL => 1);
1005 process_ok("[% USE son_of_gun_that_does_not_exist %]one" => '', {tt_config => \@config_p});
1006 process_ok("[% USE Foo %]one" => 'one', {tt_config => \@config_p});
1007 process_ok("[% USE Foo2 %]one" => 'one', {tt_config => \@config_p});
1008 process_ok("[% USE Foo(bar = 'baz') %]one[% Foo.bar %]" => 'onebarbaz', {tt_config => \@config_p});
1009 process_ok("[% USE Foo2(bar = 'baz') %]one[% Foo2.bar %]" => 'onebarbaz', {tt_config => \@config_p});
1010 process_ok("[% USE Foo(bar = 'baz') %]one[% Foo.bar %]" => 'onebarbaz', {tt_config => \@config_p});
1011 process_ok("[% USE d = Foo(bar = 'baz') %]one[% d.bar %]" => 'onebarbaz', {tt_config => \@config_p});
1012 process_ok("[% USE d.d = Foo(bar = 'baz') %]one[% d.d.bar %]" => '', {tt_config => \@config_p});
1013
1014 process_ok("[% USE a(bar = 'baz') %]one[% a.seven %]" => '', {tt_config => [@config_p, PLUGINS => {a=>'Foo'}, ]});
1015 process_ok("[% USE a(bar = 'baz') %]one[% a.seven %]" => 'one7', {tt_config => [@config_p, PLUGINS => {a=>'Foo2'},]});
1016
1017 @config_p = (PLUGIN_BASE => ['NonExistant', 'MyTestPlugin'], LOAD_PERL => 1);
1018 process_ok("[% USE Foo %]one" => 'one', {tt_config => \@config_p});
1019
1020 ###----------------------------------------------------------------###
1021 print "### MACRO ############################################################\n";
1022
1023 process_ok("[% MACRO foo PROCESS bar %][% BLOCK bar %]Hi[% END %][% foo %]" => 'Hi');
1024 process_ok("[% MACRO foo BLOCK %]Hi[% END %][% foo %]" => 'Hi');
1025 process_ok("[% MACRO foo BLOCK %]Hi[% END %][% foo %]" => 'Hi');
1026 process_ok("[% MACRO foo(n) BLOCK %]Hi[% n %][% END %][% foo(2) %]" => 'Hi2');
1027 process_ok("[%n=1%][% MACRO foo(n) BLOCK %]Hi[% n %][% END %][% foo(2) %][%n%]" => 'Hi21');
1028 process_ok("[%n=1%][% MACRO foo BLOCK %]Hi[% n = 2%][% END %][% foo %][%n%]" => 'Hi1');
1029 process_ok("[% MACRO foo(n) FOREACH i=[1..n] %][% i %][% END %][% foo(3) %]" => '123');
1030
1031 process_ok('[% MACRO f BLOCK %]>[% TRY; f ; CATCH ; "caught" ; END %][% END %][% f %]' => '>>>caught', {tt_config => [MAX_MACRO_RECURSE => 3]}) if ! $is_tt;
1032
1033 ###----------------------------------------------------------------###
1034 print "### DEBUG ############################################################\n";
1035
1036 process_ok("\n\n[% one %]" => "\n\n\n## input text line 3 : [% one %] ##\nONE", {one=>'ONE', tt_config => ['DEBUG' => 8]});
1037 process_ok("[% one %]" => "\n## input text line 1 : [% one %] ##\nONE", {one=>'ONE', tt_config => ['DEBUG' => 8]});
1038 process_ok("[% one %]\n\n" => "(1)ONE\n\n", {one=>'ONE', tt_config => ['DEBUG' => 8, 'DEBUG_FORMAT' => '($line)']});
1039 process_ok("1\n2\n3[% one %]" => "1\n2\n3(3)ONE", {one=>'ONE', tt_config => ['DEBUG' => 8, 'DEBUG_FORMAT' => '($line)']});
1040 process_ok("[% one;\n one %]" => "(1)ONE(2)ONE", {one=>'ONE', tt_config => ['DEBUG' => 8,
1041 'DEBUG_FORMAT' => '($line)']}) if ! $is_tt;
1042 process_ok("[% DEBUG format '(\$line)' %][% one %]" => qr/\(1\)/, {one=>'ONE', tt_config => ['DEBUG' => 8]});
1043
1044 process_ok("[% TRY %][% abc %][% CATCH %][% error %][% END %]" => "undef error - abc is undefined\n", {tt_config => ['DEBUG' => 2]});
1045 process_ok("[% TRY %][% abc.def %][% CATCH %][% error %][% END %]" => "undef error - def is undefined\n", {abc => {}, tt_config => ['DEBUG' => 2]});
1046
1047 ###----------------------------------------------------------------###
1048 print "### constants ########################################################\n";
1049
1050 my @config_c = (
1051 CONSTANTS => {
1052 harry => sub {'do_this_once'},
1053 foo => {
1054 bar => {baz => 42},
1055 bim => 57,
1056 },
1057 bing => 'baz',
1058 bang => 'bim',
1059 },
1060 VARIABLES => {
1061 bam => 'bar',
1062 },
1063 );
1064 process_ok("[% constants.harry %]" => 'do_this_once', {constants => {harry => 'foo'}, tt_config => \@config_c});
1065 process_ok("[% constants.harry.length %]" => '12', {tt_config => \@config_c});
1066 process_ok("[% SET constants.something = 1 %][% constants.something %]one" => '1one', {tt_config => \@config_c});
1067 process_ok("[% SET constants.harry = 1 %][% constants.harry %]one" => 'do_this_onceone', {tt_config => \@config_c});
1068 process_ok("[% constants.foo.\${constants.bang} %]" => '57', {tt_config => [@config_c]});
1069 process_ok("[% constants.foo.\$bam.\${constants.bing} %]" => '42', {tt_config => [@config_c]}) if ! $is_tt;
1070 process_ok("[% bam = 'somethingelse' %][% constants.foo.\$bam.\${constants.bing} %]" => '42', {tt_config => [@config_c]}) if ! $is_tt;
1071
1072 process_ok('[% constants.${"harry"} %]' => 'do_this_once', {constants => {harry => 'foo'}, tt_config => \@config_c});
1073 process_ok('[% ${"constants"}.harry %]' => 'foo', {constants => {harry => 'foo'}, tt_config => \@config_c}) if ! $is_tt;
1074 process_ok('[% ${"constants"}.harry %]' => 'do_this_once', {constants => {harry => 'foo'}, tt_config => \@config_c}) if $is_tt;
1075 process_ok('[% ${"con${\\"s\\"}tants"}.harry %]' => 'foo', {constants => {harry => 'foo'}, tt_config => \@config_c}) if ! $is_tt;
1076
1077 ###----------------------------------------------------------------###
1078 print "### INTERPOLATE / ANYCASE / TRIM #####################################\n";
1079
1080 process_ok("Foo \$one Bar" => 'Foo ONE Bar', {one => 'ONE', tt_config => ['INTERPOLATE' => 1]});
1081 process_ok("[% PERL %] my \$n=7; print \$n [% END %]" => '7', {tt_config => ['INTERPOLATE' => 1, 'EVAL_PERL' => 1]});
1082 process_ok("[% TRY ; PERL %] my \$n=7; print \$n [% END ; END %]" => '7', {tt_config => ['INTERPOLATE' => 1, 'EVAL_PERL' => 1]});
1083
1084 process_ok("[% GET %]" => '', {GET => 'ONE'});
1085 process_ok("[% GET GET %]" => 'ONE', {GET => 'ONE'}) if ! $is_tt;
1086 process_ok("[% get one %]" => 'ONE', {one => 'ONE', tt_config => ['ANYCASE' => 1]});
1087 process_ok("[% get %]" => '', {get => 'ONE', tt_config => ['ANYCASE' => 1]});
1088 process_ok("[% get get %]" => 'ONE', {get => 'ONE', tt_config => ['ANYCASE' => 1]}) if ! $is_tt;
1089
1090 process_ok("[% BLOCK foo %]\nhi\n[% END %][% PROCESS foo %]" => "\nhi\n");
1091 process_ok("[% BLOCK foo %]\nhi[% END %][% PROCESS foo %]" => "hi", {tt_config => [TRIM => 1]});
1092 process_ok("[% BLOCK foo %]hi\n[% END %][% PROCESS foo %]" => "hi", {tt_config => [TRIM => 1]});
1093 process_ok("[% BLOCK foo %]hi[% nl %][% END %][% PROCESS foo %]" => "hi", {nl => "\n", tt_config => [TRIM => 1]});
1094 process_ok("[% BLOCK foo %][% nl %]hi[% END %][% PROCESS foo %]" => "hi", {nl => "\n", tt_config => [TRIM => 1]});
1095 process_ok("A[% TRY %]\nhi\n[% END %]" => "A\nhi", {tt_config => [TRIM => 1]});
1096
1097 ###----------------------------------------------------------------###
1098 print "### V1DOLLAR #########################################################\n";
1099
1100 process_ok('[% a %]|[% $a %]|[% ${ a } %]|[% ${ "a" } %]' => 'A|bar|bar|A', {a => 'A', A => 'bar'});
1101 process_ok('[% a %]|[% $a %]|[% ${ a } %]|[% ${ "a" } %]' => 'A|A|bar|A', {a => 'A', A => 'bar', tt_config => [V1DOLLAR => 1]});
1102
1103 $vars = {a => {b => {c=>'Cb'}, B => {c=>'CB'}}, b => 'B', Cb => 'bar', CB => 'Bar'};
1104 process_ok('[% a.b.c %]|[% $a.b.c %]|[% a.$b.c %]|[% ${ a.b.c } %]' => 'Cb||CB|bar', $vars);
1105 process_ok('[% a.b.c %]|[% $a.b.c %]|[% a.$b.c %]|[% ${ a.b.c } %]' => 'Cb|Cb|Cb|bar', {%$vars, tt_config => [V1DOLLAR => 1]});
1106
1107 process_ok('[% "$a" %]|$a|[% "${a}" %]|${a}' => 'A|$a|A|${a}', {a => 'A', A => 'bar'});
1108 process_ok('[% "$a" %]|$a|[% "${a}" %]|${a}' => 'A|$a|A|${a}', {a => 'A', A => 'bar', tt_config => [V1DOLLAR => 1]});
1109 process_ok('[% "$a" %]|$a|[% "${a}" %]|${a}' => 'A|A|A|A', {a => 'A', A => 'bar', tt_config => [INTERPOLATE => 1]});
1110 process_ok('[% "$a" %]|$a|[% "${a}" %]|${a}' => 'A|A|A|A', {a => 'A', A => 'bar', tt_config => [V1DOLLAR => 1, INTERPOLATE => 1]});
1111
1112 process_ok('[% constants.a %]|[% $constants.a %]|[% constants.$a %]' => 'A|A|A', {tt_config => [V1DOLLAR => 1, CONSTANTS => {a => 'A'}]});
1113
1114 ###----------------------------------------------------------------###
1115 print "### V2PIPE / V2EQUALS ################################################\n";
1116
1117 process_ok("[%- BLOCK a %]b is [% b %]
1118 [% END %]
1119 [%- PROCESS a b => 237 | repeat(2) %]" => "b is 237
1120 b is 237\n", {tt_config => [V2PIPE => 1]});
1121
1122 process_ok("[%- BLOCK a %]b is [% b %]
1123 [% END %]
1124 [%- PROCESS a b => 237 | repeat(2) %]" => "b is 237237\n") if ! $is_tt;
1125
1126 process_ok("[% ('a' == 'b') || 0 %]" => 0);
1127 process_ok("[% ('a' != 'b') || 0 %]" => 1);
1128 process_ok("[% ('a' == 'b') || 0 %]" => 0, {tt_config => [V2EQUALS => 1]}) if ! $is_tt;
1129 process_ok("[% ('a' != 'b') || 0 %]" => 1, {tt_config => [V2EQUALS => 1]}) if ! $is_tt;
1130 process_ok("[% ('a' == 'b') || 0 %]" => 1, {tt_config => [V2EQUALS => 0]}) if ! $is_tt;
1131 process_ok("[% ('a' != 'b') || 0 %]" => 0, {tt_config => [V2EQUALS => 0]}) if ! $is_tt;
1132 process_ok("[% ('7' == '7.0') || 0 %]" => 0);
1133 process_ok("[% ('7' == '7.0') || 0 %]" => 1, {tt_config => [V2EQUALS => 0]}) if ! $is_tt;
1134
1135 ###----------------------------------------------------------------###
1136 print "### configuration ####################################################\n";
1137
1138 process_ok('[% a = 7 %]$a' => 7, {tt_config => ['INTERPOLATE' => 1]});
1139 process_ok('[% a = 7 %]$a' => 7, {tt_config => ['interpolate' => 1]}) if ! $is_tt;
1140
1141 ###----------------------------------------------------------------###
1142 print "### PERL #############################################################\n";
1143
1144 process_ok("[% TRY %][% PERL %][% END %][% CATCH ; error; END %]" => 'perl error - EVAL_PERL not set');
1145 process_ok("[% PERL %] print \"[% one %]\" [% END %]" => 'ONE', {one => 'ONE', tt_config => ['EVAL_PERL' => 1]});
1146 process_ok("[% PERL %] print \$stash->get('one') [% END %]" => 'ONE', {one => 'ONE', tt_config => ['EVAL_PERL' => 1]});
1147 process_ok("[% PERL %] print \$stash->set('a.b.c', 7) [% END %][% a.b.c %]" => '77', {tt_config => ['EVAL_PERL' => 1]});
1148
1149 ###----------------------------------------------------------------###
1150 print "### recursion prevention #############################################\n";
1151
1152 process_ok("[% BLOCK foo %][% PROCESS bar %][% END %][% BLOCK bar %][% PROCESS foo %][% END %][% PROCESS foo %]" => '') if ! $is_tt;
1153
1154 ###----------------------------------------------------------------###
1155 print "### META #############################################################\n";
1156
1157 process_ok("[% template.name %]" => 'input text');
1158 process_ok("[% META foo = 'bar' %][% template.foo %]" => 'bar');
1159 process_ok("[% META name = 'bar' %][% template.name %]" => 'bar');
1160 process_ok("[% META foo = 'bar' %][% component.foo %]" => 'bar');
1161 process_ok("[% META foo = 'bar' %][% component = '' %][% component.foo %]|foo" => '|foo');
1162 process_ok("[% META foo = 'bar' %][% template = '' %][% template.foo %]|foo" => '|foo');
1163
1164 ###----------------------------------------------------------------###
1165 print "### references #######################################################\n";
1166
1167 process_ok("[% a=3; b=\\a; b; a %]" => 33);
1168 process_ok("[% a=3; b=\\a; a=7; b; a %]" => 77);
1169
1170 process_ok("[% a={}; a.1=7; b=\\a.1; b; a.1 %]" => '77');
1171 process_ok("[% a={}; a.1=7; b=\\a.20; a.20=7; b; a.20 %]" => '77');
1172
1173 process_ok("[% a=[]; a.1=7; b=\\a.1; b; a.1 %]" => '77');
1174 process_ok("[% a=[]; a.1=7; b=\\a.20; a.20=7; b; a.20 %]" => '77');
1175
1176 process_ok("[% \\a %]" => qr/^CODE/, {a => sub { return "a sub [@_]" } });
1177 process_ok("[% b=\\a; b %]" => 'a sub []', {a => sub { return "a sub [@_]" } });
1178 process_ok("[% b=\\a(1); b %]" => 'a sub [1]', {a => sub { return "a sub [@_]" } });
1179 process_ok("[% b=\\a; b(2) %]" => 'a sub [2]', {a => sub { return "a sub [@_]" } });
1180 process_ok("[% b=\\a(1); b(2) %]" => 'a sub [1 2]', {a => sub { return "a sub [@_]" } });
1181 process_ok("[% f=\\j.k; j.k=7; f %]" => '7', {j => {k => 3}});
1182
1183 process_ok('[% a = "a" ; f = {a=>"A",b=>"B"} ; foo = \f.$a ; foo %]' => 'A');
1184 process_ok('[% a = "a" ; f = {a=>"A",b=>"B"} ; foo = \f.$a ; a = "b" ; foo %]' => 'A');
1185 process_ok('[% a = "ab" ; f = "abcd"; foo = \f.replace(a, "-AB-") ; a = "cd"; foo %]' => '-AB-cd');
1186 process_ok('[% a = "ab" ; f = "abcd"; foo = \f.replace(a, "-AB-").replace("-AB-", "*") ; a = "cd"; foo %]' => '*cd');
1187
1188 process_ok('[% a = "ab" ; f = "abcd"; foo = \f.replace(a, "-AB-") ; f = "ab"; foo %]' => '-AB-cd');
1189 process_ok('[% a = "ab" ; f = "abcd"; foo = \f.replace(a, "-AB-").replace("-AB-", "*") ; f = "ab"; foo %]' => '*cd');
1190
1191 ###----------------------------------------------------------------###
1192 print "### reserved words ###################################################\n";
1193
1194 $vars = {
1195 GET => 'named_get',
1196 get => 'lower_named_get',
1197 named_get => 'value of named_get',
1198 hold_get => 'GET',
1199 };
1200 process_ok("[% GET %]" => '', $vars);
1201 process_ok("[% GET GET %]" => 'named_get', $vars) if ! $is_tt;
1202 process_ok("[% GET get %]" => 'lower_named_get', $vars);
1203 process_ok("[% GET \${'GET'} %]" => 'bar', {GET => 'bar'});
1204
1205 process_ok("[% GET = 1 %][% GET GET %]" => '', $vars);
1206 process_ok("[% SET GET = 1 %][% GET GET %]" => '1', $vars) if ! $is_tt;
1207
1208 process_ok("[% GET \$hold_get %]" => 'named_get', $vars);
1209 process_ok("[% GET \$GET %]" => 'value of named_get', $vars) if ! $is_tt;
1210 process_ok("[% BLOCK GET %]hi[% END %][% PROCESS GET %]" => 'hi') if ! $is_tt;
1211 process_ok("[% BLOCK foo %]hi[% END %][% PROCESS foo a = GET %]" => 'hi', $vars) if ! $is_tt;
1212 process_ok("[% BLOCK foo %]hi[% END %][% PROCESS foo GET = 1 %]" => '');
1213 process_ok("[% BLOCK foo %]hi[% END %][% PROCESS foo IF GET %]" => 'hi', $vars) if ! $is_tt;
1214
1215 ###----------------------------------------------------------------###
1216 print "### embedded items ###################################################\n";
1217
1218 process_ok('[% " \" " %]' => ' " ');
1219 process_ok('[% " \$foo " %]' => ' $foo ');
1220 process_ok('[% " \${foo} " %]' => ' ${foo} ');
1221 process_ok('[% " \n " %]' => " \n ");
1222 process_ok('[% " \t " %]' => " \t ");
1223 process_ok('[% " \r " %]' => " \r ");
1224
1225 process_ok("[% 'foo\\'bar' %]" => "foo'bar");
1226 process_ok('[% "foo\\"bar" %]' => 'foo"bar');
1227 process_ok('[% qw(foo \)).1 %]' => ')') if ! $is_tt;
1228 process_ok('[% qw|foo \||.1 %]' => '|') if ! $is_tt;
1229
1230 process_ok("[% ' \\' ' %]" => " ' ");
1231 process_ok("[% ' \\r ' %]" => ' \r ');
1232 process_ok("[% ' \\n ' %]" => ' \n ');
1233 process_ok("[% ' \\t ' %]" => ' \t ');
1234 process_ok("[% ' \$foo ' %]" => ' $foo ');
1235
1236 process_ok('[% A = "bar" ; ${ "A" } %]' => 'bar');
1237 process_ok('[% A = "bar" ; "(${ A })" %]' => '(bar)');
1238 process_ok('[% A = "bar" ; ${ {a => "A"}.a } %]' => 'bar') if ! $is_tt;
1239 process_ok('[% A = "bar" ; "(${ {a => \"A\"\\}.a })" %]' => '(A)') if ! $is_tt;
1240 process_ok('[% A = "bar" ; "(${ \\${ {a => \"A\"\\}.a \\} })" %]' => '(bar)') if ! $is_tt;
1241 process_ok('[% A = "bar" %](${ {a => \"A\"\\}.a })' => '(A)', {tt_config => [INTERPOLATE => 1]}) if ! $is_tt;
1242 process_ok('[% A = "bar" %](${ \\${ {a => \"A\"\\}.a \\} })' => '(bar)', {tt_config => [INTERPOLATE => 1]}) if ! $is_tt;
1243
1244 process_ok('[% "[%" %]' => '[%') if ! $is_tt;
1245 process_ok('[% "%]" %]' => '%]') if ! $is_tt;
1246 process_ok('[% a = "[% %]" %][% a %]' => '[% %]') if ! $is_tt;
1247 process_ok('[% "[% 1 + 2 %]" | eval %]' => '3') if ! $is_tt;
1248
1249 process_ok('[% qw([% 1 + 2 %]).join %]' => '[% 1 + 2 %]') if ! $is_tt;
1250 process_ok('[% qw([% 1 + 2 %]).join.eval %]' => '3') if ! $is_tt;
1251
1252 process_ok('[% f = ">[% TRY; f.eval ; CATCH; \'caught\' ; END %]"; f.eval %]' => '>>>>>caught', {tt_config => [MAX_EVAL_RECURSE => 5]}) if ! $is_tt;
1253 process_ok('[% f = ">[% TRY; f.eval ; CATCH; \'foo\' ; END %]"; f.eval;f.eval %]' => '>>foo>>foo', {tt_config => [MAX_EVAL_RECURSE => 2]}) if ! $is_tt;
1254
1255 ###----------------------------------------------------------------###
1256 print "### DUMP #############################################################\n";
1257
1258 if (! $is_tt) {
1259 local $ENV{'REQUEST_METHOD'} = 0;
1260 process_ok("[% DUMP a %]" => "DUMP: File \"input text\" line 1\n a = undef;\n");
1261 process_ok("[% p = DUMP a; p.collapse %]" => 'DUMP: File "input text" line 1 a = undef;');
1262 process_ok("[% p = DUMP a; p.collapse %]" => 'DUMP: File "input text" line 1 a = \'s\';', {a => "s"});
1263 process_ok("[%\n p = DUMP a; p.collapse %]" => 'DUMP: File "input text" line 2 a = \'s\';', {a => "s"});
1264 process_ok("[% p = DUMP a, b; p.collapse %]" => 'DUMP: File "input text" line 1 a, b = [ \'s\', undef ];', {a => "s"});
1265 process_ok("[% p = DUMP a Useqq => 'b'; p.collapse %]" => 'DUMP: File "input text" line 1 a Useqq => \'b\' = [ \'s\', { \'Useqq\' => \'b\' } ];', {a => "s"});
1266 process_ok("[% p = DUMP a; p.collapse %]" => 'DUMP: File "input text" line 1 a = "s";', {a => "s", tt_config => [DUMP => {Useqq => 1}]});
1267 process_ok("[% p = DUMP a; p.collapse %]|foo" => '|foo', {a => "s", tt_config => [DUMP => 0]});
1268 process_ok("[% p = DUMP _a, b; p.collapse %]" => 'DUMP: File "input text" line 1 _a, b = [ undef, \'c\' ];', {_a => "s", b=> "c"});
1269 process_ok("[% p = DUMP {a => 'b'}; p.collapse %]" => 'DUMP: File "input text" line 1 {a => \'b\'} = { \'a\' => \'b\' };');
1270 process_ok("[% p = DUMP _a; p.collapse %]" => 'DUMP: File "input text" line 1 _a = undef;', {_a => "s"});
1271 process_ok("[% p = DUMP a; p.collapse %]" => 'DUMP: File "input text" line 1 a = { \'b\' => \'c\' };', {a => {b => 'c'}});
1272 process_ok("[% p = DUMP a; p.collapse %]" => 'DUMP: File "input text" line 1 a = {};', {a => {_b => 'c'}});
1273 process_ok("[% p = DUMP a; p.collapse %]" => 'DUMP: File "input text" line 1 a = {};', {a => {_b => 'c'}, tt_config => [DUMP => {Sortkeys => 1}]});
1274 process_ok("[% p = DUMP a; p.collapse %]" => 'DUMP: File "input text" line 1 Dump(7)', {a => 7, tt_config => [DUMP => {handler=>sub {"Dump(@_)"}}]});
1275 process_ok("[% p = DUMP a; p.collapse %]" => 'a = \'s\';', {a => "s", tt_config => [DUMP => {header => 0}]});
1276 process_ok("[% p = DUMP a; p.collapse %]" => '<pre>a = &apos;s&apos;; </pre>', {a => "s", tt_config => [DUMP => {header => 0, html => 1}]});
1277 local $ENV{'REQUEST_METHOD'} = 1;
1278 process_ok("[% p = DUMP a; p.collapse %]" => '<pre>a = &apos;s&apos;; </pre>', {a => "s", tt_config => [DUMP => {header => 0}]});
1279 process_ok("[% p = DUMP a; p.collapse %]" => 'a = \'s\';', {a => "s", tt_config => [DUMP => {header => 0, html => 0}]});
1280 local $ENV{'REQUEST_METHOD'} = 0;
1281 process_ok("[% SET global; p = DUMP; p.collapse %]" => "DUMP: File \"input text\" line 1 EntireStash = { 'a' => 'b', 'global' => undef };", {a => 'b', tt_config => [DUMP => {Sortkeys => 1}]});
1282 process_ok("[% SET global; p = DUMP; p.collapse %]" => "DUMP: File \"input text\" line 1 EntireStash = { 'a' => 'b', 'global' => undef };", {a => 'b', tt_config => [DUMP => {Sortkeys => 1, EntireStash => 1}]});
1283 process_ok("[% SET global; p = DUMP; p.collapse %]" => "DUMP: File \"input text\" line 1", {a => 'b', tt_config => [DUMP => {Sortkeys => 1, EntireStash => 0}]});
1284 }
1285
1286 ###----------------------------------------------------------------###
1287 print "### SYNTAX ###########################################################\n";
1288
1289 if (! $is_tt) {
1290 process_ok("[%- BLOCK a %]b is [% b %][% END %][% PROCESS a b => 237 | repeat(2) %]" => "", {tt_config => [SYNTAX => 'garbage']});
1291 process_ok("[%- BLOCK a %]b is [% b %][% END %][% PROCESS a b => 237 | repeat(2) %]" => "b is 237237");
1292 process_ok("[%- BLOCK a %]b is [% b %][% END %][% PROCESS a b => 237 | repeat(2) %]" => "b is 237237", {tt_config => [SYNTAX => 'cet']});
1293 process_ok("[%- BLOCK a %]b is [% b %][% END %][% PROCESS a b => 237 | repeat(2) %]" => "b is 237237", {tt_config => [SYNTAX => 'tt3']});
1294 process_ok("[%- BLOCK a %]b is [% b %][% END %][% PROCESS a b => 237 | repeat(2) %]" => "b is 237b is 237", {tt_config => [SYNTAX => 'tt2']});
1295 process_ok("[%- BLOCK a %]b is [% b %][% END %][% PROCESS a b => 237 | repeat(2) %]" => "b is 237b is 237", {tt_config => [SYNTAX => 'tt1']});
1296 process_ok("[%- BLOCK a %]b is [% b %][% END %][% PROCESS a b => 237 | repeat(2) %]" => "b is 237b is 237", {tt_config => [SYNTAX => 'tt1']});
1297
1298
1299 process_ok('[% a %]|[% $a %]|[% ${ a } %]|[% ${ "a" } %]' => 'A|bar|bar|A', {a => 'A', A => 'bar'});
1300 process_ok('[% a %]|[% $a %]|[% ${ a } %]|[% ${ "a" } %]' => 'A|bar|bar|A', {a => 'A', A => 'bar', tt_config => [SYNTAX => 'tt2']});
1301 process_ok('[% a %]|[% $a %]|[% ${ a } %]|[% ${ "a" } %]' => 'A|A|bar|A', {a => 'A', A => 'bar', tt_config => [SYNTAX => 'tt1']});
1302
1303 process_ok("<TMPL_VAR name=foo>" => "FOO", {foo => "FOO", tt_config => [SYNTAX => 'ht']});
1304 process_ok("<TMPL_VAR EXPR='sprintf(\"%d %d\", 7, 8)'>" => "7 8", {tt_config => [SYNTAX => 'hte']});
1305 process_ok("<TMPL_VAR EXPR='7 == \"7.0\"'>" => "1", {tt_config => [SYNTAX => 'hte']});
1306 process_ok("<TMPL_VAR EXPR='\"a\" == \"b\"'>" => "1", {tt_config => [SYNTAX => 'hte']});
1307 process_ok("<TMPL_VAR EXPR='sprintf(\"%d %d\", 7, 8)'>d" => "", {tt_config => [SYNTAX => 'ht']});
1308
1309 process_ok("[% \"<TMPL_VAR EXPR='1+2+3'>\"|eval('hte') %] = [% 6 %]" => "6 = 6");
1310 process_ok("[% \"<TMPL_VAR EXPR='1+2+3'>\"|eval('ht') %] = [% 6 %]" => "");
1311
1312 }
1313
1314 ###----------------------------------------------------------------###
1315 print "### CONFIG ############################################################\n";
1316
1317 if (! $is_tt) {
1318 process_ok("[% CONFIG ANYCASE => 1 %][% get 234 %]" => 234);
1319 process_ok("[% CONFIG anycase => 1 %][% get 234 %]" => 234);
1320 process_ok("[% CONFIG PRE_CHOMP => '-' %]\n[% 234 %]" => 234);
1321 process_ok("[% CONFIG POST_CHOMP => '-' %][% 234 %]\n" => 234);
1322 process_ok("[% CONFIG INTERPOLATE => '-' %]\${ 234 }" => 234);
1323 process_ok("[% CONFIG V1DOLLAR => 1 %][% a = 234 %][% \$a %]" => 234);
1324 process_ok("[% CONFIG V2PIPE => 1 %][% BLOCK a %]b is [% b %][% END %][% PROCESS a b => 234 | repeat(2) %]" => "b is 234b is 234");
1325 process_ok("[% CONFIG V2EQUALS => 1 %][% ('7' == '7.0') || 0 %]" => 0);
1326 process_ok("[% CONFIG V2EQUALS => 0 %][% ('7' == '7.0') || 0 %]" => 1);
1327
1328 process_ok("[% CONFIG BOGUS => 2 %]bar" => '');
1329
1330 process_ok("[% CONFIG ANYCASE %]|[% CONFIG ANYCASE => 1 %][% CONFIG ANYCASE %]" => 'CONFIG ANYCASE = undef|CONFIG ANYCASE = 1');
1331 process_ok("[% CONFIG ANYCASE %]|[% CONFIG ANYCASE => 1 %][% CONFIG ANYCASE %]" => 'CONFIG ANYCASE = undef|CONFIG ANYCASE = 1');
1332
1333 process_ok("[% \"[% GET 1+2+3 %]\" | eval %] = [% get 6 %]" => "", {tt_config => [SEMICOLONS => 1]}) if ! $is_tt;
1334 process_ok("[% CONFIG ANYCASE => 1 %][% get 6 %]" => "6", {tt_config => [SEMICOLONS => 1]}) if ! $is_tt;
1335 process_ok("[% CONFIG ANYCASE => 1 %][% \"[% get 1+2+3 %]\" | eval %] = [% get 6 %]" => "6 = 6", {tt_config => [SEMICOLONS => 1]}) if ! $is_tt;
1336 process_ok("[% \"[% CONFIG ANYCASE => 1 %][% get 1+2+3 %]\" | eval %] = [% get 6 %]" => "", {tt_config => [SEMICOLONS => 1]}) if ! $is_tt;
1337 process_ok("[% \"[% CONFIG ANYCASE => 1 %][% get 1+2+3 %]\" | eval %] = [% GET 6 %]" => "6 = 6", {tt_config => [SEMICOLONS => 1]}) if ! $is_tt;
1338 process_ok("[% CONFIG SYNTAX => 'hte' %][% \"<TMPL_VAR EXPR='1+2+3'>\"|eval %] = [% 6 %]" => "6 = 6");
1339
1340 process_ok("[% CONFIG DUMP %]|[% CONFIG DUMP => 0 %][% DUMP %]bar" => 'CONFIG DUMP = undef|bar');
1341 process_ok("[% CONFIG DUMP => {Useqq=>1, header=>0, html=>0} %][% DUMP 'foo' %]" => "'foo' = \"foo\";\n");
1342 process_ok("[% CONFIG VMETHOD_FUNCTIONS => 0 %][% sprintf('%d %d', 7, 8) %] d" => ' d');
1343 }
1344
1345 ###----------------------------------------------------------------###
1346 print "### DONE #############################################################\n";
This page took 0.103706 seconds and 4 git commands to generate.