root/branches/release-40/t/07-builder.t @ 2562

Revision 2562, 7.1 kB (checked in by bchoate, 18 months ago)

Test suite cleanup. Use MT::Test to force t/ based configuration file for all tests. Fixed several tests that had incorrect expected values.

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