| #!perl |
| # |
| # test apparatus for Text::Template module |
| # still incomplete. |
| |
| use Text::Template; |
| |
| BEGIN { |
| eval "use Safe"; |
| if ($@) { |
| print "1..0\n"; |
| exit 0; |
| } |
| } |
| |
| die "This is the test program for Text::Template version 1.46. |
| You are using version $Text::Template::VERSION instead. |
| That does not make sense.\n |
| Aborting" |
| unless $Text::Template::VERSION == 1.46; |
| |
| print "1..16\n"; |
| |
| if ($^O eq 'MacOS') { |
| $BADOP = qq{}; |
| $FAILURE = q{}; |
| } else { |
| $BADOP = qq{kill 0}; |
| $FAILURE = q{Program fragment at line 1 delivered error ``kill trapped by operation mask''}; |
| } |
| |
| $n=1; |
| $v = $v = 119; |
| |
| $c = new Safe or die; |
| |
| $goodtemplate = q{This should succeed: { $v }}; |
| $goodoutput = q{This should succeed: 119}; |
| |
| $template1 = new Text::Template ('type' => 'STRING', 'source' => $goodtemplate) |
| or die; |
| $template2 = new Text::Template ('type' => 'STRING', 'source' => $goodtemplate) |
| or die; |
| |
| $text1 = $template1->fill_in(); |
| $text2 = $template1->fill_in(SAFE => $c); |
| $ERR2 = $@; |
| $text3 = $template2->fill_in(SAFE => $c); |
| $ERR3 = $@; |
| |
| # (1)(2)(3) None of these should have failed. |
| print +(defined $text1 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| print +(defined $text2 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| print +(defined $text3 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| |
| # (4) Safe and non-safe fills of different template objects with the |
| # same template text should yield the same result. |
| # print +($text1 eq $text3 ? '' : 'not '), "ok $n\n"; |
| # (4) voided this test: it's not true, because the unsafe fill |
| # uses package main, while the safe fill uses the secret safe package. |
| # We could alias the secret safe package to be identical to main, |
| # but that wouldn't be safe. If you want the aliasing, you have to |
| # request it explicitly with `PACKAGE'. |
| print "ok $n\n"; |
| $n++; |
| |
| # (5) Safe and non-safe fills of the same template object |
| # should yield the same result. |
| # (5) voided this test for the same reason as #4. |
| # print +($text1 eq $text2 ? '' : 'not '), "ok $n\n"; |
| print "ok $n\n"; |
| $n++; |
| |
| # (6) Make sure the output was actually correct |
| print +($text1 eq $goodoutput ? '' : 'not '), "ok $n\n"; |
| $n++; |
| |
| |
| $badtemplate = qq{This should fail: { $BADOP; 'NOFAIL' }}; |
| $badnosafeoutput = q{This should fail: NOFAIL}; |
| $badsafeoutput = q{This should fail: Program fragment delivered error ``kill trapped by operation mask at template line 1.''}; |
| |
| $template1 = new Text::Template ('type' => 'STRING', 'source' => $badtemplate) |
| or die; |
| $template2 = new Text::Template ('type' => 'STRING', 'source' => $badtemplate) |
| or die; |
| |
| $text1 = $template1->fill_in(); |
| $text2 = $template1->fill_in(SAFE => $c); |
| $ERR2 = $@; |
| $text3 = $template2->fill_in(SAFE => $c); |
| $ERR3 = $@; |
| $text4 = $template1->fill_in(); |
| |
| # (7)(8)(9)(10) None of these should have failed. |
| print +(defined $text1 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| print +(defined $text2 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| print +(defined $text3 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| print +(defined $text4 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| |
| # (11) text1 and text4 should be the same (using safe in between |
| # didn't change anything.) |
| print +($text1 eq $text4 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| |
| # (12) text2 and text3 should be the same (same template text in different |
| # objects |
| print +($text2 eq $text3 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| |
| # (13) text1 should yield badnosafeoutput |
| print +($text1 eq $badnosafeoutput ? '' : 'not '), "ok $n\n"; |
| $n++; |
| |
| # (14) text2 should yield badsafeoutput |
| $text2 =~ s/'kill'/kill/; # 5.8.1 added quote marks around the op name |
| print "# expected: <$badsafeoutput>\n# got : <$text2>\n"; |
| print +($text2 eq $badsafeoutput ? '' : 'not '), "ok $n\n"; |
| $n++; |
| |
| |
| $template = q{{$x=1}{$x+1}}; |
| |
| $template1 = new Text::Template ('type' => 'STRING', 'source' => $template) |
| or die; |
| $template2 = new Text::Template ('type' => 'STRING', 'source' => $template) |
| or die; |
| |
| $text1 = $template1->fill_in(); |
| $text2 = $template1->fill_in(SAFE => new Safe); |
| |
| # (15) Do effects persist in safe compartments? |
| print +($text1 eq $text2 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| |
| # (16) Try the BROKEN routine in safe compartments |
| sub my_broken { |
| my %a = @_; $a{error} =~ s/ at.*//s; |
| "OK! text:$a{text} error:$a{error} lineno:$a{lineno} arg:$a{arg}" ; |
| } |
| $templateB = new Text::Template (TYPE => 'STRING', SOURCE => '{die}') |
| or die; |
| $text1 = $templateB->fill_in(BROKEN => \&my_broken, |
| BROKEN_ARG => 'barg', |
| SAFE => new Safe, |
| ); |
| $result1 = qq{OK! text:die error:Died lineno:1 arg:barg}; |
| print +($text1 eq $result1 ? '' : 'not '), "ok $n\n"; |
| $n++; |
| |
| |
| |
| exit; |
| |