1 package org.cacert.gigi.template;
3 import static org.junit.Assert.*;
5 import java.io.CharArrayWriter;
6 import java.io.PrintWriter;
7 import java.io.StringReader;
8 import java.util.HashMap;
9 import java.util.Locale;
12 import org.cacert.gigi.dbObjects.Digest;
13 import org.cacert.gigi.localisation.Language;
14 import org.cacert.gigi.output.HashAlgorithms;
15 import org.cacert.gigi.output.template.IterableDataset;
16 import org.cacert.gigi.output.template.Outputable;
17 import org.cacert.gigi.output.template.OutputableArrayIterable;
18 import org.cacert.gigi.output.template.Template;
19 import org.junit.Test;
21 public class TestTemplate {
23 private String testExecute(Language l, HashMap<String, Object> vars, String input) {
24 Template t = new Template(new StringReader(input));
25 CharArrayWriter caw = new CharArrayWriter();
26 PrintWriter pw = new PrintWriter(caw);
27 t.output(pw, l, vars);
29 return new String(caw.toCharArray());
32 HashMap<String, Object> vars = new HashMap<>();
35 public void testVarEscape() {
36 vars.put("var", "val");
37 assertEquals("vall", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$var?>l"));
38 vars.put("var", "val<");
39 assertEquals("val<l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$var?>l"));
40 assertEquals("val<l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$!var?>l"));
41 vars.put("var", "val\">");
42 assertEquals("val">l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$var?>l"));
43 assertEquals("val\">l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$!var?>l"));
48 public void testVarSprintf() {
49 vars.put("var", "val\">");
50 vars.put("var2", "val3<\"");
51 vars.put("var3", "val4>");
52 assertEquals("This val"> textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This ${var} text?>l"));
53 assertEquals("This val\"> textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This $!{var} text?>l"));
55 assertEquals("This val"> val3<" the val4> textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This ${var} ${var2} the ${var3} text?>l"));
56 assertEquals("This val\"> val3<\" the val4> textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This $!{var} $!{var2} the $!{var3} text?>l"));
58 assertEquals("This blargh<>!, <>! textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This !'blargh<>!', !'<>! 'text?>l"));
59 assertEquals("This blargh<>!, <>!l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This !'blargh<>!', !'<>!'?>l"));
63 public void testIf() {
64 vars.put("existent", "val");
65 assertEquals(">existent<", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($existent) { ?>>existent<? } ?><<? if($nonexistent) { ?>nonexistent<? } ?>"));
69 public void testForeach() {
70 vars.put("it", new IterableDataset() {
75 public boolean next(Language l, Map<String, Object> vars) {
76 vars.put("e", Integer.toString(i++));
80 assertEquals("012345678<", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? foreach($it) { ?><?=$e?><? } ?><<? foreach($nonexistent) { ?>nonexistent<? } ?>"));
84 public void testNullContent() {
85 assertEquals("<null>", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<<?=$undef?>>"));
90 public void testTranslate() {
91 assertEquals("<null>", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_<null>?>"));
96 public void testOutputable() {
97 Outputable o = new Outputable() {
100 public void output(PrintWriter out, Language l, Map<String, Object> vars) {
104 vars.put("v", new OutputableArrayIterable(new Object[] {
107 assertEquals("[0]bl[1]bl[2]bl[3]bl[4]bl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? foreach($v) { ?>[<?=$i?>]<?=$e?><? } ?>"));
112 public void testHashalgs() {
113 vars.put("v", new HashAlgorithms(Digest.SHA256));
114 assertEquals("SHA256[ checked='checked']SHA384[]SHA512[]", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? foreach($v) { ?><?=$algorithm?>[<?=$!checked?>]<? } ?>"));
119 public void testInvalidBracketContent() {
121 assertEquals("", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? } ?>"));
122 fail("should throw an error");
129 public void testIfElse() {
130 vars.put("b", Boolean.TRUE);
131 assertEquals("true", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($b){ ?>true<? } else{?>false<?}?>"));
132 vars.put("b", Boolean.FALSE);
133 assertEquals("false", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($b){ ?>true<? } else{?>false<?}?>"));
135 vars.put("b", new Object());
136 assertEquals("true", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($b){ ?>true<? } else{?>false<?}?>"));
138 assertEquals("false", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($b){ ?>true<? } else{?>false<?}?>"));
142 public void testIgnoredNewline() {
143 assertEquals("\\ab\\\\n\n\\c", testExecute(Language.getInstance(Locale.ENGLISH), vars, "\\a\\\nb\\\\n\n\\\\\nc"));
144 assertEquals("a\\b\\c", testExecute(Language.getInstance(Locale.ENGLISH), vars, "a\\b\\\n\\c"));
145 // \r's are currently not valid.
146 assertEquals("a\\\r\nb", testExecute(Language.getInstance(Locale.ENGLISH), vars, "a\\\r\nb"));