xref: /llvm-project/llvm/unittests/BinaryFormat/MsgPackDocumentTest.cpp (revision 9d52f69afef64776b830bb9adc4e1737ff8fc426)
14ced8de1STim Renouf //===- MsgPackDocumentTest.cpp --------------------------------------------===//
24ced8de1STim Renouf //
3c874dd53SChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c874dd53SChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information.
5c874dd53SChristopher Di Bella // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64ced8de1STim Renouf //
74ced8de1STim Renouf //===----------------------------------------------------------------------===//
84ced8de1STim Renouf 
94ced8de1STim Renouf #include "llvm/BinaryFormat/MsgPackDocument.h"
104ced8de1STim Renouf #include "gtest/gtest.h"
114ced8de1STim Renouf 
124ced8de1STim Renouf using namespace llvm;
134ced8de1STim Renouf using namespace msgpack;
144ced8de1STim Renouf 
TEST(MsgPackDocument,DocNodeTest)15f1b2be41SDineshkumar Bhaskaran TEST(MsgPackDocument, DocNodeTest) {
16f1b2be41SDineshkumar Bhaskaran   Document Doc;
17f1b2be41SDineshkumar Bhaskaran 
18f1b2be41SDineshkumar Bhaskaran   DocNode Int1 = Doc.getNode(1), Int2 = Doc.getNode(2);
19f1b2be41SDineshkumar Bhaskaran   DocNode Str1 = Doc.getNode("ab"), Str2 = Doc.getNode("ab");
20f1b2be41SDineshkumar Bhaskaran 
21f1b2be41SDineshkumar Bhaskaran   ASSERT_TRUE(Int1 != Int2);
22f1b2be41SDineshkumar Bhaskaran   ASSERT_TRUE(Str1 == Str2);
23f1b2be41SDineshkumar Bhaskaran }
24f1b2be41SDineshkumar Bhaskaran 
TEST(MsgPackDocument,TestReadInt)254ced8de1STim Renouf TEST(MsgPackDocument, TestReadInt) {
264ced8de1STim Renouf   Document Doc;
274ced8de1STim Renouf   bool Ok = Doc.readFromBlob(StringRef("\xd0\x00", 2), /*Multi=*/false);
284ced8de1STim Renouf   ASSERT_TRUE(Ok);
294ced8de1STim Renouf   ASSERT_EQ(Doc.getRoot().getKind(), Type::Int);
304ced8de1STim Renouf   ASSERT_EQ(Doc.getRoot().getInt(), 0);
314ced8de1STim Renouf }
324ced8de1STim Renouf 
TEST(MsgPackDocument,TestReadBinary)33*9d52f69aSMartin Dinkov TEST(MsgPackDocument, TestReadBinary) {
34*9d52f69aSMartin Dinkov   Document Doc;
35*9d52f69aSMartin Dinkov   uint8_t data[] = {1, 2, 3, 4};
36*9d52f69aSMartin Dinkov   bool Ok =
37*9d52f69aSMartin Dinkov       Doc.readFromBlob(StringRef("\xC4\x4\x1\x2\x3\x4", 6), /*Multi=*/false);
38*9d52f69aSMartin Dinkov   ASSERT_TRUE(Ok);
39*9d52f69aSMartin Dinkov   ASSERT_EQ(Doc.getRoot().getKind(), Type::Binary);
40*9d52f69aSMartin Dinkov   ASSERT_EQ(Doc.getRoot().getBinary().getBuffer(),
41*9d52f69aSMartin Dinkov             StringRef(reinterpret_cast<const char *>(data), 4));
42*9d52f69aSMartin Dinkov }
43*9d52f69aSMartin Dinkov 
TEST(MsgPackDocument,TestReadMergeArray)44e79d0023STim Renouf TEST(MsgPackDocument, TestReadMergeArray) {
454ced8de1STim Renouf   Document Doc;
464ced8de1STim Renouf   bool Ok = Doc.readFromBlob(StringRef("\x92\xd0\x01\xc0"), /*Multi=*/false);
474ced8de1STim Renouf   ASSERT_TRUE(Ok);
484ced8de1STim Renouf   ASSERT_EQ(Doc.getRoot().getKind(), Type::Array);
494ced8de1STim Renouf   auto A = Doc.getRoot().getArray();
504ced8de1STim Renouf   ASSERT_EQ(A.size(), 2u);
514ced8de1STim Renouf   auto SI = A[0];
524ced8de1STim Renouf   ASSERT_EQ(SI.getKind(), Type::Int);
534ced8de1STim Renouf   ASSERT_EQ(SI.getInt(), 1);
544ced8de1STim Renouf   auto SN = A[1];
554ced8de1STim Renouf   ASSERT_EQ(SN.getKind(), Type::Nil);
56e79d0023STim Renouf 
57e79d0023STim Renouf   Ok = Doc.readFromBlob(StringRef("\x91\xd0\x2a"), /*Multi=*/false,
58e79d0023STim Renouf                         [](DocNode *DestNode, DocNode SrcNode, DocNode MapKey) {
59e79d0023STim Renouf                           // Allow array, merging into existing elements, ORing
60e79d0023STim Renouf                           // ints.
61e79d0023STim Renouf                           if (DestNode->getKind() == Type::Int &&
62e79d0023STim Renouf                               SrcNode.getKind() == Type::Int) {
63e79d0023STim Renouf                             *DestNode = DestNode->getDocument()->getNode(
64e79d0023STim Renouf                                 DestNode->getInt() | SrcNode.getInt());
65e79d0023STim Renouf                             return 0;
66e79d0023STim Renouf                           }
67e79d0023STim Renouf                           return DestNode->isArray() && SrcNode.isArray() ? 0
68e79d0023STim Renouf                                                                           : -1;
69e79d0023STim Renouf                         });
70e79d0023STim Renouf   ASSERT_TRUE(Ok);
71e79d0023STim Renouf   A = Doc.getRoot().getArray();
72e79d0023STim Renouf   ASSERT_EQ(A.size(), 2u);
73e79d0023STim Renouf   SI = A[0];
74e79d0023STim Renouf   ASSERT_EQ(SI.getKind(), Type::Int);
75e79d0023STim Renouf   ASSERT_EQ(SI.getInt(), 43);
76e79d0023STim Renouf   SN = A[1];
77e79d0023STim Renouf   ASSERT_EQ(SN.getKind(), Type::Nil);
784ced8de1STim Renouf }
794ced8de1STim Renouf 
TEST(MsgPackDocument,TestReadAppendArray)80e79d0023STim Renouf TEST(MsgPackDocument, TestReadAppendArray) {
81e79d0023STim Renouf   Document Doc;
82e79d0023STim Renouf   bool Ok = Doc.readFromBlob(StringRef("\x92\xd0\x01\xc0"), /*Multi=*/false);
83e79d0023STim Renouf   ASSERT_TRUE(Ok);
84e79d0023STim Renouf   ASSERT_EQ(Doc.getRoot().getKind(), Type::Array);
85e79d0023STim Renouf   auto A = Doc.getRoot().getArray();
86e79d0023STim Renouf   ASSERT_EQ(A.size(), 2u);
87e79d0023STim Renouf   auto SI = A[0];
88e79d0023STim Renouf   ASSERT_EQ(SI.getKind(), Type::Int);
89e79d0023STim Renouf   ASSERT_EQ(SI.getInt(), 1);
90e79d0023STim Renouf   auto SN = A[1];
91e79d0023STim Renouf   ASSERT_EQ(SN.getKind(), Type::Nil);
92e79d0023STim Renouf 
93e79d0023STim Renouf   Ok = Doc.readFromBlob(StringRef("\x91\xd0\x2a"), /*Multi=*/false,
94e79d0023STim Renouf                         [](DocNode *DestNode, DocNode SrcNode, DocNode MapKey) {
95e79d0023STim Renouf                           // Allow array, appending after existing elements
96e79d0023STim Renouf                           return DestNode->isArray() && SrcNode.isArray()
97e79d0023STim Renouf                                      ? DestNode->getArray().size()
98e79d0023STim Renouf                                      : -1;
99e79d0023STim Renouf                         });
100e79d0023STim Renouf   ASSERT_TRUE(Ok);
101e79d0023STim Renouf   A = Doc.getRoot().getArray();
102e79d0023STim Renouf   ASSERT_EQ(A.size(), 3u);
103e79d0023STim Renouf   SI = A[0];
104e79d0023STim Renouf   ASSERT_EQ(SI.getKind(), Type::Int);
105e79d0023STim Renouf   ASSERT_EQ(SI.getInt(), 1);
106e79d0023STim Renouf   SN = A[1];
107e79d0023STim Renouf   ASSERT_EQ(SN.getKind(), Type::Nil);
108e79d0023STim Renouf   SI = A[2];
109e79d0023STim Renouf   ASSERT_EQ(SI.getKind(), Type::Int);
110e79d0023STim Renouf   ASSERT_EQ(SI.getInt(), 42);
111e79d0023STim Renouf }
112e79d0023STim Renouf 
TEST(MsgPackDocument,TestReadMergeMap)113e79d0023STim Renouf TEST(MsgPackDocument, TestReadMergeMap) {
1144ced8de1STim Renouf   Document Doc;
1154ced8de1STim Renouf   bool Ok = Doc.readFromBlob(StringRef("\x82\xa3"
1164ced8de1STim Renouf                                        "foo"
1174ced8de1STim Renouf                                        "\xd0\x01\xa3"
1184ced8de1STim Renouf                                        "bar"
1194ced8de1STim Renouf                                        "\xd0\x02"),
1204ced8de1STim Renouf                              /*Multi=*/false);
1214ced8de1STim Renouf   ASSERT_TRUE(Ok);
1224ced8de1STim Renouf   ASSERT_EQ(Doc.getRoot().getKind(), Type::Map);
1234ced8de1STim Renouf   auto M = Doc.getRoot().getMap();
1244ced8de1STim Renouf   ASSERT_EQ(M.size(), 2u);
1254ced8de1STim Renouf   auto FooS = M["foo"];
1264ced8de1STim Renouf   ASSERT_EQ(FooS.getKind(), Type::Int);
1274ced8de1STim Renouf   ASSERT_EQ(FooS.getInt(), 1);
1284ced8de1STim Renouf   auto BarS = M["bar"];
1294ced8de1STim Renouf   ASSERT_EQ(BarS.getKind(), Type::Int);
1304ced8de1STim Renouf   ASSERT_EQ(BarS.getInt(), 2);
131e79d0023STim Renouf 
132e79d0023STim Renouf   Ok = Doc.readFromBlob(StringRef("\x82\xa3"
133e79d0023STim Renouf                                   "foz"
134e79d0023STim Renouf                                   "\xd0\x03\xa3"
135e79d0023STim Renouf                                   "baz"
136e79d0023STim Renouf                                   "\xd0\x04"),
137e79d0023STim Renouf                         /*Multi=*/false,
138e79d0023STim Renouf                         [](DocNode *DestNode, DocNode SrcNode, DocNode MapKey) {
139e79d0023STim Renouf                           return DestNode->isMap() && SrcNode.isMap() ? 0 : -1;
140e79d0023STim Renouf                         });
141e79d0023STim Renouf   ASSERT_TRUE(Ok);
142e79d0023STim Renouf   ASSERT_EQ(M.size(), 4u);
143e79d0023STim Renouf   FooS = M["foo"];
144e79d0023STim Renouf   ASSERT_EQ(FooS.getKind(), Type::Int);
145e79d0023STim Renouf   ASSERT_EQ(FooS.getInt(), 1);
146e79d0023STim Renouf   BarS = M["bar"];
147e79d0023STim Renouf   ASSERT_EQ(BarS.getKind(), Type::Int);
148e79d0023STim Renouf   ASSERT_EQ(BarS.getInt(), 2);
149e79d0023STim Renouf   auto FozS = M["foz"];
150e79d0023STim Renouf   ASSERT_EQ(FozS.getKind(), Type::Int);
151e79d0023STim Renouf   ASSERT_EQ(FozS.getInt(), 3);
152e79d0023STim Renouf   auto BazS = M["baz"];
153e79d0023STim Renouf   ASSERT_EQ(BazS.getKind(), Type::Int);
154e79d0023STim Renouf   ASSERT_EQ(BazS.getInt(), 4);
155e79d0023STim Renouf 
156e79d0023STim Renouf   Ok = Doc.readFromBlob(
157e79d0023STim Renouf       StringRef("\x82\xa3"
158e79d0023STim Renouf                 "foz"
159e79d0023STim Renouf                 "\xd0\x06\xa3"
160e79d0023STim Renouf                 "bay"
161e79d0023STim Renouf                 "\xd0\x08"),
162e79d0023STim Renouf       /*Multi=*/false, [](DocNode *Dest, DocNode Src, DocNode MapKey) {
163e79d0023STim Renouf         // Merger function that merges two ints by ORing their values, as long
164e79d0023STim Renouf         // as the map key is "foz".
165e79d0023STim Renouf         if (Src.isMap())
166e79d0023STim Renouf           return Dest->isMap();
167e79d0023STim Renouf         if (Src.isArray())
168e79d0023STim Renouf           return Dest->isArray();
169e79d0023STim Renouf         if (MapKey.isString() && MapKey.getString() == "foz" &&
170e79d0023STim Renouf             Dest->getKind() == Type::Int && Src.getKind() == Type::Int) {
171e79d0023STim Renouf           *Dest = Src.getDocument()->getNode(Dest->getInt() | Src.getInt());
172e79d0023STim Renouf           return true;
173e79d0023STim Renouf         }
174e79d0023STim Renouf         return false;
175e79d0023STim Renouf       });
176e79d0023STim Renouf   ASSERT_TRUE(Ok);
177e79d0023STim Renouf   ASSERT_EQ(M.size(), 5u);
178e79d0023STim Renouf   FooS = M["foo"];
179e79d0023STim Renouf   ASSERT_EQ(FooS.getKind(), Type::Int);
180e79d0023STim Renouf   ASSERT_EQ(FooS.getInt(), 1);
181e79d0023STim Renouf   BarS = M["bar"];
182e79d0023STim Renouf   ASSERT_EQ(BarS.getKind(), Type::Int);
183e79d0023STim Renouf   ASSERT_EQ(BarS.getInt(), 2);
184e79d0023STim Renouf   FozS = M["foz"];
185e79d0023STim Renouf   ASSERT_EQ(FozS.getKind(), Type::Int);
186e79d0023STim Renouf   ASSERT_EQ(FozS.getInt(), 7);
187e79d0023STim Renouf   BazS = M["baz"];
188e79d0023STim Renouf   ASSERT_EQ(BazS.getKind(), Type::Int);
189e79d0023STim Renouf   ASSERT_EQ(BazS.getInt(), 4);
190e79d0023STim Renouf   auto BayS = M["bay"];
191e79d0023STim Renouf   ASSERT_EQ(BayS.getKind(), Type::Int);
192e79d0023STim Renouf   ASSERT_EQ(BayS.getInt(), 8);
1934ced8de1STim Renouf }
1944ced8de1STim Renouf 
TEST(MsgPackDocument,TestWriteInt)1954ced8de1STim Renouf TEST(MsgPackDocument, TestWriteInt) {
1964ced8de1STim Renouf   Document Doc;
197db16eb33STim Renouf   Doc.getRoot() = 1;
1984ced8de1STim Renouf   std::string Buffer;
1994ced8de1STim Renouf   Doc.writeToBlob(Buffer);
2004ced8de1STim Renouf   ASSERT_EQ(Buffer, "\x01");
2014ced8de1STim Renouf }
2024ced8de1STim Renouf 
TEST(MsgPackDocument,TestWriteBinary)203*9d52f69aSMartin Dinkov TEST(MsgPackDocument, TestWriteBinary) {
204*9d52f69aSMartin Dinkov   uint8_t data[] = {1, 2, 3, 4};
205*9d52f69aSMartin Dinkov   Document Doc;
206*9d52f69aSMartin Dinkov   Doc.getRoot() = MemoryBufferRef(
207*9d52f69aSMartin Dinkov       StringRef(reinterpret_cast<const char *>(data), sizeof(data)), "");
208*9d52f69aSMartin Dinkov   std::string Buffer;
209*9d52f69aSMartin Dinkov   Doc.writeToBlob(Buffer);
210*9d52f69aSMartin Dinkov   ASSERT_EQ(Buffer, "\xC4\x4\x1\x2\x3\x4");
211*9d52f69aSMartin Dinkov }
212*9d52f69aSMartin Dinkov 
TEST(MsgPackDocument,TestWriteArray)2134ced8de1STim Renouf TEST(MsgPackDocument, TestWriteArray) {
2144ced8de1STim Renouf   Document Doc;
2154ced8de1STim Renouf   auto A = Doc.getRoot().getArray(/*Convert=*/true);
2164ced8de1STim Renouf   A.push_back(Doc.getNode(int64_t(1)));
2174ced8de1STim Renouf   A.push_back(Doc.getNode());
2184ced8de1STim Renouf   std::string Buffer;
2194ced8de1STim Renouf   Doc.writeToBlob(Buffer);
2204ced8de1STim Renouf   ASSERT_EQ(Buffer, "\x92\x01\xc0");
2214ced8de1STim Renouf }
2224ced8de1STim Renouf 
TEST(MsgPackDocument,TestWriteMap)2234ced8de1STim Renouf TEST(MsgPackDocument, TestWriteMap) {
2244ced8de1STim Renouf   Document Doc;
2254ced8de1STim Renouf   auto M = Doc.getRoot().getMap(/*Convert=*/true);
226db16eb33STim Renouf   M["foo"] = 1;
227db16eb33STim Renouf   M["bar"] = 2;
2284ced8de1STim Renouf   std::string Buffer;
2294ced8de1STim Renouf   Doc.writeToBlob(Buffer);
2304ced8de1STim Renouf   ASSERT_EQ(Buffer, "\x82\xa3"
2314ced8de1STim Renouf                     "bar"
2324ced8de1STim Renouf                     "\x02\xa3"
2334ced8de1STim Renouf                     "foo"
2344ced8de1STim Renouf                     "\x01");
2354ced8de1STim Renouf }
2364ced8de1STim Renouf 
TEST(MsgPackDocument,TestOutputYAMLArray)2374ced8de1STim Renouf TEST(MsgPackDocument, TestOutputYAMLArray) {
2384ced8de1STim Renouf   Document Doc;
2394ced8de1STim Renouf   auto A = Doc.getRoot().getArray(/*Convert=*/true);
2404ced8de1STim Renouf   A.push_back(Doc.getNode(int64_t(1)));
2414ced8de1STim Renouf   A.push_back(Doc.getNode(int64_t(2)));
2424ced8de1STim Renouf   std::string Buffer;
2434ced8de1STim Renouf   raw_string_ostream OStream(Buffer);
2444ced8de1STim Renouf   Doc.toYAML(OStream);
2454ced8de1STim Renouf   ASSERT_EQ(OStream.str(), "---\n- 1\n- 2\n...\n");
2464ced8de1STim Renouf }
2474ced8de1STim Renouf 
TEST(MsgPackDocument,TestInputYAMLArray)2484ced8de1STim Renouf TEST(MsgPackDocument, TestInputYAMLArray) {
2494ced8de1STim Renouf   Document Doc;
2504ced8de1STim Renouf   bool Ok = Doc.fromYAML("---\n- !int 0x1\n- !str 2\n...\n");
2514ced8de1STim Renouf   ASSERT_TRUE(Ok);
2524ced8de1STim Renouf   ASSERT_EQ(Doc.getRoot().getKind(), Type::Array);
2534ced8de1STim Renouf   auto A = Doc.getRoot().getArray();
2544ced8de1STim Renouf   ASSERT_EQ(A.size(), 2u);
2554ced8de1STim Renouf   auto SI = A[0];
2564ced8de1STim Renouf   ASSERT_EQ(SI.getKind(), Type::UInt);
2574ced8de1STim Renouf   ASSERT_EQ(SI.getUInt(), 1u);
2584ced8de1STim Renouf   auto SS = A[1];
2594ced8de1STim Renouf   ASSERT_EQ(SS.getKind(), Type::String);
2604ced8de1STim Renouf   ASSERT_EQ(SS.getString(), "2");
2614ced8de1STim Renouf }
2624ced8de1STim Renouf 
TEST(MsgPackDocument,TestOutputYAMLMap)2634ced8de1STim Renouf TEST(MsgPackDocument, TestOutputYAMLMap) {
2644ced8de1STim Renouf   Document Doc;
2654ced8de1STim Renouf   auto M = Doc.getRoot().getMap(/*Convert=*/true);
266db16eb33STim Renouf   M["foo"] = 1;
267db16eb33STim Renouf   M["bar"] = 2U;
2684ced8de1STim Renouf   auto N = Doc.getMapNode();
2694ced8de1STim Renouf   M["qux"] = N;
270db16eb33STim Renouf   N["baz"] = true;
2714ced8de1STim Renouf   std::string Buffer;
2724ced8de1STim Renouf   raw_string_ostream OStream(Buffer);
2734ced8de1STim Renouf   Doc.toYAML(OStream);
2744ced8de1STim Renouf   ASSERT_EQ(OStream.str(), "---\n"
2754ced8de1STim Renouf                            "bar:             2\n"
2764ced8de1STim Renouf                            "foo:             1\n"
2774ced8de1STim Renouf                            "qux:\n"
2784ced8de1STim Renouf                            "  baz:             true\n"
2794ced8de1STim Renouf                            "...\n");
2804ced8de1STim Renouf }
2814ced8de1STim Renouf 
TEST(MsgPackDocument,TestOutputYAMLMapWithErase)282db16eb33STim Renouf TEST(MsgPackDocument, TestOutputYAMLMapWithErase) {
283db16eb33STim Renouf   Document Doc;
284db16eb33STim Renouf   auto M = Doc.getRoot().getMap(/*Convert=*/true);
285db16eb33STim Renouf   M["foo"] = 1;
286db16eb33STim Renouf   M["bar"] = 2U;
287db16eb33STim Renouf   auto N = Doc.getMapNode();
288db16eb33STim Renouf   M["qux"] = N;
289db16eb33STim Renouf   N["baz"] = true;
290db16eb33STim Renouf   M.erase(Doc.getNode("bar"));
291db16eb33STim Renouf   std::string Buffer;
292db16eb33STim Renouf   raw_string_ostream OStream(Buffer);
293db16eb33STim Renouf   Doc.toYAML(OStream);
294db16eb33STim Renouf   ASSERT_EQ(OStream.str(), "---\n"
295db16eb33STim Renouf                            "foo:             1\n"
296db16eb33STim Renouf                            "qux:\n"
297db16eb33STim Renouf                            "  baz:             true\n"
298db16eb33STim Renouf                            "...\n");
299db16eb33STim Renouf }
300db16eb33STim Renouf 
TEST(MsgPackDocument,TestOutputYAMLMapHex)3014ced8de1STim Renouf TEST(MsgPackDocument, TestOutputYAMLMapHex) {
3024ced8de1STim Renouf   Document Doc;
3034ced8de1STim Renouf   Doc.setHexMode();
3044ced8de1STim Renouf   auto M = Doc.getRoot().getMap(/*Convert=*/true);
305db16eb33STim Renouf   M["foo"] = 1;
306db16eb33STim Renouf   M["bar"] = 2U;
3074ced8de1STim Renouf   auto N = Doc.getMapNode();
3084ced8de1STim Renouf   M["qux"] = N;
309db16eb33STim Renouf   N["baz"] = true;
3104ced8de1STim Renouf   std::string Buffer;
3114ced8de1STim Renouf   raw_string_ostream OStream(Buffer);
3124ced8de1STim Renouf   Doc.toYAML(OStream);
3134ced8de1STim Renouf   ASSERT_EQ(OStream.str(), "---\n"
3144ced8de1STim Renouf                            "bar:             0x2\n"
3154ced8de1STim Renouf                            "foo:             1\n"
3164ced8de1STim Renouf                            "qux:\n"
3174ced8de1STim Renouf                            "  baz:             true\n"
3184ced8de1STim Renouf                            "...\n");
3194ced8de1STim Renouf }
3204ced8de1STim Renouf 
TEST(MsgPackDocument,TestInputYAMLMap)3214ced8de1STim Renouf TEST(MsgPackDocument, TestInputYAMLMap) {
3224ced8de1STim Renouf   Document Doc;
3234ced8de1STim Renouf   bool Ok = Doc.fromYAML("---\nfoo: !int 0x1\nbaz: !str 2\n...\n");
3244ced8de1STim Renouf   ASSERT_TRUE(Ok);
3254ced8de1STim Renouf   ASSERT_EQ(Doc.getRoot().getKind(), Type::Map);
3264ced8de1STim Renouf   auto M = Doc.getRoot().getMap();
3274ced8de1STim Renouf   ASSERT_EQ(M.size(), 2u);
3284ced8de1STim Renouf   auto SI = M["foo"];
3294ced8de1STim Renouf   ASSERT_EQ(SI.getKind(), Type::UInt);
3304ced8de1STim Renouf   ASSERT_EQ(SI.getUInt(), 1u);
3314ced8de1STim Renouf   auto SS = M["baz"];
3324ced8de1STim Renouf   ASSERT_EQ(SS.getKind(), Type::String);
3334ced8de1STim Renouf   ASSERT_EQ(SS.getString(), "2");
3344ced8de1STim Renouf }
335