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 }