]> Dogcows Code - chaz/p5-CGI-Ex/blob - t/7_template_00_base.t
CGI::Ex 2.08
[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 0m1.243s #user 0m0.695s #sys 0m0.018s
12 #$module = 'Template'; #real 0m2.329s #user 0m1.466s #sys 0m0.021s
13 $is_tt = $module eq 'Template';
14 };
15
16 use strict;
17 use Test::More tests => 521 - ($is_tt ? 109 : 0);
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 $obj = shift || $module->new(@{ $vars->{tt_config} || [] }); # new object each time
32 my $out = '';
33
34 Taint::Runtime::taint(\$str) if test_taint;
35
36 $obj->process(\$str, $vars, \$out);
37 my $ok = ref($test) ? $out =~ $test : $out eq $test;
38 ok($ok, "\"$str\" => \"$out\"" . ($ok ? '' : " - should've been \"$test\""));
39 my $line = (caller)[2];
40 warn "# process_ok called at line $line.\n" if ! $ok;
41 print $obj->error if ! $ok && $obj->can('error');
42 print Dumper $obj->parse_tree(\$str) if ! $ok && $obj->can('parse_tree');
43 exit if ! $ok;
44 }
45
46 ###----------------------------------------------------------------###
47
48 ### set up some dummy packages for various tests
49 {
50 package MyTestPlugin::Foo;
51 $INC{'MyTestPlugin/Foo.pm'} = $0;
52 sub load { $_[0] }
53 sub new {
54 my $class = shift;
55 my $context = shift; # note the plugin style object that needs to shift off context
56 my $args = shift || {};
57 return bless $args, $class;
58 }
59 sub bar { my $self = shift; return join('', map {"$_$self->{$_}"} sort keys %$self) }
60 sub seven { 7 }
61 sub many { return 1, 2, 3 }
62 sub echo { my $self = shift; $_[0] }
63 }
64 {
65 package Foo2;
66 $INC{'Foo2.pm'} = $0;
67 use base qw(MyTestPlugin::Foo);
68 use vars qw($AUTOLOAD);
69 sub new {
70 my $class = shift;
71 my $args = shift || {}; # note - no plugin context
72 return bless $args, $class;
73 }
74 sub leave {} # hacks to allow tt to do the plugins passed via PLUGINS
75 sub delocalise {} # hacks to allow tt to do the plugins passed via PLUGINS
76 }
77
78 my $obj = Foo2->new;
79
80
81 ###----------------------------------------------------------------###
82 ### variable GETting
83
84 process_ok("[% foo %]" => "");
85 process_ok("[% foo %]" => "7", {foo => 7});
86 process_ok("[% foo %]" => "7", {tt_config => [VARIABLES => {foo => 7}]});
87 process_ok("[% foo %]" => "7", {tt_config => [PRE_DEFINE => {foo => 7}]});
88 process_ok("[% foo %][% foo %][% foo %]" => "777", {foo => 7});
89 process_ok("[% foo() %]" => "7", {foo => 7});
90 process_ok("[% foo.bar %]" => "");
91 process_ok("[% foo.bar %]" => "", {foo => {}});
92 process_ok("[% foo.bar %]" => "7", {foo => {bar => 7}});
93 process_ok("[% foo().bar %]" => "7", {foo => {bar => 7}});
94 process_ok("[% foo.0 %]" => "7", {foo => [7, 2, 3]});
95 process_ok("[% foo.10 %]" => "", {foo => [7, 2, 3]});
96 process_ok("[% foo %]" => 7, {foo => sub { 7 }});
97 process_ok("[% foo(7) %]" => 7, {foo => sub { $_[0] }});
98 process_ok("[% foo.length %]" => 1, {foo => sub { 7 }});
99 process_ok("[% foo.0 %]" => 7, {foo => sub { return 7, 2, 3 }});
100 process_ok("[% foo(bar) %]" => 7, {foo => sub { $_[0] }, bar => 7});
101 process_ok("[% foo.seven %]" => 7, {foo => $obj});
102 process_ok("[% foo.seven() %]" => 7, {foo => $obj});
103 process_ok("[% foo.seven.length %]" => 1, {foo => $obj});
104 process_ok("[% foo.echo(7) %]" => 7, {foo => $obj});
105 process_ok("[% foo.many.0 %]" => 1, {foo => $obj});
106 process_ok("[% foo.many.10 %]" => '',{foo => $obj});
107 process_ok("[% foo.nomethod %]" => '',{foo => $obj});
108 process_ok("[% foo.nomethod.0 %]" => '',{foo => $obj});
109
110 process_ok("[% GET foo %]" => "");
111 process_ok("[% GET foo %]" => "7", {foo => 7});
112 process_ok("[% GET foo.bar %]" => "");
113 process_ok("[% GET foo.bar %]" => "", {foo => {}});
114 process_ok("[% GET foo.bar %]" => "7", {foo => {bar => 7}});
115 process_ok("[% GET foo.0 %]" => "7", {foo => [7, 2, 3]});
116 process_ok("[% GET foo %]" => 7, {foo => sub { 7 }});
117 process_ok("[% GET foo(7) %]" => 7, {foo => sub { $_[0] }});
118
119 process_ok("[% \$name %]" => "", {name => 'foo'});
120 process_ok("[% \$name %]" => "7", {name => 'foo', foo => 7});
121 process_ok("[% \$name.bar %]" => "", {name => 'foo'});
122 process_ok("[% \$name.bar %]" => "", {name => 'foo', foo => {}});
123 process_ok("[% \$name.bar %]" => "7", {name => 'foo', foo => {bar => 7}});
124 process_ok("[% \$name().bar %]" => "7", {name => 'foo', foo => {bar => 7}});
125 process_ok("[% \$name.0 %]" => "7", {name => 'foo', foo => [7, 2, 3]});
126 process_ok("[% \$name %]" => 7, {name => 'foo', foo => sub { 7 }});
127 process_ok("[% \$name(7) %]" => 7, {name => 'foo', foo => sub { $_[0] }});
128
129 process_ok("[% GET \$name %]" => "", {name => 'foo'});
130 process_ok("[% GET \$name %]" => "7", {name => 'foo', foo => 7});
131 process_ok("[% GET \$name.bar %]" => "", {name => 'foo'});
132 process_ok("[% GET \$name.bar %]" => "", {name => 'foo', foo => {}});
133 process_ok("[% GET \$name.bar %]" => "7", {name => 'foo', foo => {bar => 7}});
134 process_ok("[% GET \$name.0 %]" => "7", {name => 'foo', foo => [7, 2, 3]});
135 process_ok("[% GET \$name %]" => 7, {name => 'foo', foo => sub { 7 }});
136 process_ok("[% GET \$name(7) %]" => 7, {name => 'foo', foo => sub { $_[0] }});
137
138 process_ok("[% \$name %]" => "", {name => 'foo foo', foo => 7});
139 process_ok("[% GET \$name %]" => "", {name => 'foo foo', foo => 7});
140
141 process_ok("[% \${name} %]" => "", {name => 'foo'});
142 process_ok("[% \${name} %]" => "7", {name => 'foo', foo => 7});
143 process_ok("[% \${name}.bar %]" => "", {name => 'foo'});
144 process_ok("[% \${name}.bar %]" => "", {name => 'foo', foo => {}});
145 process_ok("[% \${name}.bar %]" => "7", {name => 'foo', foo => {bar => 7}});
146 process_ok("[% \${name}().bar %]" => "7", {name => 'foo', foo => {bar => 7}});
147 process_ok("[% \${name}.0 %]" => "7", {name => 'foo', foo => [7, 2, 3]});
148 process_ok("[% \${name} %]" => 7, {name => 'foo', foo => sub { 7 }});
149 process_ok("[% \${name}(7) %]" => 7, {name => 'foo', foo => sub { $_[0] }});
150
151 process_ok("[% GET \${name} %]" => "", {name => 'foo'});
152 process_ok("[% GET \${name} %]" => "7", {name => 'foo', foo => 7});
153 process_ok("[% GET \${name}.bar %]" => "", {name => 'foo'});
154 process_ok("[% GET \${name}.bar %]" => "", {name => 'foo', foo => {}});
155 process_ok("[% GET \${name}.bar %]" => "7", {name => 'foo', foo => {bar => 7}});
156 process_ok("[% GET \${name}.0 %]" => "7", {name => 'foo', foo => [7, 2, 3]});
157 process_ok("[% GET \${name} %]" => 7, {name => 'foo', foo => sub { 7 }});
158 process_ok("[% GET \${name}(7) %]" => 7, {name => 'foo', foo => sub { $_[0] }});
159
160 process_ok("[% \${name} %]" => "", {name => 'foo foo', foo => 7});
161 process_ok("[% GET \${name} %]" => "", {name => 'foo foo', foo => 7});
162 process_ok("[% GET \${'foo'} %]" => 'bar', {foo => 'bar'});
163
164 process_ok("[% foo.\$name %]" => '', {name => 'bar'});
165 process_ok("[% foo.\$name %]" => 7, {name => 'bar', foo => {bar => 7}});
166 process_ok("[% foo.\$name.baz %]" => '', {name => 'bar', bar => {baz => 7}});
167
168 process_ok("[% \"hi\" %]" => 'hi');
169 process_ok("[% 'hi' %]" => 'hi');
170 process_ok("[% \"\$foo\" %]" => '7', {foo => 7});
171 process_ok("[% \"hi \$foo\" %]" => 'hi 7', {foo => 7});
172 process_ok("[% \"hi \${foo}\" %]" => 'hi 7', {foo => 7});
173 process_ok("[% 'hi \$foo' %]" => 'hi $foo', {foo => 7});
174 process_ok("[% 'hi \${foo}' %]" => 'hi ${foo}', {foo => 7});
175
176 process_ok("[% \"hi \${foo.seven}\" %]" => 'hi 7', {foo => $obj});
177 process_ok("[% \"hi \${foo.echo(7)}\" %]" => 'hi 7', {foo => $obj});
178
179 process_ok("[% _foo %]2" => '2', {_foo => 1});
180 process_ok("[% \$bar %]2" => '2', {_foo => 1, bar => '_foo'});
181 process_ok("[% __foo %]2" => '2', {__foo => 1});
182 process_ok("[% _foo = 1 %][% _foo %]2" => '2');
183 process_ok("[% foo._bar %]2" => '2', {foo => {_bar =>1}});
184
185 process_ok("[% qw/Foo Bar Baz/.0 %]" => 'Foo') if ! $is_tt;
186 process_ok('[% [0..10].-1 %]' => '10') if ! $is_tt;
187 process_ok('[% [0..10].${ 2.3 } %]' => '2') if ! $is_tt;
188
189 ###----------------------------------------------------------------###
190 ### variable SETting
191
192 process_ok("[% SET foo bar %][% foo %]" => '');
193 process_ok("[% SET foo = 1 %][% foo %]" => '1');
194 process_ok("[% SET foo = 1 bar = 2 %][% foo %][% bar %]" => '12');
195 process_ok("[% SET foo bar = 1 %][% foo %]" => '');
196 process_ok("[% SET foo = 1 ; bar = 1 %][% foo %]" => '1');
197 process_ok("[% SET foo = 1 %][% SET foo %][% foo %]" => '');
198
199 process_ok("[% SET foo = [] %][% foo.0 %]" => "");
200 process_ok("[% SET foo = [1, 2, 3] %][% foo.1 %]" => 2);
201 process_ok("[% SET foo = {} %][% foo.0 %]" => "");
202 process_ok("[% SET foo = {1 => 2} %][% foo.1 %]" => "2") if ! $is_tt;
203 process_ok("[% SET foo = {'1' => 2} %][% foo.1 %]" => "2");
204
205 process_ok("[% SET name = 1 %][% SET foo = name %][% foo %]" => "1");
206 process_ok("[% SET name = 1 %][% SET foo = \$name %][% foo %]" => "");
207 process_ok("[% SET name = 1 %][% SET foo = \${name} %][% foo %]" => "");
208 process_ok("[% SET name = 1 %][% SET foo = \"\$name\" %][% foo %]" => "1");
209 process_ok("[% SET name = 1 foo = name %][% foo %]" => '1');
210 process_ok("[% SET name = 1 %][% SET foo = {\$name => 2} %][% foo.1 %]" => "2");
211 process_ok("[% SET name = 1 %][% SET foo = {\"\$name\" => 2} %][% foo.1 %]" => "2") if ! $is_tt;
212 process_ok("[% SET name = 1 %][% SET foo = {\${name} => 2} %][% foo.1 %]" => "2");
213
214 process_ok("[% SET name = 7 %][% SET foo = {'2' => name} %][% foo.2 %]" => "7");
215 process_ok("[% SET name = 7 %][% SET foo = {'2' => \"\$name\"} %][% foo.2 %]" => "7");
216
217 process_ok("[% SET name = 7 %][% SET foo = [1, name, 3] %][% foo.1 %]" => "7");
218 process_ok("[% SET name = 7 %][% SET foo = [1, \"\$name\", 3] %][% foo.1 %]" => "7");
219
220 process_ok("[% SET foo = { bar => { baz => [0, 7, 2] } } %][% foo.bar.baz.1 %]" => "7");
221
222 process_ok("[% SET foo.bar = 1 %][% foo.bar %]" => '1');
223 process_ok("[% SET foo.bar.baz.bing = 1 %][% foo.bar.baz.bing %]" => '1');
224 process_ok("[% SET foo.bar.2 = 1 %][% foo.bar.2 %] [% foo.bar.size %]" => '1 1');
225 process_ok("[% SET foo.bar = [] %][% SET foo.bar.2 = 1 %][% foo.bar.2 %] [% foo.bar.size %]" => '1 3');
226
227 process_ok("[% SET name = 'two' %][% SET \$name = 3 %][% two %]" => 3);
228 process_ok("[% SET name = 'two' %][% SET \${name} = 3 %][% two %]" => 3);
229 process_ok("[% SET name = 2 %][% SET foo.\$name = 3 %][% foo.2 %]" => 3);
230 process_ok("[% SET name = 2 %][% SET foo.\$name = 3 %][% foo.\$name %]" => 3);
231 process_ok("[% SET name = 2 %][% SET foo.\${name} = 3 %][% foo.2 %]" => 3);
232 process_ok("[% SET name = 2 %][% SET foo.\${name} = 3 %][% foo.2 %]" => 3);
233 process_ok("[% SET name = 'two' %][% SET \$name.foo = 3 %][% two.foo %]" => 3);
234 process_ok("[% SET name = 'two' %][% SET \${name}.foo = 3 %][% two.foo %]" => 3);
235 process_ok("[% SET name = 'two' %][% SET foo.\$name.foo = 3 %][% foo.two.foo %]" => 3);
236 process_ok("[% SET name = 'two' %][% SET foo.\${name}.foo = 3 %][% foo.two.foo %]" => 3);
237
238 process_ok("[% SET foo = [1..10] %][% foo.6 %]" => 7);
239 process_ok("[% SET foo = [10..1] %][% foo.6 %]" => '');
240 process_ok("[% SET foo = [-10..-1] %][% foo.6 %]" => -4);
241 process_ok("[% SET foo = [1..10, 21..30] %][% foo.12 %]" => 23) if ! $is_tt;
242 process_ok("[% SET foo = [..100] bar = 7 %][% bar %][% foo.0 %]" => '');
243 process_ok("[% SET foo = [100..] bar = 7 %][% bar %][% foo.0 %]" => 7) if ! $is_tt;
244 process_ok("[% SET foo = ['a'..'z'] %][% foo.6 %]" => 'g');
245 process_ok("[% SET foo = ['z'..'a'] %][% foo.6 %]" => '');
246 process_ok("[% SET foo = ['a'..'z'].reverse %][% foo.6 %]" => 't') if ! $is_tt;
247
248 process_ok("[% foo = 1 %][% foo %]" => '1');
249 process_ok("[% foo = 1 ; bar = 2 %][% foo %][% bar %]" => '12');
250 process_ok("[% foo.bar = 2 %][% foo.bar %]" => '2');
251
252 process_ok('[% a = "a" %][% (b = a) %][% a %][% b %]' => 'aaa');
253 process_ok('[% a = "a" %][% (c = (b = a)) %][% a %][% b %][% c %]' => 'aaaa');
254
255 process_ok("[% a = qw{Foo Bar Baz} ; a.2 %]" => 'Baz') if ! $is_tt;
256
257 process_ok("[% foo = 1 bar = 2 %][% foo %][% bar %]" => '12');
258 process_ok("[% foo = 1 bar = 2 %][% foo = 3 bar %][% foo %][% bar %]" => '232') if ! $is_tt;
259 process_ok("[% a = 1 a = a + 2 a %]" => 3) if ! $is_tt;
260
261 ###----------------------------------------------------------------###
262 ### Reserved words
263
264 my $vars = {
265 GET => 'named_get',
266 get => 'lower_named_get',
267 named_get => 'value of named_get',
268 hold_get => 'GET',
269 };
270 process_ok("[% GET %]" => '', $vars);
271 process_ok("[% GET GET %]" => 'named_get', $vars) if ! $is_tt;
272 process_ok("[% GET get %]" => 'lower_named_get', $vars);
273 process_ok("[% GET \${'GET'} %]" => 'bar', {GET => 'bar'});
274
275 process_ok("[% GET = 1 %][% GET GET %]" => '', $vars);
276 process_ok("[% SET GET = 1 %][% GET GET %]" => '1', $vars) if ! $is_tt;
277
278 process_ok("[% GET \$hold_get %]" => 'named_get', $vars);
279 process_ok("[% GET \$GET %]" => 'value of named_get', $vars) if ! $is_tt;
280 process_ok("[% BLOCK GET %]hi[% END %][% PROCESS GET %]" => 'hi') if ! $is_tt;
281 process_ok("[% BLOCK foo %]hi[% END %][% PROCESS foo a = GET %]" => 'hi', $vars) if ! $is_tt;
282 process_ok("[% BLOCK foo %]hi[% END %][% PROCESS foo GET = 1 %]" => '');
283 process_ok("[% BLOCK foo %]hi[% END %][% PROCESS foo IF GET %]" => 'hi', $vars) if ! $is_tt;
284
285 ###----------------------------------------------------------------###
286 ### CALL and DEFAULT
287
288 process_ok("[% DEFAULT foo = 7 %][% foo %]" => 7);
289 process_ok("[% SET foo = 5 %][% DEFAULT foo = 7 %][% foo %]" => 5);
290 process_ok("[% DEFAULT foo.bar.baz.bing = 6 %][% foo.bar.baz.bing %]" => 6);
291
292 my $t = 0;
293 process_ok("[% foo %]" => 'hi', {foo => sub {$t++; 'hi'}});
294 process_ok("[% GET foo %]" => 'hi', {foo => sub {$t++; 'hi'}});
295 process_ok("[% CALL foo %]" => '', {foo => sub {$t++; 'hi'}});
296 ok($t == 3, "CALL method actually called var");
297
298 ###----------------------------------------------------------------###
299 ### virtual methods / filters
300
301 process_ok("[% [0 .. 10].reverse.1 %]" => 9) if ! $is_tt;
302 process_ok("[% {a => 'A'}.a %]" => 'A') if ! $is_tt;
303 process_ok("[% 'This is a string'.length %]" => 16) if ! $is_tt;
304 process_ok("[% 123.length %]" => 3) if ! $is_tt;
305 process_ok("[% 123.2.length %]" => 5) if ! $is_tt;
306 process_ok("[% -123.2.length %]" => -5) if ! $is_tt; # the - doesn't bind as tight as the dot methods
307 process_ok("[% (-123.2).length %]" => 6) if ! $is_tt;
308 process_ok("[% a = 23; a.0 %]" => 23) if ! $is_tt; # '0' is a scalar_op
309 process_ok('[% 1.rand %]' => qr/^0\.\d+(?:e-?\d+)?$/) if ! $is_tt;
310
311 process_ok("[% n.repeat %]" => '1', {n => 1}) if ! $is_tt; # tt2 virtual method defaults to 0
312 process_ok("[% n.repeat(0) %]" => '', {n => 1});
313 process_ok("[% n.repeat(1) %]" => '1', {n => 1});
314 process_ok("[% n.repeat(2) %]" => '11', {n => 1});
315 process_ok("[% n.repeat(2,'|') %]" => '1|1', {n => 1}) if ! $is_tt;
316
317 process_ok("[% n.size %]", => 'SIZE', {n => {size => 'SIZE', a => 'A'}});
318 process_ok("[% n|size %]", => '2', {n => {size => 'SIZE', a => 'A'}}) if ! $is_tt; # tt2 | is alias for FILTER
319
320 process_ok('[% foo | eval %]' => 'baz', {foo => '[% bar %]', bar => 'baz'});
321 process_ok('[% "1" | indent(2) %]' => ' 1');
322
323 process_ok("[% n.replace('foo', 'bar') %]" => 'barbar', {n => 'foofoo'});
324 process_ok("[% n.replace('(foo)', 'bar\$1') %]" => 'barfoobarfoo', {n => 'foofoo'}) if ! $is_tt;
325 process_ok("[% n.replace('foo', 'bar', 0) %]" => 'barfoo', {n => 'foofoo'}) if ! $is_tt;
326
327 process_ok("[% n FILTER size %]", => '1', {n => {size => 'SIZE', a => 'A'}}) if ! $is_tt; # tt2 doesn't have size
328
329 process_ok("[% n FILTER repeat %]" => '1', {n => 1});
330 process_ok("[% n FILTER repeat(0) %]" => '', {n => 1});
331 process_ok("[% n FILTER repeat(1) %]" => '1', {n => 1});
332 process_ok("[% n FILTER repeat(2) %]" => '11', {n => 1});
333 process_ok("[% n FILTER repeat(2,'|') %]" => '1|1', {n => 1}) if ! $is_tt;
334
335 process_ok("[% n FILTER echo = repeat(2) %][% n FILTER echo %]" => '1111', {n => 1});
336 process_ok("[% n FILTER echo = repeat(2) %][% n | echo %]" => '1111', {n => 1});
337 process_ok("[% n FILTER echo = repeat(2) %][% n|echo.length %]" => '112', {n => 1}) if ! $is_tt;
338 process_ok("[% n FILTER echo = repeat(2) %][% n FILTER \$foo %]" => '1111', {n => 1, foo => 'echo'});
339 process_ok("[% n FILTER echo = repeat(2) %][% n | \$foo %]" => '1111', {n => 1, foo => 'echo'});
340 process_ok("[% n FILTER echo = repeat(2) %][% n|\$foo.length %]" => '112', {n => 1, foo => 'echo'}) if ! $is_tt;
341
342 process_ok('[% "hi" FILTER $foo %]' => 'hihi', {foo => sub {sub {$_[0]x2}}}); # filter via a passed var
343 process_ok('[% FILTER $foo %]hi[% END %]' => 'hihi', {foo => sub {sub {$_[0]x2}}}); # filter via a passed var
344 process_ok('[% "hi" FILTER foo %]' => 'hihi', {tt_config => [FILTERS => {foo => sub {$_[0]x2}}]});
345 process_ok('[% "hi" FILTER foo %]' => 'hihi', {tt_config => [FILTERS => {foo => [sub {$_[0]x2},0]}]});
346 process_ok('[% "hi" FILTER foo(2) %]' => 'hihi', {tt_config => [FILTERS => {foo => [sub {my$a=$_[1];sub{$_[0]x$a}},1]}]});
347
348 process_ok('[% ["a".."z"].random %]' => qr/^[a-z]/) if ! $is_tt;
349 process_ok('[% ["a".."z"].${ 26.rand } %]' => qr/^[a-z]/) if ! $is_tt;
350
351 process_ok("[% ' ' | uri %]" => '%20');
352
353 process_ok('[% "one".fmt %]' => "one") if ! $is_tt;
354 process_ok('[% 2.fmt("%02d") %]' => "02") if ! $is_tt;
355
356 process_ok('[% [1..3].fmt %]' => "1 2 3") if ! $is_tt;
357 process_ok('[% [1..3].fmt("%02d") %]' => '01 02 03') if ! $is_tt;
358 process_ok('[% [1..3].fmt("%s", ", ") %]' => '1, 2, 3') if ! $is_tt;
359
360 process_ok('[% {a => "B", c => "D"}.fmt %]' => "a\tB\nc\tD") if ! $is_tt;
361 process_ok('[% {a => "B", c => "D"}.fmt("%s:%s") %]' => "a:B\nc:D") if ! $is_tt;
362 process_ok('[% {a => "B", c => "D"}.fmt("%s:%s", "; ") %]' => "a:B; c:D") if ! $is_tt;
363
364 process_ok('[% 1.format("%s") %]' => '1') if ! $is_tt;
365 process_ok('[% 1.format("%*s", 6) %]' => ' 1') if ! $is_tt;
366 process_ok('[% 1.format("%-*s", 6) %]' => '1 ') if ! $is_tt;
367
368 process_ok('[% 1.fmt("%-*s", 6) %]' => '1 ') if ! $is_tt;
369 process_ok('[% [1,2].fmt("%-*s", "|", 6) %]' => '1 |2 ') if ! $is_tt;
370 process_ok('[% {1=>2,3=>4}.fmt("%*s:%*s", "|", 3, 3) %]' => ' 1: 2| 3: 4') if ! $is_tt;
371
372 ###----------------------------------------------------------------###
373 ### virtual objects
374
375 process_ok('[% a = "foobar" %][% Text.length(a) %]' => 6) if ! $is_tt;
376 process_ok('[% a = [1 .. 10] %][% List.size(a) %]' => 10) if ! $is_tt;
377 process_ok('[% a = {a=>"A", b=>"B"} ; Hash.size(a) %]' => 2) if ! $is_tt;
378
379 process_ok('[% a = Text.new("This is a string") %][% a.length %]' => 16) if ! $is_tt;
380 process_ok('[% a = List.new("one", "two", "three") %][% a.size %]' => 3) if ! $is_tt;
381 process_ok('[% a = Hash.new("one", "ONE") %][% a.one %]' => 'ONE') if ! $is_tt;
382 process_ok('[% a = Hash.new(one = "ONE") %][% a.one %]' => 'ONE') if ! $is_tt;
383 process_ok('[% a = Hash.new(one => "ONE") %][% a.one %]' => 'ONE') if ! $is_tt;
384
385 process_ok('[% {a => 1, b => 2} | Hash.keys | List.join(", ") %]' => 'a, b') if ! $is_tt;
386
387 ###----------------------------------------------------------------###
388 ### chomping
389
390 process_ok(" [% foo %]" => ' ');
391 process_ok(" [%- foo %]" => '');
392 process_ok("\n[%- foo %]" => '');
393 process_ok("\n [%- foo %]" => '');
394 process_ok("\n\n[%- foo %]" => "\n");
395 process_ok(" \n\n[%- foo %]" => " \n");
396 process_ok(" \n[%- foo %]" => " ") if ! $is_tt;
397 process_ok(" \n \n[%- foo %]" => " \n ") if ! $is_tt;
398
399 process_ok("[% foo %] " => ' ');
400 process_ok("[% foo -%] " => ' ');
401 process_ok("[% foo -%]\n" => '');
402 process_ok("[% foo -%] \n" => '');
403 process_ok("[% foo -%]\n " => ' ');
404 process_ok("[% foo -%]\n\n\n" => "\n\n");
405 process_ok("[% foo -%] \n " => ' ');
406
407
408 ###----------------------------------------------------------------###
409 ### concat
410
411 process_ok('[% a = "foo"; a _ "bar" %]' => 'foobar');
412 process_ok('[% a = "foo"; a ~ "bar" %]' => 'foobar') if ! $is_tt;
413 process_ok('[% a = "foo"; a ~= "bar"; a %]' => 'foobar') if ! $is_tt;
414
415 ###----------------------------------------------------------------###
416 ### math operations
417
418 process_ok("[% 1 + 2 %]" => 3);
419 process_ok("[% 1 + 2 + 3 %]" => 6);
420 process_ok("[% (1 + 2) %]" => 3);
421 process_ok("[% 2 - 1 %]" => 1);
422 process_ok("[% -1 + 2 %]" => 1);
423 process_ok("[% -1+2 %]" => 1);
424 process_ok("[% 2 - 1 %]" => 1);
425 process_ok("[% 2-1 %]" => 1) if ! $is_tt;
426 process_ok("[% 2 - -1 %]" => 3);
427 process_ok("[% 4 * 2 %]" => 8);
428 process_ok("[% 4 / 2 %]" => 2);
429 process_ok("[% 10 / 3 %]" => qr/^3.333/);
430 process_ok("[% 10 div 3 %]" => '3');
431 process_ok("[% 2 ** 3 %]" => 8) if ! $is_tt;
432 process_ok("[% 1 + 2 * 3 %]" => 7);
433 process_ok("[% 3 * 2 + 1 %]" => 7);
434 process_ok("[% (1 + 2) * 3 %]" => 9);
435 process_ok("[% 3 * (1 + 2) %]" => 9);
436 process_ok("[% 1 + 2 ** 3 %]" => 9) if ! $is_tt;
437 process_ok("[% 2 * 2 ** 3 %]" => 16) if ! $is_tt;
438 process_ok("[% SET foo = 1 %][% foo + 2 %]" => 3);
439 process_ok("[% SET foo = 1 %][% (foo + 2) %]" => 3);
440
441 process_ok("[% a = 1; (a += 2) %]" => 3) if ! $is_tt;
442 process_ok("[% a = 1; (a -= 2) %]" => -1) if ! $is_tt;
443 process_ok("[% a = 4; (a /= 2) %]" => 2) if ! $is_tt;
444 process_ok("[% a = 1; (a *= 2) %]" => 2) if ! $is_tt;
445 process_ok("[% a = 3; (a **= 2) %]" => 9) if ! $is_tt;
446 process_ok("[% a = 1; (a %= 2) %]" => 1) if ! $is_tt;
447
448 process_ok('[% a += 1 %]-[% a %]-[% a += 1 %]-[% a %]' => '-1--2') if ! $is_tt;
449 process_ok('[% (a += 1) %]-[% (a += 1) %]' => '1-2') if ! $is_tt;
450
451 process_ok('[% a = 2; a -= 3; a %]' => '-1') if ! $is_tt;
452 process_ok('[% a = 2; a *= 3; a %]' => '6') if ! $is_tt;
453 process_ok('[% a = 2; a /= .5; a %]' => '4') if ! $is_tt;
454 process_ok('[% a = 8; a %= 3; a %]' => '2') if ! $is_tt;
455 process_ok('[% a = 2; a **= 3; a %]' => '8') if ! $is_tt;
456
457 process_ok('[% a = 1 %][% ++a %][% a %]' => '22') if ! $is_tt;
458 process_ok('[% a = 1 %][% a++ %][% a %]' => '12') if ! $is_tt;
459 process_ok('[% a = 1 %][% --a %][% a %]' => '00') if ! $is_tt;
460 process_ok('[% a = 1 %][% a-- %][% a %]' => '10') if ! $is_tt;
461 process_ok('[% a++ FOR [1..3] %]' => '012') if ! $is_tt;
462 process_ok('[% --a FOR [1..3] %]' => '-1-2-3') if ! $is_tt;
463
464 ###----------------------------------------------------------------###
465 ### boolean operations
466
467 process_ok("[% 5 && 6 %]" => 6);
468 process_ok("[% 5 || 6 %]" => 5);
469 process_ok("[% 0 || 6 %]" => 6);
470 process_ok("[% 0 && 6 %]" => 0);
471 process_ok("[% 0 && 0 %]" => 0);
472 process_ok("[% 5 && 6 && 7%]" => 7);
473 process_ok("[% 0 || 1 || 2 %]" => 1);
474
475 process_ok("[% 5 + (0 || 5) %]" => 10);
476
477
478 process_ok("[% 1 ? 2 : 3 %]" => '2');
479 process_ok("[% 0 ? 2 : 3 %]" => '3');
480 process_ok("[% 0 ? (1 ? 2 : 3) : 4 %]" => '4');
481 process_ok("[% 0 ? 1 ? 2 : 3 : 4 %]" => '4');
482
483 process_ok("[% t = 1 || 0 ? 3 : 4 %][% t %]" => 3);
484 process_ok("[% t = 0 or 1 ? 3 : 4 %][% t %]" => 3);
485 process_ok("[% t = 1 or 0 ? 3 : 4 %][% t %]" => 1) if ! $is_tt;
486
487 process_ok("[% 0 ? 2 : 3 %]" => '3');
488 process_ok("[% 1 ? 2 : 3 %]" => '2');
489 process_ok("[% 0 ? 1 ? 2 : 3 : 4 %]" => '4');
490 process_ok("[% t = 0 ? 1 ? [1..4] : [2..4] : [3..4] %][% t.0 %]" => '3');
491 process_ok("[% t = 1 || 0 ? 0 : 1 || 2 ? 2 : 3 %][% t %]" => '0');
492 process_ok("[% t = 0 or 0 ? 0 : 1 or 2 ? 2 : 3 %][% t %]" => '1') if ! $is_tt;
493 process_ok("[% t = 0 or 0 ? 0 : 0 or 2 ? 2 : 3 %][% t %]" => '2');
494
495 process_ok("[% 0 ? 1 ? 1 + 2 * 3 : 1 + 2 * 4 : 1 + 2 * 5 %]" => '11');
496
497 ###----------------------------------------------------------------###
498 ### blocks
499
500 process_ok("[% PROCESS foo %]" => '');
501 process_ok("[% BLOCK foo %]" => '');
502 process_ok("[% BLOCK foo %][% END %]" => '');
503 process_ok("[% BLOCK %][% END %]one" => 'one');
504 process_ok("[% BLOCK foo %]hi there[% END %]" => '');
505 process_ok("[% BLOCK foo %][% BLOCK foo %][% END %][% END %]" => '');
506 process_ok("[% BLOCK foo %]hi there[% END %][% PROCESS foo %]" => 'hi there');
507 process_ok("[% PROCESS foo %][% BLOCK foo %]hi there[% END %]" => 'hi there');
508 process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% PROCESS foo %]" => 'hi ONE there', {one => 'ONE'});
509 process_ok("[% BLOCK foo %]hi [% IF 1 %]Yes[% END %] there[% END %]<<[% PROCESS foo %]>>" => '<<hi Yes there>>');
510 process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% PROCESS foo one = 'two' %]" => 'hi two there');
511 process_ok("[% BLOCK foo %]hi [% one.two %] there[% END %][% PROCESS foo one.two = 'two' %]" => 'hi two there');
512 process_ok("[% BLOCK foo %]hi [% one.two %] there[% END %][% PROCESS foo + foo one.two = 'two' %]" => 'hi two there'x2);
513
514 process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% PROCESS foo one = 'two' %][% one %]" => 'hi two theretwo');
515 process_ok("[% BLOCK foo %]hi [% one %] there[% END %][% INCLUDE foo one = 'two' %][% one %]" => 'hi two there');
516
517 ###----------------------------------------------------------------###
518 ### if/unless/elsif/else
519
520 process_ok("[% IF 1 %]Yes[% END %]" => 'Yes');
521 process_ok("[% IF 0 %]Yes[% END %]" => '');
522 process_ok("[% IF 0 %]Yes[% ELSE %]No[% END %]" => 'No');
523 process_ok("[% IF 0 %]Yes[% ELSIF 1 %]No[% END %]" => 'No');
524 process_ok("[% IF 0 %]Yes[% ELSIF 0 %]No[% END %]" => '');
525 process_ok("[% IF 0 %]Yes[% ELSIF 0 %]No[% ELSE %]hmm[% END %]" => 'hmm');
526
527 process_ok("[% UNLESS 1 %]Yes[% END %]" => '');
528 process_ok("[% UNLESS 0 %]Yes[% END %]" => 'Yes');
529 process_ok("[% UNLESS 0 %]Yes[% ELSE %]No[% END %]" => 'Yes');
530 process_ok("[% UNLESS 1 %]Yes[% ELSIF 1 %]No[% END %]" => 'No');
531 process_ok("[% UNLESS 1 %]Yes[% ELSIF 0 %]No[% END %]" => '');
532 process_ok("[% UNLESS 1 %]Yes[% ELSIF 0 %]No[% ELSE %]hmm[% END %]" => 'hmm');
533
534 ###----------------------------------------------------------------###
535 ### comments
536
537 process_ok("[%# one %]" => '', {one => 'ONE'});
538 process_ok("[%#\n one %]" => '', {one => 'ONE'});
539 process_ok("[%-#\n one %]" => '', {one => 'ONE'}) if ! $is_tt;
540 process_ok("[% #\n one %]" => 'ONE', {one => 'ONE'});
541 process_ok("[%# BLOCK one %]" => '');
542 process_ok("[%# BLOCK one %]two" => 'two');
543 process_ok("[%# BLOCK one %]two[% END %]" => '');
544 process_ok("[%# BLOCK one %]two[% END %]three" => '');
545
546 ###----------------------------------------------------------------###
547 ### foreach, next, last
548
549 process_ok("[% FOREACH foo %]" => '');
550 process_ok("[% FOREACH foo %][% END %]" => '');
551 process_ok("[% FOREACH foo %]bar[% END %]" => '');
552 process_ok("[% FOREACH foo %]bar[% END %]" => 'bar', {foo => 1});
553 process_ok("[% FOREACH f IN foo %]bar[% f %][% END %]" => 'bar1bar2', {foo => [1,2]});
554 process_ok("[% FOREACH f = foo %]bar[% f %][% END %]" => 'bar1bar2', {foo => [1,2]});
555 process_ok("[% FOREACH f = [1,2] %]bar[% f %][% END %]" => 'bar1bar2');
556 process_ok("[% FOREACH f = [1..3] %]bar[% f %][% END %]" => 'bar1bar2bar3');
557 process_ok("[% FOREACH f = [{a=>'A'},{a=>'B'}] %]bar[% f.a %][% END %]" => 'barAbarB');
558 process_ok("[% FOREACH [{a=>'A'},{a=>'B'}] %]bar[% a %][% END %]" => 'barAbarB');
559 process_ok("[% FOREACH [{a=>'A'},{a=>'B'}] %]bar[% a %][% END %][% a %]" => 'barAbarB');
560 process_ok("[% FOREACH f = [1..3] %][% loop.count %]/[% loop.size %] [% END %]" => '1/3 2/3 3/3 ');
561 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% f %][% END %][% END %]" => '1');
562 process_ok("[% FOREACH f = [1..3] %][% IF loop.last %][% f %][% END %][% END %]" => '3');
563 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% NEXT %][% END %][% f %][% END %]" => '23');
564 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% LAST %][% END %][% f %][% END %]" => '');
565 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% NEXT %][% END %][% END %]" => '123');
566 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% LAST %][% END %][% END %]" => '1');
567
568 process_ok('[% a = ["Red", "Blue"] ; FOR [0..3] ; a.${ loop.index % a.size } ; END %]' => 'RedBlueRedBlue') if ! $is_tt;
569
570 ### TT is not consistent in what is localized - well it is documented
571 ### if you set a variable in the FOREACH tag, then nothing in the loop gets localized
572 ### if you don't set a variable - everything gets localized
573 process_ok("[% foo = 1 %][% FOREACH [1..10] %][% foo %][% foo = 2 %][% END %]" => '1222222222');
574 process_ok("[% f = 1 %][% FOREACH i = [1..10] %][% i %][% f = 2 %][% END %][% f %]" => '123456789102');
575 process_ok("[% f = 1 %][% FOREACH [1..10] %][% f = 2 %][% END %][% f %]" => '1');
576 process_ok("[% f = 1 %][% FOREACH f = [1..10] %][% f %][% END %][% f %]" => '1234567891010');
577 process_ok("[% FOREACH [1] %][% SET a = 1 %][% END %][% a %]" => '');
578 process_ok("[% a %][% FOREACH [1] %][% SET a = 1 %][% END %][% a %]" => '');
579 process_ok("[% a = 2 %][% FOREACH [1] %][% SET a = 1 %][% END %][% a %]" => '2');
580 process_ok("[% a = 2 %][% FOREACH [1] %][% a = 1 %][% END %][% a %]" => '2');
581 process_ok("[% a = 2 %][% FOREACH i = [1] %][% a = 1 %][% END %][% a %]" => '1');
582 process_ok("[% FOREACH i = [1] %][% SET a = 1 %][% END %][% a %]" => '1');
583 process_ok("[% f.b = 1 %][% FOREACH f.b = [1..10] %][% f.b %][% END %][% f.b %]" => '1234567891010') if ! $is_tt;
584 process_ok("[% a = 1 %][% FOREACH [{a=>'A'},{a=>'B'}] %]bar[% a %][% END %][% a %]" => 'barAbarB1');
585 process_ok("[% FOREACH [1..3] %][% loop.size %][% END %][% loop.size %]" => '333');
586 process_ok("[% FOREACH i = [1..3] %][% loop.size %][% END %][% loop.size %]" => '333') if ! $is_tt;
587 process_ok("[% FOREACH i = [1..3] %][% loop.size %][% END %][% loop.size %]" => '3331') if $is_tt;
588
589 ###----------------------------------------------------------------###
590 ### while
591
592 process_ok("[% WHILE foo %]" => '');
593 process_ok("[% WHILE foo %][% END %]" => '');
594 process_ok("[% WHILE (foo = foo - 1) %][% END %]" => '');
595 process_ok("[% WHILE (foo = foo - 1) %][% foo %][% END %]" => '21', {foo => 3});
596 process_ok("[% WHILE foo %][% foo %][% foo = foo - 1 %][% END %]" => '321', {foo => 3});
597
598 process_ok("[% WHILE 1 %][% foo %][% foo = foo - 1 %][% LAST IF foo == 1 %][% END %]" => '32', {foo => 3});
599 process_ok("[% f = 10; WHILE f; f = f - 1 ; f ; END %]" => '9876543210');
600 process_ok("[% f = 10; WHILE f; f = f - 1 ; f ; END ; f %]" => '98765432100');
601 process_ok("[% f = 10 a = 2; WHILE f; f = f - 1 ; f ; a=3; END ; a%]" => '98765432103');
602
603 process_ok("[% f = 10; WHILE (g=f); f = f - 1 ; f ; END %]" => '9876543210');
604 process_ok("[% f = 10; WHILE (g=f); f = f - 1 ; f ; END ; f %]" => '98765432100');
605 process_ok("[% f = 10 a = 2; WHILE (g=f); f = f - 1 ; f ; a=3; END ; a%]" => '98765432103');
606 process_ok("[% f = 10 a = 2; WHILE (a=f); f = f - 1 ; f ; a=3; END ; a%]" => '98765432100');
607
608 ###----------------------------------------------------------------###
609 ### stop, return, clear
610
611 process_ok("[% STOP %]" => '');
612 process_ok("One[% STOP %]Two" => 'One');
613 process_ok("[% BLOCK foo %]One[% STOP %]Two[% END %]First[% PROCESS foo %]Last" => 'FirstOne');
614 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% STOP %][% END %][% END %]" => '1');
615 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% STOP %][% END %][% f %][% END %]" => '');
616
617 process_ok("[% RETURN %]" => '');
618 process_ok("One[% RETURN %]Two" => 'One');
619 process_ok("[% BLOCK foo %]One[% RETURN %]Two[% END %]First[% PROCESS foo %]Last" => 'FirstOneLast');
620 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% RETURN %][% END %][% END %]" => '1');
621 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% RETURN %][% END %][% f %][% END %]" => '');
622
623 process_ok("[% CLEAR %]" => '');
624 process_ok("One[% CLEAR %]Two" => 'Two');
625 process_ok("[% BLOCK foo %]One[% CLEAR %]Two[% END %]First[% PROCESS foo %]Last" => 'FirstTwoLast');
626 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.first %][% CLEAR %][% END %][% END %]" => '23');
627 process_ok("[% FOREACH f = [1..3] %][% IF loop.first %][% CLEAR %][% END %][% f %][% END %]" => '123');
628 process_ok("[% FOREACH f = [1..3] %][% f %][% IF loop.last %][% CLEAR %][% END %][% END %]" => '');
629 process_ok("[% FOREACH f = [1..3] %][% IF loop.last %][% CLEAR %][% END %][% f %][% END %]" => '3');
630
631 ###----------------------------------------------------------------###
632 ### multiple-directives
633
634 process_ok("[% GET foo; GET foo %]" => '11', {foo => 1});
635 process_ok('[% FOREACH f = [1..3]; 1; END %]' => '111');
636 process_ok('[% FOREACH f = [1..3]; f; END %]' => '123');
637 process_ok('[% FOREACH f = [1..3]; "$f"; END %]' => '123');
638 process_ok('[% FOREACH f = [1..3]; f + 1; END %]' => '234');
639
640 ###----------------------------------------------------------------###
641 ### post opererator
642
643 process_ok("[% GET foo IF 1 %]" => '1', {foo => 1});
644 process_ok("[% f FOREACH f = [1..3] %]" => '123');
645
646 process_ok("2[% GET foo IF 1 IF 2 %]" => '21', {foo => 1}) if ! $is_tt;
647 process_ok("2[% GET foo IF 1 IF 0 %]" => '2', {foo => 1}) if ! $is_tt;
648 process_ok("[% f FOREACH f = [1..3] IF 1 %]" => '123') if ! $is_tt;
649 process_ok("[% f FOREACH f = [1..3] IF 0 %]" => '') if ! $is_tt;
650 process_ok("[% f FOREACH f = g FOREACH g = [1..3] %]" => '123') if ! $is_tt;
651 process_ok("[% f FOREACH f = g.a FOREACH g = [{a=>1}, {a=>2}, {a=>3}] %]" => '123') if ! $is_tt;
652 process_ok("[% f FOREACH f = a FOREACH [{a=>1}, {a=>2}, {a=>3}] %]" => '123') if ! $is_tt;
653
654 process_ok("[% FOREACH f = [1..3] IF 1 %]([% f %])[% END %]" => '(1)(2)(3)') if ! $is_tt;
655 process_ok("[% FOREACH f = [1..3] IF 0 %]([% f %])[% END %]" => '') if ! $is_tt;
656
657 process_ok("[% BLOCK bar %][% foo %][% foo = foo - 1 %][% END %][% PROCESS bar WHILE foo %]" => '321', {foo => 3});
658
659 ###----------------------------------------------------------------###
660 ### capturing
661
662 process_ok("[% foo = BLOCK %]Hi[% END %][% foo %][% foo %]" => 'HiHi');
663 process_ok("[% BLOCK foo %]Hi[% END %][% bar = PROCESS foo %]-[% bar %]" => '-Hi');
664 process_ok("[% foo = IF 1 %]Hi[% END %][% foo %]" => 'Hi');
665
666 ###----------------------------------------------------------------###
667 ### tags
668
669 process_ok("[% TAGS html %]<!-- 1 + 2 -->" => '3');
670 process_ok("[% TAGS <!-- --> %]<!-- 1 + 2 -->" => '3');
671 process_ok("[% TAGS html %] <!--- 1 + 2 -->" => '3');
672 process_ok("[% TAGS html %]<!-- 1 + 2 --->" => '3') if ! $is_tt;
673 process_ok("[% TAGS html %]<!-- 1 + 2 --->\n" => '3');
674 process_ok("[% BLOCK foo %][% TAGS html %]<!-- 1 + 2 -->[% END %][% PROCESS foo %] [% 1 + 2 %]" => '');
675
676 ###----------------------------------------------------------------###
677 ### switch
678
679 process_ok("[% SWITCH 1 %][% END %]hi" => 'hi');
680 process_ok("[% SWITCH 1 %][% CASE %]bar[% END %]hi" => 'barhi');
681 process_ok("[% SWITCH 1 %]Pre[% CASE %]bar[% END %]hi" => 'barhi');
682 process_ok("[% SWITCH 1 %][% CASE DEFAULT %]bar[% END %]hi" => 'barhi');
683 process_ok("[% SWITCH 1 %][% CASE 0 %]bar[% END %]hi" => 'hi');
684 process_ok("[% SWITCH 1 %][% CASE 1 %]bar[% END %]hi" => 'barhi');
685 process_ok("[% SWITCH 1 %][% CASE foo %][% CASE 1 %]bar[% END %]hi" => 'barhi');
686 process_ok("[% SWITCH 1 %][% CASE [1..10] %]bar[% END %]hi" => 'barhi');
687 process_ok("[% SWITCH 11 %][% CASE [1..10] %]bar[% END %]hi" => 'hi');
688
689 process_ok("[% SWITCH 1.0 %][% CASE [1..10] %]bar[% END %]hi" => 'barhi');
690 process_ok("[% SWITCH '1.0' %][% CASE [1..10] %]bar[% END %]hi" => 'barhi') if ! $is_tt;
691
692 ###----------------------------------------------------------------###
693 ### try/throw/catch/final
694
695 process_ok("[% TRY %][% END %]hi" => 'hi');
696 process_ok("[% TRY %]Foo[% END %]hi" => 'Foohi');
697 process_ok("[% TRY %]Foo[% THROW foo 'for fun' %]bar[% END %]hi" => '');
698 process_ok("[% TRY %]Foo[% THROW foo 'for fun' %]bar[% CATCH %][% END %]hi" => 'Foohi') if ! $is_tt;
699 process_ok("[% TRY %]Foo[% THROW foo 'for fun' %]bar[% CATCH %]there[% END %]hi" => 'Footherehi');
700 process_ok("[% TRY %]Foo[% THROW foo 'for fun' %]bar[% CATCH foo %]there[% END %]hi" => 'Footherehi');
701 process_ok("[% TRY %]Foo[% TRY %]Foo[% THROW foo 'for fun' %][% CATCH bar %]one[% END %][% CATCH %]two[% END %]hi" => 'FooFootwohi');
702 process_ok("[% TRY %]Foo[% TRY %]Foo[% THROW foo 'for fun' %][% CATCH bar %]one[% END %][% CATCH s %]two[% END %]hi" => '');
703 process_ok("[% TRY %]Foo[% THROW foo.bar 'for fun' %][% CATCH foo %]one[% CATCH foo.bar %]two[% END %]hi" => 'Footwohi');
704
705 process_ok("[% TRY %]Foo[% FINAL %]Bar[% END %]hi" => 'FooBarhi');
706 process_ok("[% TRY %]Foo[% THROW foo %][% FINAL %]Bar[% CATCH %]one[% END %]hi" => '');
707 process_ok("[% TRY %]Foo[% THROW foo %][% CATCH %]one[% FINAL %]Bar[% END %]hi" => 'FoooneBarhi');
708 process_ok("[% TRY %]Foo[% THROW foo %][% CATCH bar %]one[% FINAL %]Bar[% END %]hi" => '');
709
710 process_ok("[% TRY %][% THROW foo 'bar' %][% CATCH %][% error %][% END %]" => 'foo error - bar');
711 process_ok("[% TRY %][% THROW foo 'bar' %][% CATCH %][% error.type %][% END %]" => 'foo');
712 process_ok("[% TRY %][% THROW foo 'bar' %][% CATCH %][% error.info %][% END %]" => 'bar');
713 process_ok("[% TRY %][% THROW foo %][% CATCH %][% error.type %][% END %]" => 'undef');
714 process_ok("[% TRY %][% THROW foo %][% CATCH %][% error.info %][% END %]" => 'foo');
715
716 ###----------------------------------------------------------------###
717 ### named args
718
719 process_ok("[% foo(bar = 'one', baz = 'two') %]" => "baronebaztwo",
720 {foo=>sub{my $n=$_[-1];join('',map{"$_$n->{$_}"} sort keys %$n)}});
721 process_ok("[%bar='ONE'%][% foo(\$bar = 'one') %]" => "ONEone",
722 {foo=>sub{my $n=$_[-1];join('',map{"$_$n->{$_}"} sort keys %$n)}});
723
724 ###----------------------------------------------------------------###
725 ### use
726
727 my @config_p = (PLUGIN_BASE => 'MyTestPlugin', LOAD_PERL => 1);
728 process_ok("[% USE son_of_gun_that_does_not_exist %]one" => '', {tt_config => \@config_p});
729 process_ok("[% USE Foo %]one" => 'one', {tt_config => \@config_p});
730 process_ok("[% USE Foo2 %]one" => 'one', {tt_config => \@config_p});
731 process_ok("[% USE Foo(bar = 'baz') %]one[% Foo.bar %]" => 'onebarbaz', {tt_config => \@config_p});
732 process_ok("[% USE Foo2(bar = 'baz') %]one[% Foo2.bar %]" => 'onebarbaz', {tt_config => \@config_p});
733 process_ok("[% USE Foo(bar = 'baz') %]one[% Foo.bar %]" => 'onebarbaz', {tt_config => \@config_p});
734 process_ok("[% USE d = Foo(bar = 'baz') %]one[% d.bar %]" => 'onebarbaz', {tt_config => \@config_p});
735 process_ok("[% USE d.d = Foo(bar = 'baz') %]one[% d.d.bar %]" => '', {tt_config => \@config_p});
736
737 process_ok("[% USE a(bar = 'baz') %]one[% a.seven %]" => '', {tt_config => [@config_p, PLUGINS => {a=>'Foo'}, ]});
738 process_ok("[% USE a(bar = 'baz') %]one[% a.seven %]" => 'one7', {tt_config => [@config_p, PLUGINS => {a=>'Foo2'},]});
739
740 @config_p = (PLUGIN_BASE => ['NonExistant', 'MyTestPlugin'], LOAD_PERL => 1);
741 process_ok("[% USE Foo %]one" => 'one', {tt_config => \@config_p});
742
743 ###----------------------------------------------------------------###
744 ### macro
745
746 process_ok("[% MACRO foo PROCESS bar %][% BLOCK bar %]Hi[% END %][% foo %]" => 'Hi');
747 process_ok("[% MACRO foo BLOCK %]Hi[% END %][% foo %]" => 'Hi');
748 process_ok("[% MACRO foo BLOCK %]Hi[% END %][% foo %]" => 'Hi');
749 process_ok("[% MACRO foo(n) BLOCK %]Hi[% n %][% END %][% foo(2) %]" => 'Hi2');
750 process_ok("[%n=1%][% MACRO foo(n) BLOCK %]Hi[% n %][% END %][% foo(2) %][%n%]" => 'Hi21');
751 process_ok("[%n=1%][% MACRO foo BLOCK %]Hi[% n = 2%][% END %][% foo %][%n%]" => 'Hi1');
752 process_ok("[% MACRO foo(n) FOREACH i=[1..n] %][% i %][% END %][% foo(3) %]" => '123');
753
754 ###----------------------------------------------------------------###
755 ### debug;
756
757 process_ok("\n\n[% one %]" => "\n\n\n## input text line 3 : [% one %] ##\nONE", {one=>'ONE', tt_config => ['DEBUG' => 8]});
758 process_ok("[% one %]" => "\n## input text line 1 : [% one %] ##\nONE", {one=>'ONE', tt_config => ['DEBUG' => 8]});
759 process_ok("[% one %]\n\n" => "(1)ONE\n\n", {one=>'ONE', tt_config => ['DEBUG' => 8, 'DEBUG_FORMAT' => '($line)']});
760 process_ok("1\n2\n3[% one %]" => "1\n2\n3(3)ONE", {one=>'ONE', tt_config => ['DEBUG' => 8, 'DEBUG_FORMAT' => '($line)']});
761 process_ok("[% one;\n one %]" => "(1)ONE(2)ONE", {one=>'ONE', tt_config => ['DEBUG' => 8,
762 'DEBUG_FORMAT' => '($line)']}) if ! $is_tt;
763 process_ok("[% DEBUG format '(\$line)' %][% one %]" => qr/\(1\)/, {one=>'ONE', tt_config => ['DEBUG' => 8]});
764
765 process_ok("[% TRY %][% abc %][% CATCH %][% error %][% END %]" => "undef error - abc is undefined\n", {tt_config => ['DEBUG' => 2]});
766 process_ok("[% TRY %][% abc.def %][% CATCH %][% error %][% END %]" => "undef error - def is undefined\n", {abc => {}, tt_config => ['DEBUG' => 2]});
767
768 ###----------------------------------------------------------------###
769 ### constants
770
771 my @config_c = (
772 CONSTANTS => {
773 harry => sub {'do_this_once'},
774 foo => {
775 bar => {baz => 42},
776 bim => 57,
777 },
778 bing => 'baz',
779 bang => 'bim',
780 },
781 VARIABLES => {
782 bam => 'bar',
783 },
784 );
785 process_ok("[% constants.harry %]" => 'do_this_once', {tt_config => \@config_c});
786 process_ok("[% constants.harry.length %]" => '12', {tt_config => \@config_c});
787 process_ok("[% SET constants.something = 1 %][% constants.something %]one" => '1one', {tt_config => \@config_c});
788 process_ok("[% SET constants.harry = 1 %][% constants.harry %]one" => 'do_this_onceone', {tt_config => \@config_c});
789 process_ok("[% constants.foo.\${constants.bang} %]" => '57', {tt_config => [@config_c]});
790 process_ok("[% constants.foo.\$bam.\${constants.bing} %]" => '42', {tt_config => [@config_c]}) if ! $is_tt;
791 process_ok("[% bam = 'somethingelse' %][% constants.foo.\$bam.\${constants.bing} %]" => '42', {tt_config => [@config_c]}) if ! $is_tt;
792
793 ###----------------------------------------------------------------###
794 ### interpolate / anycase / trim
795
796 process_ok("Foo \$one Bar" => 'Foo ONE Bar', {one => 'ONE', tt_config => ['INTERPOLATE' => 1]});
797 process_ok("[% PERL %] my \$n=7; print \$n [% END %]" => '7', {tt_config => ['INTERPOLATE' => 1, 'EVAL_PERL' => 1]});
798 process_ok("[% TRY ; PERL %] my \$n=7; print \$n [% END ; END %]" => '7', {tt_config => ['INTERPOLATE' => 1, 'EVAL_PERL' => 1]});
799
800 process_ok("[% GET %]" => '', {GET => 'ONE'});
801 process_ok("[% GET GET %]" => 'ONE', {GET => 'ONE'}) if ! $is_tt;
802
803 process_ok("[% BLOCK foo %]\nhi\n[% END %][% PROCESS foo %]" => "\nhi\n");
804 process_ok("[% BLOCK foo %]\nhi[% END %][% PROCESS foo %]" => "hi", {tt_config => [TRIM => 1]});
805 process_ok("[% BLOCK foo %]hi\n[% END %][% PROCESS foo %]" => "hi", {tt_config => [TRIM => 1]});
806 process_ok("[% BLOCK foo %]hi[% nl %][% END %][% PROCESS foo %]" => "hi", {nl => "\n", tt_config => [TRIM => 1]});
807 process_ok("[% BLOCK foo %][% nl %]hi[% END %][% PROCESS foo %]" => "hi", {nl => "\n", tt_config => [TRIM => 1]});
808 process_ok("A[% TRY %]\nhi\n[% END %]" => "A\nhi", {tt_config => [TRIM => 1]});
809
810 ###----------------------------------------------------------------###
811 ### perl
812
813 process_ok("[% TRY %][% PERL %][% END %][% CATCH ; error; END %]" => 'perl error - EVAL_PERL not set');
814 process_ok("[% PERL %] print \"[% one %]\" [% END %]" => 'ONE', {one => 'ONE', tt_config => ['EVAL_PERL' => 1]});
815 process_ok("[% PERL %] print \$stash->get('one') [% END %]" => 'ONE', {one => 'ONE', tt_config => ['EVAL_PERL' => 1]});
816 process_ok("[% PERL %] print \$stash->set('a.b.c', 7) [% END %][% a.b.c %]" => '77', {tt_config => ['EVAL_PERL' => 1]});
817
818 ###----------------------------------------------------------------###
819 ### recursion prevention
820
821 process_ok("[% BLOCK foo %][% PROCESS bar %][% END %][% BLOCK bar %][% PROCESS foo %][% END %][% PROCESS foo %]" => '') if ! $is_tt;
822
823 ###----------------------------------------------------------------###
824 ### META
825
826 process_ok("[% template.name %]" => 'input text');
827 process_ok("[% META foo = 'bar' %][% template.foo %]" => 'bar');
828 process_ok("[% META foo = 'bar' %][% component.foo %]" => 'bar');
This page took 0.072049 seconds and 4 git commands to generate.