1 package club.wpia.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.junit.Test;
14 import club.wpia.gigi.dbObjects.Digest;
15 import club.wpia.gigi.localisation.Language;
16 import club.wpia.gigi.output.HashAlgorithms;
17 import club.wpia.gigi.output.template.IterableDataset;
18 import club.wpia.gigi.output.template.Outputable;
19 import club.wpia.gigi.output.template.OutputableArrayIterable;
20 import club.wpia.gigi.output.template.Template;
22 public class TestTemplate {
24 private String testExecute(Language l, HashMap<String, Object> vars, String input) {
25 Template t = new Template(new StringReader(input));
26 CharArrayWriter caw = new CharArrayWriter();
27 PrintWriter pw = new PrintWriter(caw);
28 t.output(pw, l, vars);
30 return new String(caw.toCharArray());
33 HashMap<String, Object> vars = new HashMap<>();
36 public void testVarEscape() {
37 vars.put("var", "val");
38 assertEquals("vall", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$var?>l"));
39 vars.put("var", "val<");
40 assertEquals("val<l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$var?>l"));
41 assertEquals("val<l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$!var?>l"));
42 vars.put("var", "val\">");
43 assertEquals("val">l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$var?>l"));
44 assertEquals("val\">l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=$!var?>l"));
49 public void testVarSprintf() {
50 vars.put("var", "val\">");
51 vars.put("var2", "val3<\"");
52 vars.put("var3", "val4>");
53 assertEquals("This val"> textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This ${var} text?>l"));
54 assertEquals("This val\"> textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This $!{var} text?>l"));
56 assertEquals("This val"> val3<" the val4> textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This ${var} ${var2} the ${var3} text?>l"));
57 assertEquals("This val\"> val3<\" the val4> textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This $!{var} $!{var2} the $!{var3} text?>l"));
59 assertEquals("This blargh<>!, <>! textl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This !'blargh<>!', !'<>! 'text?>l"));
60 assertEquals("This blargh<>!, <>!l", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_This !'blargh<>!', !'<>!'?>l"));
64 public void testIf() {
65 vars.put("existent", "val");
66 assertEquals(">existent<", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($existent) { ?>>existent<? } ?><<? if($nonexistent) { ?>nonexistent<? } ?>"));
70 public void testForeach() {
71 vars.put("it", new IterableDataset() {
76 public boolean next(Language l, Map<String, Object> vars) {
77 vars.put("e", Integer.toString(i++));
81 assertEquals("012345678<", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? foreach($it) { ?><?=$e?><? } ?><<? foreach($nonexistent) { ?>nonexistent<? } ?>"));
85 public void testNullContent() {
86 assertEquals("<null>", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<<?=$undef?>>"));
91 public void testTranslate() {
92 assertEquals("<null>", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<?=_<null>?>"));
97 public void testOutputable() {
98 Outputable o = new Outputable() {
101 public void output(PrintWriter out, Language l, Map<String, Object> vars) {
105 vars.put("v", new OutputableArrayIterable(new Object[] {
108 assertEquals("[0]bl[1]bl[2]bl[3]bl[4]bl", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? foreach($v) { ?>[<?=$i?>]<?=$e?><? } ?>"));
113 public void testHashalgs() {
114 vars.put("v", new HashAlgorithms(Digest.SHA256));
115 assertEquals("SHA256[ checked='checked']SHA384[]SHA512[]", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? foreach($v) { ?><?=$algorithm?>[<?=$!checked?>]<? } ?>"));
120 public void testInvalidBracketContent() {
122 assertEquals("", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? } ?>"));
123 fail("should throw an error");
130 public void testIfElse() {
131 vars.put("b", Boolean.TRUE);
132 assertEquals("true", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($b){ ?>true<? } else{?>false<?}?>"));
133 vars.put("b", Boolean.FALSE);
134 assertEquals("false", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($b){ ?>true<? } else{?>false<?}?>"));
136 vars.put("b", new Object());
137 assertEquals("true", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($b){ ?>true<? } else{?>false<?}?>"));
139 assertEquals("false", testExecute(Language.getInstance(Locale.ENGLISH), vars, "<? if($b){ ?>true<? } else{?>false<?}?>"));
143 public void testIgnoredNewline() {
144 assertEquals("\\ab\\\\n\n\\c", testExecute(Language.getInstance(Locale.ENGLISH), vars, "\\a\\\nb\\\\n\n\\\\\nc"));
145 assertEquals("a\\b\\c", testExecute(Language.getInstance(Locale.ENGLISH), vars, "a\\b\\\n\\c"));
146 // \r's are now valid.
147 assertEquals("ab", testExecute(Language.getInstance(Locale.ENGLISH), vars, "a\\\r\nb"));