1 // Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
2 // Licensed under the MIT License:
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
5 // of this software and associated documentation files (the "Software"), to deal
6 // in the Software without restriction, including without limitation the rights
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 // copies of the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 // THE SOFTWARE.
21 
22 module capnproto.tests.TestUtil;
23 
24 import capnproto;
25 
26 import capnproto.tests.test;
27 import capnproto.tests.testimport;
28 
29 struct TestUtil
30 {
31 	static ubyte[] data(string str)
32 	{
33 		return cast(ubyte[])str;
34 	}
35 	
36 	static void initTestMessage(TestAllTypes.Builder builder)
37 	{
38 		builder.setVoidField();
39 		builder.setBoolField(true);
40 		builder.setInt8Field(-123);
41 		builder.setInt16Field(-12345);
42 		builder.setInt32Field(-12345678);
43 		builder.setInt64Field(-123456789012345L);
44 		builder.setUInt8Field(0xea);
45 		builder.setUInt16Field(0x4567);
46 		builder.setUInt32Field(0x34567890);
47 		builder.setUInt64Field(0x1234567890123456L);
48 		builder.setFloat32Field(1234.5f);
49 		builder.setFloat64Field(-123e45);
50 		builder.setTextField("foo");
51 		builder.setDataField(data("bar"));
52 		
53 		{
54 			auto subBuilder = builder.initStructField();
55 			subBuilder.setVoidField();
56 			subBuilder.setBoolField(true);
57 			subBuilder.setInt8Field(-12);
58 			subBuilder.setInt16Field(3456);
59 			subBuilder.setInt32Field(-78901234);
60 			subBuilder.setInt64Field(56789012345678L);
61 			subBuilder.setUInt8Field(90);
62 			subBuilder.setUInt16Field(1234);
63 			subBuilder.setUInt32Field(56789012);
64 			subBuilder.setUInt64Field(345678901234567890L);
65 			subBuilder.setFloat32Field(-1.25e-10f);
66 			subBuilder.setFloat64Field(345);
67 			subBuilder.setTextField(Text.Reader("baz"));
68 			subBuilder.setDataField(data("qux"));
69 			
70 			{
71 				auto subSubBuilder = subBuilder.initStructField();
72 				subSubBuilder.setTextField(Text.Reader("nested"));
73 				subSubBuilder.initStructField().setTextField(Text.Reader("really nested"));
74 			}
75 			
76 			subBuilder.setEnumField(TestEnum.baz);
77 			
78 			auto boolList = subBuilder.initBoolList(5);
79 			boolList.set(0, false);
80 			boolList.set(1, true);
81 			boolList.set(2, false);
82 			boolList.set(3, true);
83 			boolList.set(4, true);
84 		}
85 		
86 		builder.setEnumField(TestEnum.corge);
87 		builder.initVoidList(6);
88 		
89 		auto boolList = builder.initBoolList(4);
90 		boolList.set(0, true);
91 		boolList.set(1, false);
92 		boolList.set(2, false);
93 		boolList.set(3, true);
94 		
95 		auto float64List = builder.initFloat64List(4);
96 		float64List.set(0, 7777.75);
97 		float64List.set(1, double.infinity);
98 		float64List.set(2, -double.infinity);
99 		float64List.set(3, double.nan);
100 		
101 		auto textList = builder.initTextList(3);
102 		textList.set(0, Text.Reader("plugh"));
103 		textList.set(1, Text.Reader("xyzzy"));
104 		textList.set(2, Text.Reader("thud"));
105 		
106 		auto structList = builder.initStructList(3);
107 		structList.get(0).setTextField(Text.Reader("structlist 1"));
108 		structList.get(1).setTextField(Text.Reader("structlist 2"));
109 		structList.get(2).setTextField(Text.Reader("structlist 3"));
110 		
111 		auto enumList = builder.initEnumList(2);
112 		enumList.set(0, TestEnum.foo);
113 		enumList.set(1, TestEnum.garply);
114 	}
115 	
116 	static void checkTestMessage(TestAllTypes.Builder builder)
117 	{
118 		builder.getVoidField();
119 		assert(builder.getBoolField() == true);
120 		assert(builder.getInt8Field() == -123);
121 		assert(builder.getInt16Field() == -12345);
122 		assert(builder.getInt32Field() == -12345678);
123 		assert(builder.getInt64Field() == -123456789012345L);
124 		assert(builder.getUInt8Field() == 0xea);
125 		assert(builder.getUInt16Field() == 0x4567);
126 		assert(builder.getUInt32Field() == 0x34567890);
127 		assert(builder.getUInt64Field() == 0x1234567890123456L);
128 		assert(builder.getFloat32Field() == 1234.5f);
129 		assert(builder.getFloat64Field() == -123e45);
130 		assert(builder.getTextField().toString() == "foo");
131 		
132 		{
133 			auto subBuilder = builder.getStructField();
134 			subBuilder.getVoidField();
135 			assert(subBuilder.getBoolField() == true);
136 			assert(subBuilder.getInt8Field() == -12);
137 			assert(subBuilder.getInt16Field() == 3456);
138 			assert(subBuilder.getInt32Field() == -78901234);
139 			assert(subBuilder.getInt64Field() == 56789012345678L);
140 			assert(subBuilder.getUInt8Field() == 90);
141 			assert(subBuilder.getUInt16Field() == 1234);
142 			assert(subBuilder.getUInt32Field() == 56789012);
143 			assert(subBuilder.getUInt64Field() == 345678901234567890L);
144 			assert(subBuilder.getFloat32Field() == -1.25e-10f);
145 			assert(subBuilder.getFloat64Field() == 345);
146 			
147 			{
148 				auto subSubBuilder = subBuilder.getStructField();
149 				assert(subSubBuilder.getTextField().toString() == "nested");
150 			}
151 			
152 			assert(subBuilder.getEnumField() == TestEnum.baz);
153 			
154 			auto boolList = subBuilder.getBoolList();
155 			assert(boolList.get(0) == false);
156 			assert(boolList.get(1) == true);
157 			assert(boolList.get(2) == false);
158 			assert(boolList.get(3) == true);
159 			assert(boolList.get(4) == true);
160 		}
161 		assert(builder.getEnumField() == TestEnum.corge);
162 		
163 		assert(builder.getVoidList().length == 6);
164 		
165 		auto boolList = builder.getBoolList();
166 		assert(boolList.get(0) == true);
167 		assert(boolList.get(1) == false);
168 		assert(boolList.get(2) == false);
169 		assert(boolList.get(3) == true);
170 		
171 		auto float64List = builder.getFloat64List();
172 		assert(float64List.get(0) == 7777.75);
173 		assert(float64List.get(1) == double.infinity);
174 		assert(float64List.get(2) == -double.infinity);
175 		assert(float64List.get(3) != float64List.get(3)); // NaN;
176 		
177 		auto textList = builder.getTextList();
178 		assert(textList.length == 3);
179 		assert(textList.get(0).toString() == "plugh");
180 		assert(textList.get(1).toString() == "xyzzy");
181 		assert(textList.get(2).toString() == "thud");
182 		
183 		auto structList = builder.getStructList();
184 		assert(structList.length == 3);
185 		assert(structList.get(0).getTextField().toString() == "structlist 1");
186 		assert(structList.get(1).getTextField().toString() == "structlist 2");
187 		assert(structList.get(2).getTextField().toString() == "structlist 3");
188 		
189 		auto enumList = builder.getEnumList();
190 		assert(enumList.get(0) == TestEnum.foo);
191 		assert(enumList.get(1) == TestEnum.garply);
192 	};
193 	
194 	static void checkTestMessage(TestAllTypes.Reader reader)
195 	{
196 		reader.getVoidField();
197 		assert(reader.getBoolField() == true);
198 		assert(reader.getInt8Field() == -123);
199 		assert(reader.getInt16Field() == -12345);
200 		assert(reader.getInt32Field() == -12345678);
201 		assert(reader.getInt64Field() == -123456789012345L);
202 		assert(reader.getUInt8Field() == 0xea);
203 		assert(reader.getUInt16Field() == 0x4567);
204 		assert(reader.getUInt32Field() == 0x34567890);
205 		assert(reader.getUInt64Field() == 0x1234567890123456L);
206 		assert(reader.getFloat32Field() == 1234.5f);
207 		assert(reader.getFloat64Field() == -123e45);
208 		assert(reader.getTextField() == "foo");
209 		
210 		{
211 			auto subReader = reader.getStructField();
212 			subReader.getVoidField();
213 			assert(subReader.getBoolField() == true);
214 			assert(subReader.getInt8Field() == -12);
215 			assert(subReader.getInt16Field() == 3456);
216 			assert(subReader.getInt32Field() == -78901234);
217 			assert(subReader.getInt64Field() == 56789012345678L);
218 			assert(subReader.getUInt8Field() == 90);
219 			assert(subReader.getUInt16Field() == 1234);
220 			assert(subReader.getUInt32Field() == 56789012);
221 			assert(subReader.getUInt64Field() == 345678901234567890L);
222 			assert(subReader.getFloat32Field() == -1.25e-10f);
223 			assert(subReader.getFloat64Field() == 345);
224 			
225 			{
226 				auto subSubReader = subReader.getStructField();
227 				assert(subSubReader.getTextField() == "nested");
228 			}
229 			auto boolList = subReader.getBoolList();
230 			assert(boolList.get(0) == false);
231 			assert(boolList.get(1) == true);
232 			assert(boolList.get(2) == false);
233 			assert(boolList.get(3) == true);
234 			assert(boolList.get(4) == true);
235 		}
236 		
237 		assert(reader.getVoidList().length == 6);
238 		
239 		auto boolList = reader.getBoolList();
240 		assert(boolList.get(0) == true);
241 		assert(boolList.get(1) == false);
242 		assert(boolList.get(2) == false);
243 		assert(boolList.get(3) == true);
244 		
245 		auto float64List = reader.getFloat64List();
246 		assert(float64List.get(0) == 7777.75);
247 		assert(float64List.get(1) == double.infinity);
248 		assert(float64List.get(2) == -double.infinity);
249 		assert(float64List.get(3) != float64List.get(3)); // NaN;
250 		
251 		auto textList = reader.getTextList();
252 		assert(textList.length == 3);
253 		assert(textList.get(0) == "plugh");
254 		assert(textList.get(1) == "xyzzy");
255 		assert(textList.get(2) == "thud");
256 		
257 		auto structList = reader.getStructList();
258 		assert(3 == structList.length);
259 		assert(structList.get(0).getTextField() == "structlist 1");
260 		assert(structList.get(1).getTextField() == "structlist 2");
261 		assert(structList.get(2).getTextField() == "structlist 3");
262 		
263 		auto enumList = reader.getEnumList();
264 		assert(enumList.get(0) == TestEnum.foo);
265 		assert(enumList.get(1) == TestEnum.garply);
266 	};
267 	
268 	static void checkDefaultMessage(TestDefaults.Builder builder)
269 	{
270 		builder.getVoidField();
271 		assert(builder.getBoolField() == true);
272 		assert(builder.getInt8Field() == -123);
273 		assert(builder.getInt16Field() == -12345);
274 		assert(builder.getInt32Field() == -12345678);
275 		assert(builder.getInt64Field() == -123456789012345L);
276 		assert(builder.getUInt8Field() == 0xea);
277 		assert(builder.getUInt16Field() == 45678);
278 		assert(builder.getUInt32Field() == 0xce0a6a14);
279 		assert(builder.getUInt64Field() == 0xab54a98ceb1f0ad2L);
280 		assert(builder.getFloat32Field() == 1234.5f);
281 		assert(builder.getFloat64Field() == -123e45);
282 		assert(builder.getEnumField() == TestEnum.corge);
283 		
284 		assert(builder.getTextField().toString() == "foo");
285 		assert(builder.getDataField().toArray() == [0x62, 0x61, 0x72]);
286 	}
287 	
288 	static void checkDefaultMessage(TestDefaults.Reader reader)
289 	{
290 		reader.getVoidField();
291 		assert(reader.getBoolField() == true);
292 		assert(reader.getInt8Field() == -123);
293 		assert(reader.getInt16Field() == -12345);
294 		assert(reader.getInt32Field() == -12345678);
295 		assert(reader.getInt64Field() == -123456789012345L);
296 		assert(reader.getUInt8Field() == 0xea);
297 		assert(reader.getUInt16Field() == 45678);
298 		assert(reader.getUInt32Field() == 0xce0a6a14);
299 		assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad2L);
300 		assert(reader.getFloat32Field() == 1234.5f);
301 		assert(reader.getFloat64Field() == -123e45);
302 		assert(reader.getTextField() == "foo");
303 		assert(reader.getDataField() == [0x62, 0x61, 0x72]);
304 		
305 		{
306 			auto subReader = reader.getStructField();
307 			subReader.getVoidField();
308 			assert(subReader.getBoolField() == true);
309 			assert(subReader.getInt8Field() == -12);
310 			assert(subReader.getInt16Field() == 3456);
311 			assert(subReader.getInt32Field() == -78901234);
312 			assert(subReader.getTextField() == "baz");
313 			
314 			{
315 				auto subSubReader = subReader.getStructField();
316 				assert(subSubReader.getTextField() == "nested");
317 			}
318 		}
319 		
320 		assert(reader.getEnumField() == TestEnum.corge);
321 		
322 		assert(reader.getVoidList().length == 6);
323 		
324 		{
325 			auto listReader = reader.getBoolList();
326 			assert(listReader.length == 4);
327 			assert(listReader.get(0) == true);
328 			assert(listReader.get(1) == false);
329 			assert(listReader.get(2) == false);
330 			assert(listReader.get(3) == true);
331 		}
332 		
333 		{
334 			auto listReader = reader.getInt8List();
335 			assert(listReader.length == 2);
336 			assert(listReader.get(0) == 111);
337 			assert(listReader.get(1) == -111);
338 		}
339 	}
340 	
341 	static void setDefaultMessage(TestDefaults.Builder builder)
342 	{
343 		builder.setBoolField(false);
344 		builder.setInt8Field(-122);
345 		builder.setInt16Field(-12344);
346 		builder.setInt32Field(-12345677);
347 		builder.setInt64Field(-123456789012344L);
348 		builder.setUInt8Field(0xe9);
349 		builder.setUInt16Field(45677);
350 		builder.setUInt32Field(0xce0a6a13);
351 		builder.setUInt64Field(0xab54a98ceb1f0ad1L);
352 		builder.setFloat32Field(1234.4f);
353 		builder.setFloat64Field(-123e44);
354 		builder.setTextField(Text.Reader("bar"));
355 		builder.setEnumField(TestEnum.qux);
356 	}
357 	
358 	static void checkSettedDefaultMessage(TestDefaults.Reader reader)
359 	{
360 		assert(reader.getBoolField() == false);
361 		assert(reader.getInt8Field() == -122);
362 		assert(reader.getInt16Field() == -12344);
363 		assert(reader.getInt32Field() == -12345677);
364 		assert(reader.getInt64Field() == -123456789012344L);
365 		assert(reader.getUInt8Field() == 0xe9);
366 		assert(reader.getUInt16Field() == 45677);
367 		assert(reader.getUInt32Field() == 0xce0a6a13);
368 		assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad1L);
369 		assert(reader.getFloat32Field() == 1234.4f);
370 		assert(reader.getFloat64Field() == -123e44);
371 		assert(reader.getEnumField() == TestEnum.qux);
372 	}
373 }