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 #include "message.h"
23 #include "dynamic.h"
24 #include "pretty-print.h"
25 #include <kj/debug.h>
26 #include <kj/compat/gtest.h>
27 #include "test-util.h"
28 
29 namespace capnp {
30 namespace _ {  // private
31 namespace {
32 
TEST(Stringify,KjStringification)33 TEST(Stringify, KjStringification) {
34   MallocMessageBuilder builder;
35   auto root = builder.initRoot<TestAllTypes>();
36 
37   // This test got ugly after printing was changed to always print primitives even when they have
38   // default values...
39 
40   EXPECT_EQ("("
41       "voidField = void, "
42       "boolField = false, "
43       "int8Field = 0, "
44       "int16Field = 0, "
45       "int32Field = 0, "
46       "int64Field = 0, "
47       "uInt8Field = 0, "
48       "uInt16Field = 0, "
49       "uInt32Field = 0, "
50       "uInt64Field = 0, "
51       "float32Field = 0, "
52       "float64Field = 0, "
53       "enumField = foo, "
54       "interfaceField = void)",
55       kj::str(root));
56 
57   initTestMessage(root);
58 
59   EXPECT_EQ("("
60       "voidField = void, "
61       "boolField = true, "
62       "int8Field = -123, "
63       "int16Field = -12345, "
64       "int32Field = -12345678, "
65       "int64Field = -123456789012345, "
66       "uInt8Field = 234, "
67       "uInt16Field = 45678, "
68       "uInt32Field = 3456789012, "
69       "uInt64Field = 12345678901234567890, "
70       "float32Field = 1234.5, "
71       "float64Field = -1.23e47, "
72       "textField = \"foo\", "
73       "dataField = \"bar\", "
74       "structField = ("
75           "voidField = void, "
76           "boolField = true, "
77           "int8Field = -12, "
78           "int16Field = 3456, "
79           "int32Field = -78901234, "
80           "int64Field = 56789012345678, "
81           "uInt8Field = 90, "
82           "uInt16Field = 1234, "
83           "uInt32Field = 56789012, "
84           "uInt64Field = 345678901234567890, "
85           "float32Field = -1.25e-10, "
86           "float64Field = 345, "
87           "textField = \"baz\", "
88           "dataField = \"qux\", "
89           "structField = ("
90               "voidField = void, "
91               "boolField = false, "
92               "int8Field = 0, "
93               "int16Field = 0, "
94               "int32Field = 0, "
95               "int64Field = 0, "
96               "uInt8Field = 0, "
97               "uInt16Field = 0, "
98               "uInt32Field = 0, "
99               "uInt64Field = 0, "
100               "float32Field = 0, "
101               "float64Field = 0, "
102               "textField = \"nested\", "
103               "structField = ("
104                 "voidField = void, "
105                 "boolField = false, "
106                 "int8Field = 0, "
107                 "int16Field = 0, "
108                 "int32Field = 0, "
109                 "int64Field = 0, "
110                 "uInt8Field = 0, "
111                 "uInt16Field = 0, "
112                 "uInt32Field = 0, "
113                 "uInt64Field = 0, "
114                 "float32Field = 0, "
115                 "float64Field = 0, "
116                 "textField = \"really nested\", "
117                 "enumField = foo, "
118                 "interfaceField = void), "
119               "enumField = foo, "
120               "interfaceField = void), "
121           "enumField = baz, "
122           "interfaceField = void, "
123           "voidList = [void, void, void], "
124           "boolList = [false, true, false, true, true], "
125           "int8List = [12, -34, -128, 127], "
126           "int16List = [1234, -5678, -32768, 32767], "
127           "int32List = [12345678, -90123456, -2147483648, 2147483647], "
128           "int64List = [123456789012345, -678901234567890, "
129                        "-9223372036854775808, 9223372036854775807], "
130           "uInt8List = [12, 34, 0, 255], "
131           "uInt16List = [1234, 5678, 0, 65535], "
132           "uInt32List = [12345678, 90123456, 0, 4294967295], "
133           "uInt64List = [123456789012345, 678901234567890, 0, 18446744073709551615], "
134           "float32List = [0, 1234567, 1e37, -1e37, 1e-37, -1e-37], "
135           "float64List = [0, 123456789012345, 1e306, -1e306, 1e-306, -1e-306], "
136           "textList = [\"quux\", \"corge\", \"grault\"], "
137           "dataList = [\"garply\", \"waldo\", \"fred\"], "
138           "structList = ["
139               "("
140                 "voidField = void, "
141                 "boolField = false, "
142                 "int8Field = 0, "
143                 "int16Field = 0, "
144                 "int32Field = 0, "
145                 "int64Field = 0, "
146                 "uInt8Field = 0, "
147                 "uInt16Field = 0, "
148                 "uInt32Field = 0, "
149                 "uInt64Field = 0, "
150                 "float32Field = 0, "
151                 "float64Field = 0, "
152                 "textField = \"x structlist 1\", "
153                 "enumField = foo, "
154                 "interfaceField = void), "
155               "("
156                 "voidField = void, "
157                 "boolField = false, "
158                 "int8Field = 0, "
159                 "int16Field = 0, "
160                 "int32Field = 0, "
161                 "int64Field = 0, "
162                 "uInt8Field = 0, "
163                 "uInt16Field = 0, "
164                 "uInt32Field = 0, "
165                 "uInt64Field = 0, "
166                 "float32Field = 0, "
167                 "float64Field = 0, "
168                 "textField = \"x structlist 2\", "
169                 "enumField = foo, "
170                 "interfaceField = void), "
171               "("
172                 "voidField = void, "
173                 "boolField = false, "
174                 "int8Field = 0, "
175                 "int16Field = 0, "
176                 "int32Field = 0, "
177                 "int64Field = 0, "
178                 "uInt8Field = 0, "
179                 "uInt16Field = 0, "
180                 "uInt32Field = 0, "
181                 "uInt64Field = 0, "
182                 "float32Field = 0, "
183                 "float64Field = 0, "
184                 "textField = \"x structlist 3\", "
185                 "enumField = foo, "
186                 "interfaceField = void)], "
187           "enumList = [qux, bar, grault]), "
188       "enumField = corge, "
189       "interfaceField = void, "
190       "voidList = [void, void, void, void, void, void], "
191       "boolList = [true, false, false, true], "
192       "int8List = [111, -111], "
193       "int16List = [11111, -11111], "
194       "int32List = [111111111, -111111111], "
195       "int64List = [1111111111111111111, -1111111111111111111], "
196       "uInt8List = [111, 222], "
197       "uInt16List = [33333, 44444], "
198       "uInt32List = [3333333333], "
199       "uInt64List = [11111111111111111111], "
200       "float32List = [5555.5, inf, -inf, nan], "
201       "float64List = [7777.75, inf, -inf, nan], "
202       "textList = [\"plugh\", \"xyzzy\", \"thud\"], "
203       "dataList = [\"oops\", \"exhausted\", \"rfc3092\"], "
204       "structList = ["
205           "("
206             "voidField = void, "
207             "boolField = false, "
208             "int8Field = 0, "
209             "int16Field = 0, "
210             "int32Field = 0, "
211             "int64Field = 0, "
212             "uInt8Field = 0, "
213             "uInt16Field = 0, "
214             "uInt32Field = 0, "
215             "uInt64Field = 0, "
216             "float32Field = 0, "
217             "float64Field = 0, "
218             "textField = \"structlist 1\", "
219             "enumField = foo, "
220             "interfaceField = void), "
221           "("
222             "voidField = void, "
223             "boolField = false, "
224             "int8Field = 0, "
225             "int16Field = 0, "
226             "int32Field = 0, "
227             "int64Field = 0, "
228             "uInt8Field = 0, "
229             "uInt16Field = 0, "
230             "uInt32Field = 0, "
231             "uInt64Field = 0, "
232             "float32Field = 0, "
233             "float64Field = 0, "
234             "textField = \"structlist 2\", "
235             "enumField = foo, "
236             "interfaceField = void), "
237           "("
238             "voidField = void, "
239             "boolField = false, "
240             "int8Field = 0, "
241             "int16Field = 0, "
242             "int32Field = 0, "
243             "int64Field = 0, "
244             "uInt8Field = 0, "
245             "uInt16Field = 0, "
246             "uInt32Field = 0, "
247             "uInt64Field = 0, "
248             "float32Field = 0, "
249             "float64Field = 0, "
250             "textField = \"structlist 3\", "
251             "enumField = foo, "
252             "interfaceField = void)], "
253       "enumList = [foo, garply])",
254       kj::str(root));
255 }
256 
TEST(Stringify,PrettyPrint)257 TEST(Stringify, PrettyPrint) {
258   MallocMessageBuilder builder;
259   auto root = builder.initRoot<TestAllTypes>();
260 
261   EXPECT_EQ(
262       "( voidField = void,\n"
263       "  boolField = false,\n"
264       "  int8Field = 0,\n"
265       "  int16Field = 0,\n"
266       "  int32Field = 0,\n"
267       "  int64Field = 0,\n"
268       "  uInt8Field = 0,\n"
269       "  uInt16Field = 0,\n"
270       "  uInt32Field = 0,\n"
271       "  uInt64Field = 0,\n"
272       "  float32Field = 0,\n"
273       "  float64Field = 0,\n"
274       "  enumField = foo,\n"
275       "  interfaceField = void )", prettyPrint(root).flatten());
276 
277   initTestMessage(root);
278 
279   EXPECT_EQ(
280       "( voidField = void,\n"
281       "  boolField = true,\n"
282       "  int8Field = -123,\n"
283       "  int16Field = -12345,\n"
284       "  int32Field = -12345678,\n"
285       "  int64Field = -123456789012345,\n"
286       "  uInt8Field = 234,\n"
287       "  uInt16Field = 45678,\n"
288       "  uInt32Field = 3456789012,\n"
289       "  uInt64Field = 12345678901234567890,\n"
290       "  float32Field = 1234.5,\n"
291       "  float64Field = -1.23e47,\n"
292       "  textField = \"foo\",\n"
293       "  dataField = \"bar\",\n"
294       "  structField = (\n"
295       "    voidField = void,\n"
296       "    boolField = true,\n"
297       "    int8Field = -12,\n"
298       "    int16Field = 3456,\n"
299       "    int32Field = -78901234,\n"
300       "    int64Field = 56789012345678,\n"
301       "    uInt8Field = 90,\n"
302       "    uInt16Field = 1234,\n"
303       "    uInt32Field = 56789012,\n"
304       "    uInt64Field = 345678901234567890,\n"
305       "    float32Field = -1.25e-10,\n"
306       "    float64Field = 345,\n"
307       "    textField = \"baz\",\n"
308       "    dataField = \"qux\",\n"
309       "    structField = (\n"
310       "      voidField = void,\n"
311       "      boolField = false,\n"
312       "      int8Field = 0,\n"
313       "      int16Field = 0,\n"
314       "      int32Field = 0,\n"
315       "      int64Field = 0,\n"
316       "      uInt8Field = 0,\n"
317       "      uInt16Field = 0,\n"
318       "      uInt32Field = 0,\n"
319       "      uInt64Field = 0,\n"
320       "      float32Field = 0,\n"
321       "      float64Field = 0,\n"
322       "      textField = \"nested\",\n"
323       "      structField = (\n"
324       "        voidField = void,\n"
325       "        boolField = false,\n"
326       "        int8Field = 0,\n"
327       "        int16Field = 0,\n"
328       "        int32Field = 0,\n"
329       "        int64Field = 0,\n"
330       "        uInt8Field = 0,\n"
331       "        uInt16Field = 0,\n"
332       "        uInt32Field = 0,\n"
333       "        uInt64Field = 0,\n"
334       "        float32Field = 0,\n"
335       "        float64Field = 0,\n"
336       "        textField = \"really nested\",\n"
337       "        enumField = foo,\n"
338       "        interfaceField = void ),\n"
339       "      enumField = foo,\n"
340       "      interfaceField = void ),\n"
341       "    enumField = baz,\n"
342       "    interfaceField = void,\n"
343       "    voidList = [void, void, void],\n"
344       "    boolList = [false, true, false, true, true],\n"
345       "    int8List = [12, -34, -128, 127],\n"
346       "    int16List = [1234, -5678, -32768, 32767],\n"
347       "    int32List = [12345678, -90123456, -2147483648, 2147483647],\n"
348       "    int64List = [123456789012345, -678901234567890, "
349                        "-9223372036854775808, 9223372036854775807],\n"
350       "    uInt8List = [12, 34, 0, 255],\n"
351       "    uInt16List = [1234, 5678, 0, 65535],\n"
352       "    uInt32List = [12345678, 90123456, 0, 4294967295],\n"
353       "    uInt64List = [123456789012345, 678901234567890, 0, 18446744073709551615],\n"
354       "    float32List = [0, 1234567, 1e37, -1e37, 1e-37, -1e-37],\n"
355       "    float64List = [0, 123456789012345, 1e306, -1e306, 1e-306, -1e-306],\n"
356       "    textList = [\"quux\", \"corge\", \"grault\"],\n"
357       "    dataList = [\"garply\", \"waldo\", \"fred\"],\n"
358       "    structList = [\n"
359       "      ( voidField = void,\n"
360       "        boolField = false,\n"
361       "        int8Field = 0,\n"
362       "        int16Field = 0,\n"
363       "        int32Field = 0,\n"
364       "        int64Field = 0,\n"
365       "        uInt8Field = 0,\n"
366       "        uInt16Field = 0,\n"
367       "        uInt32Field = 0,\n"
368       "        uInt64Field = 0,\n"
369       "        float32Field = 0,\n"
370       "        float64Field = 0,\n"
371       "        textField = \"x structlist 1\",\n"
372       "        enumField = foo,\n"
373       "        interfaceField = void ),\n"
374       "      ( voidField = void,\n"
375       "        boolField = false,\n"
376       "        int8Field = 0,\n"
377       "        int16Field = 0,\n"
378       "        int32Field = 0,\n"
379       "        int64Field = 0,\n"
380       "        uInt8Field = 0,\n"
381       "        uInt16Field = 0,\n"
382       "        uInt32Field = 0,\n"
383       "        uInt64Field = 0,\n"
384       "        float32Field = 0,\n"
385       "        float64Field = 0,\n"
386       "        textField = \"x structlist 2\",\n"
387       "        enumField = foo,\n"
388       "        interfaceField = void ),\n"
389       "      ( voidField = void,\n"
390       "        boolField = false,\n"
391       "        int8Field = 0,\n"
392       "        int16Field = 0,\n"
393       "        int32Field = 0,\n"
394       "        int64Field = 0,\n"
395       "        uInt8Field = 0,\n"
396       "        uInt16Field = 0,\n"
397       "        uInt32Field = 0,\n"
398       "        uInt64Field = 0,\n"
399       "        float32Field = 0,\n"
400       "        float64Field = 0,\n"
401       "        textField = \"x structlist 3\",\n"
402       "        enumField = foo,\n"
403       "        interfaceField = void ) ],\n"
404       "    enumList = [qux, bar, grault] ),\n"
405       "  enumField = corge,\n"
406       "  interfaceField = void,\n"
407       "  voidList = [void, void, void, void, void, void],\n"
408       "  boolList = [true, false, false, true],\n"
409       "  int8List = [111, -111],\n"
410       "  int16List = [11111, -11111],\n"
411       "  int32List = [111111111, -111111111],\n"
412       "  int64List = [1111111111111111111, -1111111111111111111],\n"
413       "  uInt8List = [111, 222],\n"
414       "  uInt16List = [33333, 44444],\n"
415       "  uInt32List = [3333333333],\n"
416       "  uInt64List = [11111111111111111111],\n"
417       "  float32List = [5555.5, inf, -inf, nan],\n"
418       "  float64List = [7777.75, inf, -inf, nan],\n"
419       "  textList = [\"plugh\", \"xyzzy\", \"thud\"],\n"
420       "  dataList = [\"oops\", \"exhausted\", \"rfc3092\"],\n"
421       "  structList = [\n"
422       "    ( voidField = void,\n"
423       "      boolField = false,\n"
424       "      int8Field = 0,\n"
425       "      int16Field = 0,\n"
426       "      int32Field = 0,\n"
427       "      int64Field = 0,\n"
428       "      uInt8Field = 0,\n"
429       "      uInt16Field = 0,\n"
430       "      uInt32Field = 0,\n"
431       "      uInt64Field = 0,\n"
432       "      float32Field = 0,\n"
433       "      float64Field = 0,\n"
434       "      textField = \"structlist 1\",\n"
435       "      enumField = foo,\n"
436       "      interfaceField = void ),\n"
437       "    ( voidField = void,\n"
438       "      boolField = false,\n"
439       "      int8Field = 0,\n"
440       "      int16Field = 0,\n"
441       "      int32Field = 0,\n"
442       "      int64Field = 0,\n"
443       "      uInt8Field = 0,\n"
444       "      uInt16Field = 0,\n"
445       "      uInt32Field = 0,\n"
446       "      uInt64Field = 0,\n"
447       "      float32Field = 0,\n"
448       "      float64Field = 0,\n"
449       "      textField = \"structlist 2\",\n"
450       "      enumField = foo,\n"
451       "      interfaceField = void ),\n"
452       "    ( voidField = void,\n"
453       "      boolField = false,\n"
454       "      int8Field = 0,\n"
455       "      int16Field = 0,\n"
456       "      int32Field = 0,\n"
457       "      int64Field = 0,\n"
458       "      uInt8Field = 0,\n"
459       "      uInt16Field = 0,\n"
460       "      uInt32Field = 0,\n"
461       "      uInt64Field = 0,\n"
462       "      float32Field = 0,\n"
463       "      float64Field = 0,\n"
464       "      textField = \"structlist 3\",\n"
465       "      enumField = foo,\n"
466       "      interfaceField = void ) ],\n"
467       "  enumList = [foo, garply] )",
468       prettyPrint(root).flatten());
469 }
470 
TEST(Stringify,PrettyPrintAdvanced)471 TEST(Stringify, PrettyPrintAdvanced) {
472   MallocMessageBuilder builder;
473 
474   {
475     auto root = builder.initRoot<test::TestPrintInlineStructs>();
476 
477     auto list = root.initStructList(3);
478     list[0].setInt32Field(123);
479     list[0].setTextField("foo");
480     list[1].setInt32Field(456);
481     list[1].setTextField("bar");
482     list[2].setInt32Field(789);
483     list[2].setTextField("baz");
484 
485     EXPECT_EQ(
486         "( structList = [\n"
487         "    (int32Field = 123, textField = \"foo\"),\n"
488         "    (int32Field = 456, textField = \"bar\"),\n"
489         "    (int32Field = 789, textField = \"baz\") ] )",
490         prettyPrint(root).flatten());
491 
492     root.setSomeText("foo");
493 
494     EXPECT_EQ(
495         "( someText = \"foo\",\n"
496         "  structList = [\n"
497         "    (int32Field = 123, textField = \"foo\"),\n"
498         "    (int32Field = 456, textField = \"bar\"),\n"
499         "    (int32Field = 789, textField = \"baz\") ] )",
500         prettyPrint(root).flatten());
501   }
502 
503   {
504     auto root = builder.initRoot<test::TestLists>();
505     auto ll = root.initInt32ListList(3);
506     ll.set(0, {123, 456, 789, 1234567890});
507     ll.set(1, {234, 567, 891, 1234567890});
508     ll.set(2, {345, 678, 912, 1234567890});
509 
510     EXPECT_EQ(
511         "[ [123, 456, 789, 1234567890],\n"
512         "  [234, 567, 891, 1234567890],\n"
513         "  [345, 678, 912, 1234567890] ]",
514         prettyPrint(ll).flatten());
515 
516     EXPECT_EQ(
517         "( int32ListList = [\n"
518         "    [123, 456, 789, 1234567890],\n"
519         "    [234, 567, 891, 1234567890],\n"
520         "    [345, 678, 912, 1234567890] ] )",
521         prettyPrint(root).flatten());
522 
523     root.initList8(0);
524 
525     EXPECT_EQ(
526         "( list8 = [],\n"
527         "  int32ListList = [\n"
528         "    [123, 456, 789, 1234567890],\n"
529         "    [234, 567, 891, 1234567890],\n"
530         "    [345, 678, 912, 1234567890] ] )",
531         prettyPrint(root).flatten());
532 
533     auto l8 = root.initList8(1);
534     l8[0].setF(12);
535 
536     EXPECT_EQ(
537         "( list8 = [(f = 12)],\n"
538         "  int32ListList = [\n"
539         "    [123, 456, 789, 1234567890],\n"
540         "    [234, 567, 891, 1234567890],\n"
541         "    [345, 678, 912, 1234567890] ] )",
542         prettyPrint(root).flatten());
543 
544     l8 = root.initList8(2);
545     l8[0].setF(12);
546     l8[1].setF(34);
547 
548     EXPECT_EQ(
549         "( list8 = [(f = 12), (f = 34)],\n"
550         "  int32ListList = [\n"
551         "    [123, 456, 789, 1234567890],\n"
552         "    [234, 567, 891, 1234567890],\n"
553         "    [345, 678, 912, 1234567890] ] )",
554         prettyPrint(root).flatten());
555   }
556 
557   {
558     auto root = builder.initRoot<test::TestStructUnion>();
559 
560     auto s = root.getUn().initStruct();
561     EXPECT_EQ(
562         "(un = (struct = ()))",
563         prettyPrint(root).flatten());
564 
565     s.setSomeText("foo");
566     EXPECT_EQ(
567         "( un = (\n"
568         "    struct = (someText = \"foo\") ) )",
569         prettyPrint(root).flatten());
570 
571     s.setMoreText("baaaaaaaaaaaaaaaaaaaaaaaaaaaaaar");
572     EXPECT_EQ(
573         "( un = (\n"
574         "    struct = (\n"
575         "      someText = \"foo\",\n"
576         "      moreText = \"baaaaaaaaaaaaaaaaaaaaaaaaaaaaaar\" ) ) )",
577         prettyPrint(root).flatten());
578   }
579 }
580 
TEST(Stringify,Unions)581 TEST(Stringify, Unions) {
582   MallocMessageBuilder builder;
583   auto root = builder.initRoot<TestUnion>();
584 
585   root.getUnion0().setU0f0s16(123);
586   root.getUnion1().setU1f0sp("foo");
587   root.getUnion2().setU2f0s1(true);
588   root.getUnion3().setU3f0s64(123456789012345678ll);
589 
590   EXPECT_EQ("("
591       "union0 = (u0f0s16 = 123), "
592       "union1 = (u1f0sp = \"foo\"), "
593       "union2 = (u2f0s1 = true), "
594       "union3 = (u3f0s64 = 123456789012345678), "
595       "bit0 = false, bit2 = false, bit3 = false, bit4 = false, bit5 = false, "
596       "bit6 = false, bit7 = false, byte0 = 0)",
597       kj::str(root));
598 
599   EXPECT_EQ("(u0f0s16 = 123)", kj::str(root.getUnion0()));
600   EXPECT_EQ("(u1f0sp = \"foo\")", kj::str(root.getUnion1()));
601   EXPECT_EQ("(u2f0s1 = true)", kj::str(root.getUnion2()));
602   EXPECT_EQ("(u3f0s64 = 123456789012345678)", kj::str(root.getUnion3()));
603 }
604 
TEST(Stringify,UnionDefaults)605 TEST(Stringify, UnionDefaults) {
606   MallocMessageBuilder builder;
607   auto root = builder.initRoot<TestUnion>();
608 
609   root.getUnion0().setU0f0s16(0);     // Non-default field has default value.
610   root.getUnion1().setU1f0sp("foo");  // Non-default field has non-default value.
611   root.getUnion2().setU2f0s1(false);  // Default field has default value.
612   root.getUnion3().setU3f0s1(true);   // Default field has non-default value.
613 
614   EXPECT_EQ("("
615       "union0 = (u0f0s16 = 0), "
616       "union1 = (u1f0sp = \"foo\"), "
617       "union2 = (u2f0s1 = false), "
618       "union3 = (u3f0s1 = true), "
619       "bit0 = false, bit2 = false, bit3 = false, bit4 = false, bit5 = false, "
620       "bit6 = false, bit7 = false, byte0 = 0)",
621       kj::str(root));
622 
623   EXPECT_EQ("(u0f0s16 = 0)", kj::str(root.getUnion0()));
624   EXPECT_EQ("(u1f0sp = \"foo\")", kj::str(root.getUnion1()));
625   EXPECT_EQ("(u2f0s1 = false)", kj::str(root.getUnion2()));
626   EXPECT_EQ("(u3f0s1 = true)", kj::str(root.getUnion3()));
627 }
628 
TEST(Stringify,UnnamedUnions)629 TEST(Stringify, UnnamedUnions) {
630   MallocMessageBuilder builder;
631   auto root = builder.initRoot<test::TestUnnamedUnion>();
632 
633   root.setBar(123);
634 
635   EXPECT_EQ("(middle = 0, bar = 123)", kj::str(root));
636   EXPECT_EQ("(middle = 0, bar = 123)", prettyPrint(root).flatten());
637 
638   root.setAfter("foooooooooooooooooooooooooooooooo");
639 
640   EXPECT_EQ("(middle = 0, bar = 123, after = \"foooooooooooooooooooooooooooooooo\")",
641             kj::str(root));
642   EXPECT_EQ(
643       "( middle = 0,\n"
644       "  bar = 123,\n"
645       "  after = \"foooooooooooooooooooooooooooooooo\" )",
646       prettyPrint(root).flatten());
647 
648   root.setBefore("before");
649 
650   EXPECT_EQ("(before = \"before\", middle = 0, bar = 123, "
651       "after = \"foooooooooooooooooooooooooooooooo\")", kj::str(root));
652   EXPECT_EQ(
653       "( before = \"before\",\n"
654       "  middle = 0,\n"
655       "  bar = 123,\n"
656       "  after = \"foooooooooooooooooooooooooooooooo\" )",
657       prettyPrint(root).flatten());
658 
659   root.setFoo(0);
660 
661   EXPECT_EQ(
662       "(before = \"before\", foo = 0, middle = 0, after = \"foooooooooooooooooooooooooooooooo\")",
663       kj::str(root));
664   EXPECT_EQ(
665       "( before = \"before\",\n"
666       "  foo = 0,\n"
667       "  middle = 0,\n"
668       "  after = \"foooooooooooooooooooooooooooooooo\" )",
669       prettyPrint(root).flatten());
670 }
671 
TEST(Stringify,StructUnions)672 TEST(Stringify, StructUnions) {
673   MallocMessageBuilder builder;
674   auto root = builder.initRoot<test::TestStructUnion>();
675 
676   auto s = root.getUn().initStruct();
677   s.setSomeText("foo");
678   s.setMoreText("bar");
679 
680   EXPECT_EQ("(un = (struct = (someText = \"foo\", moreText = \"bar\")))", kj::str(root));
681 }
682 
TEST(Stringify,MoreValues)683 TEST(Stringify, MoreValues) {
684   EXPECT_EQ("123", kj::str(DynamicValue::Reader(123)));
685   EXPECT_EQ("1.23e47", kj::str(DynamicValue::Reader(123e45)));
686   EXPECT_EQ("\"foo\"", kj::str(DynamicValue::Reader("foo")));
687   EXPECT_EQ("\"\\a\\b\\n\\t\\\"\"", kj::str(DynamicValue::Reader("\a\b\n\t\"")));
688 
689   EXPECT_EQ("foo", kj::str(DynamicValue::Reader(TestEnum::FOO)));
690   EXPECT_EQ("(123)", kj::str(DynamicValue::Reader(static_cast<TestEnum>(123))));
691 }
692 
TEST(Stringify,Generics)693 TEST(Stringify, Generics) {
694   MallocMessageBuilder builder;
695   auto root = builder.initRoot<test::TestGenerics<Text, List<uint32_t>>::Inner>();
696   root.setFoo("abcd");
697   auto l = root.initBar(2);
698   l.set(0, 123);
699   l.set(1, 456);
700 
701   EXPECT_EQ("(foo = \"abcd\", bar = [123, 456])", kj::str(root));
702 }
703 
704 }  // namespace
705 }  // namespace _ (private)
706 }  // namespace capnp
707