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