1 module temple.tests.common; 2 3 version(unittest): 4 public import std.stdio, std.file : readText; 5 public import 6 temple, 7 temple.util, 8 temple.output_stream; 9 10 bool isSameRender(in CompiledTemple t, TempleContext tc, string r2) { 11 return isSameRender(t, r2, tc); 12 } 13 bool isSameRender(in CompiledTemple t, string r2, TempleContext tc = null) { 14 return isSameRender(t.toString(tc), r2); 15 } 16 bool isSameRender(string r1, string r2) 17 { 18 auto ret = r1.stripWs == r2.stripWs; 19 20 if(ret == false) 21 { 22 writeln("Renders differ: "); 23 writeln("Got: -------------------------"); 24 writeln(r1); 25 writeln("Expected: --------------------"); 26 writeln(r2); 27 writeln("------------------------------"); 28 } 29 30 return ret; 31 } 32 33 string templeToString(CompiledTemple function() getr, TempleContext tc = null) { 34 return getr().toString(tc); 35 } 36 37 unittest 38 { 39 auto render = compile_temple!""; 40 assert(render.toString() == ""); 41 } 42 43 unittest 44 { 45 //Test to!string of eval delimers 46 alias render = compile_temple!`<%= "foo" %>`; 47 assert(templeToString(&render) == "foo"); 48 } 49 50 unittest 51 { 52 // Test delimer parsing 53 alias render = compile_temple!("<% if(true) { %>foo<% } %>"); 54 assert(templeToString(&render) == "foo"); 55 } 56 unittest 57 { 58 //Test raw text with no delimers 59 alias render = compile_temple!(`foo`); 60 assert(templeToString(&render) == "foo"); 61 } 62 63 unittest 64 { 65 //Test looping 66 const templ = `<% foreach(i; 0..3) { %>foo<% } %>`; 67 alias render = compile_temple!templ; 68 assert(templeToString(&render) == "foofoofoo"); 69 } 70 71 unittest 72 { 73 //Test looping 74 const templ = `<% foreach(i; 0..3) { %><%= i %><% } %>`; 75 alias render = compile_temple!templ; 76 assert(templeToString(&render) == "012"); 77 } 78 79 unittest 80 { 81 //Test escaping of " 82 const templ = `"`; 83 alias render = compile_temple!templ; 84 assert(templeToString(&render) == `"`); 85 } 86 87 unittest 88 { 89 //Test escaping of ' 90 const templ = `'`; 91 alias render = compile_temple!templ; 92 assert(templeToString(&render) == `'`); 93 } 94 95 unittest 96 { 97 alias render = compile_temple!`"%"`; 98 assert(templeToString(&render) == `"%"`); 99 } 100 101 unittest 102 { 103 // Test shorthand 104 const templ = ` 105 % if(true) { 106 Hello! 107 % } 108 `; 109 alias render = compile_temple!(templ); 110 assert(isSameRender(templeToString(&render), "Hello!")); 111 } 112 113 unittest 114 { 115 // Test shorthand string eval 116 const templ = ` 117 % if(true) { 118 %= "foo" 119 % } 120 `; 121 alias render = compile_temple!(templ); 122 //static assert(false); 123 assert(isSameRender(templeToString(&render), "foo")); 124 } 125 unittest 126 { 127 // Test shorthand only after newline 128 const templ = `foo%bar`; 129 alias render = compile_temple!(templ); 130 assert(templeToString(&render) == "foo%bar"); 131 } 132 133 unittest 134 { 135 // Ditto 136 alias render = compile_temple!`<%= "foo%bar" %>`; 137 assert(templeToString(&render) == "foo%bar"); 138 } 139 140 unittest 141 { 142 auto context = new TempleContext(); 143 context.foo = 123; 144 context.bar = "test"; 145 146 alias render = compile_temple!`<%= var("foo") %> <%= var("bar") %>`; 147 assert(templeToString(&render, context) == "123 test"); 148 } 149 150 unittest 151 { 152 // Loading templates from a file 153 alias render = compile_temple_file!"test1.emd"; 154 auto compare = readText("test/test1.emd.txt"); 155 assert(isSameRender(templeToString(&render), compare)); 156 } 157 158 unittest 159 { 160 alias render = compile_temple_file!"test2.emd"; 161 auto compare = readText("test/test2.emd.txt"); 162 163 auto ctx = new TempleContext(); 164 ctx.name = "dymk"; 165 ctx.will_work = true; 166 167 assert(isSameRender(templeToString(&render, ctx), compare)); 168 } 169 170 unittest 171 { 172 alias render = compile_temple_file!"test3_nester.emd"; 173 auto compare = readText("test/test3.emd.txt"); 174 assert(isSameRender(templeToString(&render), compare)); 175 } 176 177 unittest 178 { 179 alias render = compile_temple_file!"test4_root.emd"; 180 auto compare = readText("test/test4.emd.txt"); 181 182 auto ctx = new TempleContext(); 183 ctx.var1 = "this_is_var1"; 184 185 assert(isSameRender(templeToString(&render, ctx), compare)); 186 } 187 188 unittest 189 { 190 auto parent = compile_temple!"before <%= yield %> after"; 191 auto partial = compile_temple!"between"; 192 193 assert(isSameRender(parent.layout(&partial), "before between after")); 194 } 195 196 unittest 197 { 198 auto parent = compile_temple!"before <%= yield %> after"; 199 auto partial = compile_temple!"between"; 200 201 assert(isSameRender(parent.layout(&partial), "before between after")); 202 } 203 204 unittest 205 { 206 auto parent = compile_temple_file!"test5_layout.emd"; 207 auto partial1 = compile_temple_file!"test5_partial1.emd"; 208 auto partial2 = compile_temple_file!"test5_partial2.emd"; 209 210 auto p1 = parent.layout(&partial1); 211 auto p2 = parent.layout(&partial2); 212 213 assert(isSameRender(p1, readText("test/test5_partial1.emd.txt"))); 214 assert(isSameRender(p2, readText("test/test5_partial2.emd.txt"))); 215 } 216 217 // Layouts and contexts 218 unittest 219 { 220 auto parent = compile_temple_file!"test6_layout.emd"; 221 auto partial = compile_temple_file!"test6_partial.emd"; 222 223 auto context = new TempleContext(); 224 context.name = "dymk"; 225 context.uni = "UCSD"; 226 context.age = 19; 227 228 assert(isSameRender(parent.layout(&partial), context, readText("test/test6_partial.emd.txt"))); 229 } 230 231 // opDispatch variable getting 232 unittest 233 { 234 auto render = compile_temple!"<%= var.foo %>"; 235 236 auto context = new TempleContext(); 237 context.foo = "Hello, world"; 238 239 assert(isSameRender(render, context, "Hello, world")); 240 } 241 242 unittest 243 { 244 // 22 Nov, 2014: Disabled this bit, because DMD now ICEs when 245 // evaluating the erronious template (but not before spitting out 246 // a lot of errors). This will have to do for finding out that a templtae 247 // has a lot of errors in it. 248 // Uncomment to view the line numbers inserted into the template 249 //auto render = compile_temple_file!"test7_error.emd"; 250 //TODO: 251 //assert(!__traits(compiles, { 252 // auto t = compile_temple_file!"test7_error.emd"; 253 //})); 254 } 255 256 unittest 257 { 258 import temple.func_string_gen; 259 // Test returning early from templates 260 //auto str = ` 261 alias render = compile_temple!` 262 one 263 % auto blah = true; 264 % if(blah) { 265 two 266 % return; 267 % } 268 three 269 `; 270 271 //writeln(__temple_gen_temple_func_string(str, "Inline")); 272 assert(isSameRender(templeToString(&render), 273 `one 274 two`)); 275 }