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 }