Changeset 3022

Show
Ignore:
Timestamp:
09/03/08 20:16:30 (3 months ago)
Author:
bchoate
Message:

Added descriptions to tests; added additional tests for case-insensitivity, etc.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/t/07-builder.t

    r2562 r3022  
     1#!/usr/bin/perl 
    12# $Id$ 
    23 
    3 BEGIN { unshift @INC, 't/' } 
    4 use lib 'lib'; 
    5 use lib 't/lib'; 
    6 use lib 'extlib'; 
     4use strict; 
     5use lib qw( t t/lib lib extlib ); 
     6use Data::Dumper; 
    77 
    88use MT::Test; 
    99 
    10 use Test::More tests => 116; 
     10use Test::More tests => 142; 
     11 
    1112use MT; 
     13 
     14my $mt = MT->new; 
     15 
     16my($tokens, $out); 
     17 
    1218use MT::Builder; 
    13 use strict; 
    14  
    15 my $mt = MT->new; 
    16  
    17 my($tokens, $out); 
    18  
    1919my $builder = MT::Builder->new; 
    20 ok($builder); 
     20ok($builder, "Builder constructed okay"); 
    2121 
    2222my $ctx = My::Context->new; 
    23 ok($ctx); 
    24  
     23ok($ctx, "Context constructed okay"); 
     24 
     25diag("Testing compilation of an empty template"); 
    2526$tokens = $builder->compile($ctx, ''); 
    26 ok($tokens); 
    27 ok(ref($tokens) eq 'ARRAY'); 
    28 ok(!@$tokens); 
    29 is($builder->build($ctx, $tokens), ''); 
    30  
     27diag("Error: " . $builder->errstr) unless $tokens; 
     28ok($tokens, "Compiled empty template"); 
     29ok(ref($tokens) eq 'ARRAY', "Empty template produced token list"); 
     30ok(!@$tokens, "Token list is empty, which is okay"); 
     31is($builder->build($ctx, $tokens), '', "Builds to an empty string"); 
     32 
     33diag("Testing compilation of a pure-text template (no tags)"); 
    3134$tokens = $builder->compile($ctx, 'justified and ancient'); 
    32 ok($tokens && ref($tokens) eq 'ARRAY'); 
    33 ok(@$tokens == 1); 
    34 ok($tokens->[0][0] eq 'TEXT'); 
    35 ok($tokens->[0][1] eq 'justified and ancient'); 
    36 is($builder->build($ctx, $tokens), 'justified and ancient'); 
    37  
     35diag("Error: " . $builder->errstr) unless $tokens; 
     36ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     37ok(@$tokens == 1, "Created one token"); 
     38ok($tokens->[0][0] eq 'TEXT', "Token is textual"); 
     39ok($tokens->[0][1] eq 'justified and ancient', "Token text is what we expect"); 
     40is($builder->build($ctx, $tokens), 'justified and ancient', "Builds to what we expect"); 
     41 
     42diag("Testing compilation of simple function tag"); 
    3843$tokens = $builder->compile($ctx, '<$MTFoo$>'); 
    39 ok($tokens && ref($tokens) eq 'ARRAY'); 
    40 ok(@$tokens == 1); 
    41 ok($tokens->[0][0] eq 'Foo'); 
    42 ok(@{ $tokens->[0] } == 7); 
    43 ok(ref($tokens->[0][1]) eq 'HASH'); 
    44 is(scalar keys %{ $tokens->[0][1] }, 0); 
    45 is($builder->build($ctx, $tokens), 'foo'); 
    46  
     44diag("Error: " . $builder->errstr) unless $tokens; 
     45ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     46ok(@$tokens == 1, "Created one token"); 
     47ok($tokens->[0][0] eq 'Foo', "Token is a tag token"); 
     48ok(@{ $tokens->[0] } == 7, "Length of token object is 7 elements"); 
     49ok(ref($tokens->[0][1]) eq 'HASH', "Element 1 of token object is a hashref"); 
     50is(scalar keys %{ $tokens->[0][1] }, 0, "Has no attributes"); 
     51is($builder->build($ctx, $tokens), 'foo', "Building produces expected result"); 
     52 
     53diag("Testing compilation of function tag with an attribute"); 
    4754$tokens = $builder->compile($ctx, '<$MTFoo no="1"$>'); 
    48 ok($tokens && ref($tokens) eq 'ARRAY'); 
    49 ok(@$tokens == 1); 
    50 ok(@{ $tokens->[0] } == 7); 
    51 ok($tokens->[0][0] eq 'Foo'); 
    52 ok(ref($tokens->[0][1]) eq 'HASH'); 
    53 is($tokens->[0][1]{no}, 1); 
    54 is($builder->build($ctx, $tokens), 'no foo'); 
    55  
     55diag("Error: " . $builder->errstr) unless $tokens; 
     56ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     57ok(@$tokens == 1, "Created one token"); 
     58ok(@{ $tokens->[0] } == 7, "Length of token object is 7 elements"); 
     59ok($tokens->[0][0] eq 'Foo', "Token is a tag token"); 
     60ok(ref($tokens->[0][1]) eq 'HASH', "Element 1 of token object is a hashref"); 
     61is($tokens->[0][1]{no}, 1, "Attribute 'no' is equal to 1"); 
     62is($builder->build($ctx, $tokens), 'no foo', "Building produces expected result"); 
     63 
     64diag("Testing compilation of function tag with multiple attributes"); 
    5665$tokens = $builder->compile($ctx, '<$MTFoo no="1" yes="foo bar"$>'); 
    57 ok($tokens && ref($tokens) eq 'ARRAY'); 
    58 ok(@$tokens == 1); 
    59 ok(@{ $tokens->[0] } == 7); 
    60 ok($tokens->[0][0] eq 'Foo'); 
    61 ok(ref($tokens->[0][1]) eq 'HASH'); 
    62 is($tokens->[0][1]{no}, 1); 
    63 is($tokens->[0][1]{yes}, 'foo bar'); 
    64 is($builder->build($ctx, $tokens), 'no foo'); 
    65  
     66diag("Error: " . $builder->errstr) unless $tokens; 
     67ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     68ok(@$tokens == 1, "Created one token"); 
     69ok(@{ $tokens->[0] } == 7, "Length of token object is 7 elements"); 
     70ok($tokens->[0][0] eq 'Foo', "Token is a tag token"); 
     71ok(ref($tokens->[0][1]) eq 'HASH', "Element 1 of token object is a hashref"); 
     72is($tokens->[0][1]{no}, 1, "Attribute 'no' is equal to 1"); 
     73is($tokens->[0][1]{yes}, 'foo bar', "Attribute 'yes' is equal to 'foo bar'"); 
     74is($builder->build($ctx, $tokens), 'no foo', "Building produces expected result"); 
     75 
     76diag("Testing compilation of function tag with attribute an inner single quote"); 
    6677$tokens = $builder->compile($ctx, '<$MTFoo yes="foo\'s bar"$>'); 
    67 ok($tokens && ref($tokens) eq 'ARRAY'); 
    68 ok(@$tokens == 1); 
    69 ok(@{ $tokens->[0] } == 7); 
    70 ok($tokens->[0][0] eq 'Foo'); 
    71 ok(ref($tokens->[0][1]) eq 'HASH'); 
    72 is($tokens->[0][1]{yes}, 'foo\'s bar'); 
    73  
     78diag("Error: " . $builder->errstr) unless $tokens; 
     79ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     80ok(@$tokens == 1, "Created one token"); 
     81ok(@{ $tokens->[0] } == 7, "Length of token object is 7 elements"); 
     82ok($tokens->[0][0] eq 'Foo', "Token is a tag token"); 
     83ok(ref($tokens->[0][1]) eq 'HASH', "Element 1 of token object is a hashref"); 
     84is($tokens->[0][1]{yes}, 'foo\'s bar', "Attribute 'yes' is equal to \"foo's bar\""); 
     85 
     86diag("Testing compilation of text + function tag"); 
    7487$tokens = $builder->compile($ctx, <<'TEXT'); 
    7588time to kick out the jams, motherfuckers 
    7689<$MTFoo$> 
    7790TEXT 
    78 ok($tokens && ref($tokens) eq 'ARRAY'); 
    79 ok(@$tokens == 3); 
    80 ok($tokens->[0][0] eq 'TEXT'); 
    81 ok($tokens->[0][1] eq "time to kick out the jams, motherfuckers\n"); 
    82 ok($tokens->[1][0] eq 'Foo'); 
    83 ok($tokens->[2][0] eq 'TEXT'); 
    84 ok($tokens->[2][1] eq "\n"); 
     91diag("Error: " . $builder->errstr) unless $tokens; 
     92ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     93ok(@$tokens == 3, "Created 3 tokens"); 
     94ok($tokens->[0][0] eq 'TEXT', "Token 1 is a text token"); 
     95ok($tokens->[0][1] eq "time to kick out the jams, motherfuckers\n", "Text is expected value"); 
     96ok($tokens->[1][0] eq 'Foo', "Token 2 is a tag token"); 
     97ok($tokens->[2][0] eq 'TEXT', "Token 3 is a text token"); 
     98ok($tokens->[2][1] eq "\n", "Text is expected value"); 
    8599is($builder->build($ctx, $tokens), 
    86     "time to kick out the jams, motherfuckers\nfoo\n"); 
     100    "time to kick out the jams, motherfuckers\nfoo\n", "Building produces expected result"); 
    87101is($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  
     102    "time to kick out the jams, motherfuckers\n\n", "Building produces expected result, with conditional"); 
     103 
     104diag("Testing compilation failure for a block tag (no closing tag)"); 
     105$tokens = $builder->compile($ctx, '<MTBars>'); 
     106diag("Error: " . $builder->errstr) unless $tokens; 
     107ok(!$tokens, "Compiling failed, as expected"); 
     108ok($builder->errstr eq "<MTBars> with no </MTBars> on line 1.\n", "Compilation yielded proper error message"); 
     109 
     110# diag("Testing compilation failure for a nested block tag"); 
     111# $tokens = $builder->compile($ctx, <<EOT); 
     112# <MTBars> 
     113#  
     114#  
     115#  
     116#  
     117# <MTBars> 
     118#  
     119# </MTBars> 
     120#  
     121# <MTBars> # ERROR IS HERE, LINE 10 
     122#  
     123# <MTBars> 
     124#  
     125# </MTBars> 
     126# EOT 
     127# diag("Error: " . $builder->errstr) unless $tokens; 
     128# ok(!$tokens, "Compiling failed, as expected"); 
     129# ok($builder->errstr eq "<MTBars> with no </MTBars> on line 10.\n", "Compilation yielded proper error message"); 
     130 
     131diag("Testing compilation of a block tag with nothing in it"); 
    94132$tokens = $builder->compile($ctx, '<MTBars></MTBars>'); 
    95 ok($tokens && ref($tokens) eq 'ARRAY'); 
    96 ok(@$tokens == 1); 
    97 ok($tokens->[0][0] eq 'Bars'); 
    98 ok(ref($tokens->[0][2]) eq 'ARRAY'); 
    99 ok(@{ $tokens->[0][2] } == 0); 
    100 is($builder->build($ctx, $tokens), ''); 
    101  
     133diag("Error: " . $builder->errstr) unless $tokens; 
     134ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     135ok(@$tokens == 1, "Created 1 token"); 
     136ok($tokens->[0][0] eq 'Bars', "Token is a tag token"); 
     137ok(ref($tokens->[0][2]) eq 'ARRAY', "Token has child token array"); 
     138ok(@{ $tokens->[0][2] } == 0, "Child token length is 0"); 
     139is($builder->build($ctx, $tokens), 'Called without tokens!', "Building produces expected result"); 
     140 
     141diag("Testing compilation of a block tag wrapping plaintext"); 
    102142$tokens = $builder->compile($ctx, '<MTBars>foo</MTBars>'); 
    103 ok($tokens && ref($tokens) eq 'ARRAY'); 
    104 ok(@$tokens == 1); 
    105 ok($tokens->[0][0] eq 'Bars'); 
    106 ok(ref($tokens->[0][2]) eq 'ARRAY'); 
    107 ok(@{ $tokens->[0][2] } == 1); 
    108 ok($tokens->[0][2][0][0] eq 'TEXT'); 
    109 ok($tokens->[0][2][0][1] eq 'foo'); 
    110 is($builder->build($ctx, $tokens), 'foofoo'); 
    111  
     143diag("Error: " . $builder->errstr) unless $tokens; 
     144ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     145ok(@$tokens == 1, "Created 1 token"); 
     146ok($tokens->[0][0] eq 'Bars', "Token is a tag token"); 
     147ok(ref($tokens->[0][2]) eq 'ARRAY', "Token has child token array"); 
     148ok(@{ $tokens->[0][2] } == 1, "Child token length is 1"); 
     149ok($tokens->[0][2][0][0] eq 'TEXT', "Child token is textual"); 
     150ok($tokens->[0][2][0][1] eq 'foo', "Child token value is 'foo'"); 
     151is($builder->build($ctx, $tokens), 'foofoo', "Building produces expected result"); 
     152 
     153diag("Testing compilation of a block tag wrapping plaintext + function tag"); 
    112154$tokens = $builder->compile($ctx, <<'TEXT'); 
    113155<MTBars> 
     
    115157</MTBars> 
    116158TEXT 
    117 ok($tokens && ref($tokens) eq 'ARRAY'); 
    118 ok(@$tokens == 2); 
    119 ok($tokens->[0][0] eq 'Bars'); 
    120 ok(ref($tokens->[0][2]) eq 'ARRAY'); 
    121 ok(@{ $tokens->[0][2] } == 3); 
    122 ok($tokens->[0][2][0][0] eq 'TEXT'); 
    123 ok($tokens->[0][2][0][1] eq "\nfoo:"); 
    124 ok($tokens->[0][2][1][0] eq 'BarBaz'); 
    125 ok($tokens->[0][2][2][0] eq 'TEXT'); 
    126 ok($tokens->[0][2][2][1] eq "\n"); 
    127 ok($tokens->[1][0] eq 'TEXT'); 
    128 ok($tokens->[1][1] eq "\n"); 
    129 is($builder->build($ctx, $tokens), "\nfoo:baz1\n\nfoo:baz2\n\n"); 
     159diag("Error: " . $builder->errstr) unless $tokens; 
     160ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     161ok(@$tokens == 2, "Created 2 tokens"); 
     162ok($tokens->[0][0] eq 'Bars', "Token 1 is a tag token"); 
     163ok(ref($tokens->[0][2]) eq 'ARRAY', "Token has child token array"); 
     164ok(@{ $tokens->[0][2] } == 3, "Child token array length is 3"); 
     165ok($tokens->[0][2][0][0] eq 'TEXT', "First child token is textual"); 
     166ok($tokens->[0][2][0][1] eq "\nfoo:", "First child token text matches"); 
     167ok($tokens->[0][2][1][0] eq 'BarBaz', "Second child token is a tag"); 
     168ok($tokens->[0][2][2][0] eq 'TEXT', "Third child token is textual"); 
     169ok($tokens->[0][2][2][1] eq "\n", "Third child token text matches"); 
     170ok($tokens->[1][0] eq 'TEXT', "Second token is textual"); 
     171ok($tokens->[1][1] eq "\n", "Second token text matches"); 
     172is($builder->build($ctx, $tokens), "\nfoo:baz1\n\nfoo:baz2\n\n", "Building produces expected result"); 
    130173 
    131174$tokens = $builder->compile($ctx, 
    132175q[<$MTFoo regex="s/(\d+)/$1==0?'None':$1==1?'1 reply':$1.'replies'/e"$>]); 
    133 ok($tokens && ref($tokens) eq 'ARRAY'); 
    134 ok(@$tokens == 1); 
    135 ok(@{ $tokens->[0] } == 7); 
    136 ok($tokens->[0][0] eq 'Foo'); 
    137 ok(ref($tokens->[0][1]) eq 'HASH'); 
    138 is($tokens->[0][1]{regex}, q[s/(\d+)/$1==0?'None':$1==1?'1 reply':$1.'replies'/e]); 
    139  
     176diag("Error: " . $builder->errstr) unless $tokens; 
     177ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     178ok(@$tokens == 1, "Created 1 token"); 
     179ok(@{ $tokens->[0] } == 7, "Length of token object is 7 elements"); 
     180ok($tokens->[0][0] eq 'Foo', "Token 1 is a tag token"); 
     181ok(ref($tokens->[0][1]) eq 'HASH', "Token has an attribute hashref"); 
     182is($tokens->[0][1]{regex}, q[s/(\d+)/$1==0?'None':$1==1?'1 reply':$1.'replies'/e], "'regex' attribute is set properly"); 
     183 
     184diag("Testing compilation of nesting a block tag"); 
    140185$tokens = $builder->compile($ctx, <<'TEXT'); 
    141186<MTBars> 
     
    144189</MTBars> 
    145190TEXT 
    146 ok($tokens && ref($tokens) eq 'ARRAY'); 
    147 ok(@$tokens == 2); 
    148 ok($tokens->[0][0] eq 'Bars'); 
    149 ok(ref($tokens->[0][2]) eq 'ARRAY'); 
    150 ok(@{ $tokens->[0][2] } == 3); 
    151 ok($tokens->[0][2][0][0] eq 'TEXT'); 
    152 ok($tokens->[0][2][0][1] eq "\nBars:\n"); 
    153 ok($tokens->[0][2][1][0] eq 'Bars'); 
    154 ok(ref($tokens->[0][2][1][2]) eq 'ARRAY'); 
    155 ok(@{ $tokens->[0][2][1][2] } == 1); 
    156 ok($tokens->[0][2][1][2][0][0] eq 'TEXT'); 
    157 ok($tokens->[0][2][1][2][0][1] eq 'bar'); 
    158 ok($tokens->[0][2][2][0] eq 'TEXT'); 
    159 ok($tokens->[0][2][2][1] eq "\n"); 
    160 ok($tokens->[1][0] eq 'TEXT'); 
    161 ok($tokens->[1][1] eq "\n"); 
    162 is($builder->build($ctx, $tokens), "\nBars:\nbarbar\n\nBars:\nbarbar\n\n"); 
    163  
     191diag("Error: " . $builder->errstr) unless $tokens; 
     192ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     193ok(@$tokens == 2, "Created 2 tokens"); 
     194ok($tokens->[0][0] eq 'Bars', "Token 1 is a tag token"); 
     195ok(ref($tokens->[0][2]) eq 'ARRAY', "Token 1 has subtokens"); 
     196ok(@{ $tokens->[0][2] } == 3, "Subtoken length is 3"); 
     197ok($tokens->[0][2][0][0] eq 'TEXT', "Subtoken 1 is textual"); 
     198ok($tokens->[0][2][0][1] eq "\nBars:\n", "Subtoken 1 is expected value"); 
     199ok($tokens->[0][2][1][0] eq 'Bars', "Subtoken 2 is a tag token"); 
     200ok(ref($tokens->[0][2][1][2]) eq 'ARRAY', "Subtoken 2 contains subtokens"); 
     201ok(@{ $tokens->[0][2][1][2] } == 1, "Subtoken 2 has 1 child token"); 
     202ok($tokens->[0][2][1][2][0][0] eq 'TEXT', "Subtoken 2's child node is textual"); 
     203ok($tokens->[0][2][1][2][0][1] eq 'bar', "Subtoken 2's child node is expected value"); 
     204ok($tokens->[0][2][2][0] eq 'TEXT', "Subtoken 3 is textual"); 
     205ok($tokens->[0][2][2][1] eq "\n", "Subtoken 3 is expected value"); 
     206ok($tokens->[1][0] eq 'TEXT', "Token 2 is textual"); 
     207ok($tokens->[1][1] eq "\n", "Token 2 is expected value"); 
     208is($builder->build($ctx, $tokens), "\nBars:\nbarbar\n\nBars:\nbarbar\n\n", "Building produces expected result"); 
     209 
     210diag("Testing compilation of an empty block tag (singlet syntax)"); 
    164211$tokens = $builder->compile($ctx, "<MTBars/>"); 
    165 ok($tokens && ref($tokens) eq 'ARRAY'); 
    166 ok(@$tokens == 1); 
    167 ok($tokens->[0][0] eq 'Bars'); 
    168 ok(!$tokens->[0][2]); 
    169 is($builder->build($ctx, $tokens), 'Called without tokens!'); 
    170  
     212diag("Error: " . $builder->errstr) unless $tokens; 
     213ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     214ok(@$tokens == 1, "Created 1 token"); 
     215ok($tokens->[0][0] eq 'Bars', "Token is a tag token"); 
     216ok(!@{ $tokens->[0][2] || [] }, "Subtoken list is empty"); 
     217is($builder->build($ctx, $tokens), 'Called without tokens!', "Building produces expected result"); 
     218 
     219diag("Testing compilation with an attribute that has a newline"); 
    171220$tokens = $builder->compile($ctx, '<$MTFoo no="1 
    172221"$>'); 
    173 ok($tokens && ref($tokens) eq 'ARRAY'); 
    174 ok(@$tokens == 1); 
    175 ok(@{ $tokens->[0] } == 7); 
    176 ok($tokens->[0][0] eq 'Foo'); 
    177 ok(ref($tokens->[0][1]) eq 'HASH'); 
    178 is($tokens->[0][1]{no}, "1\n"); 
    179 is($builder->build($ctx, $tokens), 'no foo'); 
    180  
     222diag("Error: " . $builder->errstr) unless $tokens; 
     223ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     224ok(@$tokens == 1, "Created 1 token"); 
     225ok(@{ $tokens->[0] } == 7, "Length of token object is 7 elements"); 
     226ok($tokens->[0][0] eq 'Foo', "Token 1 is a tag token"); 
     227ok(ref($tokens->[0][1]) eq 'HASH', "Token 1 has an attribute hashref"); 
     228is($tokens->[0][1]{no}, "1\n", "Value of 'no' attribute is set properly"); 
     229is($builder->build($ctx, $tokens), 'no foo', "Building produces expected result"); 
     230 
     231diag("Testing conditional tag"); 
    181232$tokens = $builder->compile($ctx, '<MTIfBaz>yes</MTIfBaz>'); 
    182 ok($tokens && ref($tokens) eq 'ARRAY'); 
    183 is($builder->build($ctx, $tokens, { IfBaz => 1 }), 'yes'); 
    184 is($builder->build($ctx, $tokens, { IfBaz => 0 }), ''); 
    185  
     233diag("Error: " . $builder->errstr) unless $tokens; 
     234ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields token"); 
     235is($builder->build($ctx, $tokens, { IfBaz => 1 }), 'yes', "Building with conditional set produces expected result"); 
     236is($builder->build($ctx, $tokens, { IfBaz => 0 }), '', "Building with conditional unset produces expected result"); 
     237 
     238diag("Testing conditional tags with Else tag"); 
    186239$tokens = $builder->compile($ctx, '<MTIfBaz>yes<MTElse>no</MTElse></MTIfBaz>'); 
    187 ok($tokens && ref($tokens) eq 'ARRAY'); 
    188 is($builder->build($ctx, $tokens, { IfBaz => 1 }), 'yes'); 
    189 is($builder->build($ctx, $tokens, { IfBaz => 0 }), 'no'); 
     240diag("Error: " . $builder->errstr) unless $tokens; 
     241ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields token"); 
     242is($builder->build($ctx, $tokens, { IfBaz => 1 }), 'yes', "Building with conditional set produces expected result"); 
     243is($builder->build($ctx, $tokens, { IfBaz => 0 }), 'no', "Building with conditional unset produces expected result"); 
     244 
     245diag("Testing conditional tags with Else (but no closing Else) tag"); 
     246$tokens = $builder->compile($ctx, '<MTIfBaz>yes<MTElse>no</MTIfBaz>'); 
     247diag("Error: " . $builder->errstr) unless $tokens; 
     248ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields token"); 
     249is($builder->build($ctx, $tokens, { IfBaz => 1 }), 'yes', "Building with conditional set produces expected result"); 
     250is($builder->build($ctx, $tokens, { IfBaz => 0 }), 'no', "Building with conditional unset produces expected result"); 
     251 
     252diag("Testing case-insensitivity for MT templates"); 
     253$tokens = $builder->compile($ctx, '<$MtFoO$>'); 
     254diag("Error: " . $builder->errstr) unless $tokens; 
     255ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     256ok(@$tokens == 1, "Created one token"); 
     257ok($tokens->[0][0] eq 'FoO', "Token is a tag token"); 
     258ok(@{ $tokens->[0] } == 7, "Length of token object is 7 elements"); 
     259ok(ref($tokens->[0][1]) eq 'HASH', "Element 1 of token object is a hashref"); 
     260is(scalar keys %{ $tokens->[0][1] }, 0, "Has no attributes"); 
     261is($builder->build($ctx, $tokens), 'foo', "Building produces expected result"); 
     262 
     263diag("Testing optional '$' syntax for function tags"); 
     264$tokens = $builder->compile($ctx, '<mtfoo>'); 
     265diag("Error: " . $builder->errstr) unless $tokens; 
     266ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     267ok(@$tokens == 1, "Created one token"); 
     268ok($tokens->[0][0] eq 'foo', "Token is a tag token"); 
     269ok(@{ $tokens->[0] } == 7, "Length of token object is 7 elements"); 
     270ok(ref($tokens->[0][1]) eq 'HASH', "Element 1 of token object is a hashref"); 
     271is(scalar keys %{ $tokens->[0][1] }, 0, "Has no attributes"); 
     272is($builder->build($ctx, $tokens), 'foo', "Building produces expected result"); 
     273 
     274diag("Testing optional namespace ':' syntax for function tags"); 
     275$tokens = $builder->compile($ctx, '<mt:foo>'); 
     276diag("Error: " . $builder->errstr) unless $tokens; 
     277ok($tokens && ref($tokens) eq 'ARRAY', "Compiles and yields tokens"); 
     278ok(@$tokens == 1, "Created one token"); 
     279ok($tokens->[0][0] eq 'foo', "Token is a tag token"); 
     280ok(@{ $tokens->[0] } == 7, "Length of token object is 7 elements"); 
     281ok(ref($tokens->[0][1]) eq 'HASH', "Element 1 of token object is a hashref"); 
     282is(scalar keys %{ $tokens->[0][1] }, 0, "Has no attributes"); 
     283is($builder->build($ctx, $tokens), 'foo', "Building produces expected result"); 
    190284 
    191285 
    192286package My::Context; 
     287 
    193288use strict; 
    194  
    195 use MT::ErrorHandler; 
    196 use base qw( MT::ErrorHandler ); 
     289use base qw( MT::Template::Context ); 
    197290 
    198291sub new { 
    199292    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; 
     293    my $ctx = $class->SUPER::new(@_); 
     294    $ctx->{__handlers}{foo} = \&_hdlr_foo; 
     295    $ctx->{__handlers}{bars} = [ \&_hdlr_bars, 1 ]; 
     296    $ctx->{__handlers}{barbaz} = \&_hdlr_bar_baz; 
     297    $ctx->{__handlers}{ifbaz} = [ \&MT::Template::Context::_hdlr_pass_tokens, 1 ]; 
     298    return $ctx; 
    207299} 
    208  
    209 sub stash { 
    210     my $ctx = shift; 
    211     my $key = shift; 
    212     $ctx->{__stash}->{$key} = shift if @_; 
    213     $ctx->{__stash}->{$key}; 
    214 } 
    215  
    216 sub register_handler { $_[0]->{__handlers}{$_[1]} = $_[2] } 
    217 sub handler_for      { 
    218     my $v = $_[0]->{__handlers}{$_[1]}; 
    219     ref($v) eq 'ARRAY' ? @$v : $v 
    220 } 
    221  
    222 sub post_process_handler { } 
    223300 
    224301sub _hdlr_foo { 
     
    227304} 
    228305 
    229 sub _hdlr_pass_tokens { 
    230     my($ctx, $args, $cond) = @_; 
    231     $ctx->stash('builder')->build($ctx, $ctx->stash('tokens'), $cond); 
    232 } 
    233  
    234306sub _hdlr_bars { 
    235307    my($ctx) = @_; 
    236308    my $tokens = $ctx->stash('tokens'); 
    237     return 'Called without tokens!' if !$tokens
     309    return 'Called without tokens!' if !$tokens || !@$tokens
    238310    my $builder = $ctx->stash('builder'); 
    239311    my $html = '';