root/branches/boomer/t/07-builder.t @ 1100

Revision 1100, 7.1 kB (checked in by hachi, 2 years ago)

Merging release-20 to boomer branch: svn merge -r62323:63659 http://svn.sixapart.com/repos/eng/movabletype/branches/release-20 .

  • Property svn:mime-type set to text/plain
  • Property svn:keywords set to Author Date Id Revision
Line 
1# $Id$
2
3BEGIN { unshift @INC, 't/' }
4use lib 'lib';
5use lib 't/lib';
6use lib 'extlib';
7
8use Test::More tests => 116;
9use MT;
10use MT::Builder;
11use strict;
12
13my $mt = MT->new;
14
15my($tokens, $out);
16
17my $builder = MT::Builder->new;
18ok($builder);
19
20my $ctx = My::Context->new;
21ok($ctx);
22
23$tokens = $builder->compile($ctx, '');
24ok($tokens);
25ok(ref($tokens) eq 'ARRAY');
26ok(!@$tokens);
27is($builder->build($ctx, $tokens), '');
28
29$tokens = $builder->compile($ctx, 'justified and ancient');
30ok($tokens && ref($tokens) eq 'ARRAY');
31ok(@$tokens == 1);
32ok($tokens->[0][0] eq 'TEXT');
33ok($tokens->[0][1] eq 'justified and ancient');
34is($builder->build($ctx, $tokens), 'justified and ancient');
35
36$tokens = $builder->compile($ctx, '<$MTFoo$>');
37ok($tokens && ref($tokens) eq 'ARRAY');
38ok(@$tokens == 1);
39ok($tokens->[0][0] eq 'Foo');
40ok(@{ $tokens->[0] } == 7);
41ok(ref($tokens->[0][1]) eq 'HASH');
42is(scalar keys %{ $tokens->[0][1] }, 0);
43is($builder->build($ctx, $tokens), 'foo');
44
45$tokens = $builder->compile($ctx, '<$MTFoo no="1"$>');
46ok($tokens && ref($tokens) eq 'ARRAY');
47ok(@$tokens == 1);
48ok(@{ $tokens->[0] } == 7);
49ok($tokens->[0][0] eq 'Foo');
50ok(ref($tokens->[0][1]) eq 'HASH');
51is($tokens->[0][1]{no}, 1);
52is($builder->build($ctx, $tokens), 'no foo');
53
54$tokens = $builder->compile($ctx, '<$MTFoo no="1" yes="foo bar"$>');
55ok($tokens && ref($tokens) eq 'ARRAY');
56ok(@$tokens == 1);
57ok(@{ $tokens->[0] } == 7);
58ok($tokens->[0][0] eq 'Foo');
59ok(ref($tokens->[0][1]) eq 'HASH');
60is($tokens->[0][1]{no}, 1);
61is($tokens->[0][1]{yes}, 'foo bar');
62is($builder->build($ctx, $tokens), 'no foo');
63
64$tokens = $builder->compile($ctx, '<$MTFoo yes="foo\'s bar"$>');
65ok($tokens && ref($tokens) eq 'ARRAY');
66ok(@$tokens == 1);
67ok(@{ $tokens->[0] } == 7);
68ok($tokens->[0][0] eq 'Foo');
69ok(ref($tokens->[0][1]) eq 'HASH');
70is($tokens->[0][1]{yes}, 'foo\'s bar');
71
72$tokens = $builder->compile($ctx, <<'TEXT');
73time to kick out the jams, motherfuckers
74<$MTFoo$>
75TEXT
76ok($tokens && ref($tokens) eq 'ARRAY');
77ok(@$tokens == 3);
78ok($tokens->[0][0] eq 'TEXT');
79ok($tokens->[0][1] eq "time to kick out the jams, motherfuckers\n");
80ok($tokens->[1][0] eq 'Foo');
81ok($tokens->[2][0] eq 'TEXT');
82ok($tokens->[2][1] eq "\n");
83is($builder->build($ctx, $tokens),
84    "time to kick out the jams, motherfuckers\nfoo\n");
85is($builder->build($ctx, $tokens, { Foo => 0 }),
86    "time to kick out the jams, motherfuckers\n\n");
87
88# $tokens = $builder->compile($ctx, '<MTBars>');
89# ok(!$tokens);
90# ok($builder->errstr eq "<MTBars> with no </MTBars>\n");
91
92$tokens = $builder->compile($ctx, '<MTBars></MTBars>');
93ok($tokens && ref($tokens) eq 'ARRAY');
94ok(@$tokens == 1);
95ok($tokens->[0][0] eq 'Bars');
96ok(ref($tokens->[0][2]) eq 'ARRAY');
97ok(@{ $tokens->[0][2] } == 0);
98is($builder->build($ctx, $tokens), '');
99
100$tokens = $builder->compile($ctx, '<MTBars>foo</MTBars>');
101ok($tokens && ref($tokens) eq 'ARRAY');
102ok(@$tokens == 1);
103ok($tokens->[0][0] eq 'Bars');
104ok(ref($tokens->[0][2]) eq 'ARRAY');
105ok(@{ $tokens->[0][2] } == 1);
106ok($tokens->[0][2][0][0] eq 'TEXT');
107ok($tokens->[0][2][0][1] eq 'foo');
108is($builder->build($ctx, $tokens), 'foofoo');
109
110$tokens = $builder->compile($ctx, <<'TEXT');
111<MTBars>
112foo:<$MTBarBaz$>
113</MTBars>
114TEXT
115ok($tokens && ref($tokens) eq 'ARRAY');
116ok(@$tokens == 2);
117ok($tokens->[0][0] eq 'Bars');
118ok(ref($tokens->[0][2]) eq 'ARRAY');
119ok(@{ $tokens->[0][2] } == 3);
120ok($tokens->[0][2][0][0] eq 'TEXT');
121ok($tokens->[0][2][0][1] eq "\nfoo:");
122ok($tokens->[0][2][1][0] eq 'BarBaz');
123ok($tokens->[0][2][2][0] eq 'TEXT');
124ok($tokens->[0][2][2][1] eq "\n");
125ok($tokens->[1][0] eq 'TEXT');
126ok($tokens->[1][1] eq "\n");
127is($builder->build($ctx, $tokens), "\nfoo:baz1\n\nfoo:baz2\n\n");
128
129$tokens = $builder->compile($ctx,
130q[<$MTFoo regex="s/(\d+)/$1==0?'None':$1==1?'1 reply':$1.'replies'/e"$>]);
131ok($tokens && ref($tokens) eq 'ARRAY');
132ok(@$tokens == 1);
133ok(@{ $tokens->[0] } == 7);
134ok($tokens->[0][0] eq 'Foo');
135ok(ref($tokens->[0][1]) eq 'HASH');
136is($tokens->[0][1]{regex}, q[s/(\d+)/$1==0?'None':$1==1?'1 reply':$1.'replies'/e]);
137
138$tokens = $builder->compile($ctx, <<'TEXT');
139<MTBars>
140Bars:
141<MTBars>bar</MTBars>
142</MTBars>
143TEXT
144ok($tokens && ref($tokens) eq 'ARRAY');
145ok(@$tokens == 2);
146ok($tokens->[0][0] eq 'Bars');
147ok(ref($tokens->[0][2]) eq 'ARRAY');
148ok(@{ $tokens->[0][2] } == 3);
149ok($tokens->[0][2][0][0] eq 'TEXT');
150ok($tokens->[0][2][0][1] eq "\nBars:\n");
151ok($tokens->[0][2][1][0] eq 'Bars');
152ok(ref($tokens->[0][2][1][2]) eq 'ARRAY');
153ok(@{ $tokens->[0][2][1][2] } == 1);
154ok($tokens->[0][2][1][2][0][0] eq 'TEXT');
155ok($tokens->[0][2][1][2][0][1] eq 'bar');
156ok($tokens->[0][2][2][0] eq 'TEXT');
157ok($tokens->[0][2][2][1] eq "\n");
158ok($tokens->[1][0] eq 'TEXT');
159ok($tokens->[1][1] eq "\n");
160is($builder->build($ctx, $tokens), "\nBars:\nbarbar\n\nBars:\nbarbar\n\n");
161
162$tokens = $builder->compile($ctx, "<MTBars/>");
163ok($tokens && ref($tokens) eq 'ARRAY');
164ok(@$tokens == 1);
165ok($tokens->[0][0] eq 'Bars');
166ok(!$tokens->[0][2]);
167is($builder->build($ctx, $tokens), 'Called without tokens!');
168
169$tokens = $builder->compile($ctx, '<$MTFoo no="1
170"$>');
171ok($tokens && ref($tokens) eq 'ARRAY');
172ok(@$tokens == 1);
173ok(@{ $tokens->[0] } == 7);
174ok($tokens->[0][0] eq 'Foo');
175ok(ref($tokens->[0][1]) eq 'HASH');
176is($tokens->[0][1]{no}, "1\n");
177is($builder->build($ctx, $tokens), 'no foo');
178
179$tokens = $builder->compile($ctx, '<MTIfBaz>yes</MTIfBaz>');
180ok($tokens && ref($tokens) eq 'ARRAY');
181is($builder->build($ctx, $tokens, { IfBaz => 1 }), 'yes');
182is($builder->build($ctx, $tokens, { IfBaz => 0 }), '');
183
184$tokens = $builder->compile($ctx, '<MTIfBaz>yes<MTElse>no</MTElse></MTIfBaz>');
185ok($tokens && ref($tokens) eq 'ARRAY');
186is($builder->build($ctx, $tokens, { IfBaz => 1 }), 'yes');
187is($builder->build($ctx, $tokens, { IfBaz => 0 }), 'no');
188
189
190package My::Context;
191use strict;
192
193use MT::ErrorHandler;
194use base qw( MT::ErrorHandler );
195
196sub new {
197    my $class = shift;
198    my $ctx = bless { }, $class;
199    $ctx->register_handler(Else => [ \&_hdlr_pass_tokens, 1 ]);
200    $ctx->register_handler(Foo => \&_hdlr_foo);
201    $ctx->register_handler(Bars => [ \&_hdlr_bars, 1 ]);
202    $ctx->register_handler(BarBaz => \&_hdlr_bar_baz);
203    $ctx->register_handler(IfBaz => [ \&_hdlr_pass_tokens, 1 ]);
204    $ctx;
205}
206
207sub stash {
208    my $ctx = shift;
209    my $key = shift;
210    $ctx->{__stash}->{$key} = shift if @_;
211    $ctx->{__stash}->{$key};
212}
213
214sub register_handler { $_[0]->{__handlers}{$_[1]} = $_[2] }
215sub handler_for      {
216    my $v = $_[0]->{__handlers}{$_[1]};
217    ref($v) eq 'ARRAY' ? @$v : $v
218}
219
220sub post_process_handler { }
221
222sub _hdlr_foo {
223    my $args = $_[1];
224    $args && $args->{no} ? 'no foo' : 'foo'
225}
226
227sub _hdlr_pass_tokens {
228    my($ctx, $args, $cond) = @_;
229    $ctx->stash('builder')->build($ctx, $ctx->stash('tokens'), $cond);
230}
231
232sub _hdlr_bars {
233    my($ctx) = @_;
234    my $tokens = $ctx->stash('tokens');
235    return 'Called without tokens!' if !$tokens;
236    my $builder = $ctx->stash('builder');
237    my $html = '';
238    for (1..2) {
239        my $bar = { baz => 'baz' . $_ };
240        $ctx->stash('bar', $bar);
241        my $out = $builder->build($ctx, $tokens);
242        return $ctx->error( $builder->errstr ) unless defined $out;
243        $html .= $out;
244    }
245    $html;
246}
247
248sub _hdlr_bar_baz {
249    my $bar = $_[0]->stash('bar');
250    $bar->{baz};
251}
Note: See TracBrowser for help on using the browser.