xref: /llvm-project/llvm/unittests/BinaryFormat/MsgPackDocumentTest.cpp (revision 4ced8de17c5f9f1ec3faab0ea5fbe240ae9da611)
1 //===- MsgPackDocumentTest.cpp --------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/BinaryFormat/MsgPackDocument.h"
11 #include "gtest/gtest.h"
12 
13 using namespace llvm;
14 using namespace msgpack;
15 
16 TEST(MsgPackDocument, TestReadInt) {
17   Document Doc;
18   bool Ok = Doc.readFromBlob(StringRef("\xd0\x00", 2), /*Multi=*/false);
19   ASSERT_TRUE(Ok);
20   ASSERT_EQ(Doc.getRoot().getKind(), Type::Int);
21   ASSERT_EQ(Doc.getRoot().getInt(), 0);
22 }
23 
24 TEST(MsgPackDocument, TestReadArray) {
25   Document Doc;
26   bool Ok = Doc.readFromBlob(StringRef("\x92\xd0\x01\xc0"), /*Multi=*/false);
27   ASSERT_TRUE(Ok);
28   ASSERT_EQ(Doc.getRoot().getKind(), Type::Array);
29   auto A = Doc.getRoot().getArray();
30   ASSERT_EQ(A.size(), 2u);
31   auto SI = A[0];
32   ASSERT_EQ(SI.getKind(), Type::Int);
33   ASSERT_EQ(SI.getInt(), 1);
34   auto SN = A[1];
35   ASSERT_EQ(SN.getKind(), Type::Nil);
36 }
37 
38 TEST(MsgPackDocument, TestReadMap) {
39   Document Doc;
40   bool Ok = Doc.readFromBlob(StringRef("\x82\xa3"
41                                        "foo"
42                                        "\xd0\x01\xa3"
43                                        "bar"
44                                        "\xd0\x02"),
45                              /*Multi=*/false);
46   ASSERT_TRUE(Ok);
47   ASSERT_EQ(Doc.getRoot().getKind(), Type::Map);
48   auto M = Doc.getRoot().getMap();
49   ASSERT_EQ(M.size(), 2u);
50   auto FooS = M["foo"];
51   ASSERT_EQ(FooS.getKind(), Type::Int);
52   ASSERT_EQ(FooS.getInt(), 1);
53   auto BarS = M["bar"];
54   ASSERT_EQ(BarS.getKind(), Type::Int);
55   ASSERT_EQ(BarS.getInt(), 2);
56 }
57 
58 TEST(MsgPackDocument, TestWriteInt) {
59   Document Doc;
60   Doc.getRoot() = Doc.getNode(int64_t(1));
61   std::string Buffer;
62   Doc.writeToBlob(Buffer);
63   ASSERT_EQ(Buffer, "\x01");
64 }
65 
66 TEST(MsgPackDocument, TestWriteArray) {
67   Document Doc;
68   auto A = Doc.getRoot().getArray(/*Convert=*/true);
69   A.push_back(Doc.getNode(int64_t(1)));
70   A.push_back(Doc.getNode());
71   std::string Buffer;
72   Doc.writeToBlob(Buffer);
73   ASSERT_EQ(Buffer, "\x92\x01\xc0");
74 }
75 
76 TEST(MsgPackDocument, TestWriteMap) {
77   Document Doc;
78   auto M = Doc.getRoot().getMap(/*Convert=*/true);
79   M["foo"] = Doc.getNode(int64_t(1));
80   M["bar"] = Doc.getNode(int64_t(2));
81   std::string Buffer;
82   Doc.writeToBlob(Buffer);
83   ASSERT_EQ(Buffer, "\x82\xa3"
84                     "bar"
85                     "\x02\xa3"
86                     "foo"
87                     "\x01");
88 }
89 
90 TEST(MsgPackDocument, TestOutputYAMLArray) {
91   Document Doc;
92   auto A = Doc.getRoot().getArray(/*Convert=*/true);
93   A.push_back(Doc.getNode(int64_t(1)));
94   A.push_back(Doc.getNode(int64_t(2)));
95   std::string Buffer;
96   raw_string_ostream OStream(Buffer);
97   Doc.toYAML(OStream);
98   ASSERT_EQ(OStream.str(), "---\n- 1\n- 2\n...\n");
99 }
100 
101 TEST(MsgPackDocument, TestInputYAMLArray) {
102   Document Doc;
103   bool Ok = Doc.fromYAML("---\n- !int 0x1\n- !str 2\n...\n");
104   ASSERT_TRUE(Ok);
105   ASSERT_EQ(Doc.getRoot().getKind(), Type::Array);
106   auto A = Doc.getRoot().getArray();
107   ASSERT_EQ(A.size(), 2u);
108   auto SI = A[0];
109   ASSERT_EQ(SI.getKind(), Type::UInt);
110   ASSERT_EQ(SI.getUInt(), 1u);
111   auto SS = A[1];
112   ASSERT_EQ(SS.getKind(), Type::String);
113   ASSERT_EQ(SS.getString(), "2");
114 }
115 
116 TEST(MsgPackDocument, TestOutputYAMLMap) {
117   Document Doc;
118   auto M = Doc.getRoot().getMap(/*Convert=*/true);
119   M["foo"] = Doc.getNode(int64_t(1));
120   M["bar"] = Doc.getNode(uint64_t(2));
121   auto N = Doc.getMapNode();
122   M["qux"] = N;
123   N["baz"] = Doc.getNode(true);
124   std::string Buffer;
125   raw_string_ostream OStream(Buffer);
126   Doc.toYAML(OStream);
127   ASSERT_EQ(OStream.str(), "---\n"
128                            "bar:             2\n"
129                            "foo:             1\n"
130                            "qux:             \n"
131                            "  baz:             true\n"
132                            "...\n");
133 }
134 
135 TEST(MsgPackDocument, TestOutputYAMLMapHex) {
136   Document Doc;
137   Doc.setHexMode();
138   auto M = Doc.getRoot().getMap(/*Convert=*/true);
139   M["foo"] = Doc.getNode(int64_t(1));
140   M["bar"] = Doc.getNode(uint64_t(2));
141   auto N = Doc.getMapNode();
142   M["qux"] = N;
143   N["baz"] = Doc.getNode(true);
144   std::string Buffer;
145   raw_string_ostream OStream(Buffer);
146   Doc.toYAML(OStream);
147   ASSERT_EQ(OStream.str(), "---\n"
148                            "bar:             0x2\n"
149                            "foo:             1\n"
150                            "qux:             \n"
151                            "  baz:             true\n"
152                            "...\n");
153 }
154 
155 TEST(MsgPackDocument, TestInputYAMLMap) {
156   Document Doc;
157   bool Ok = Doc.fromYAML("---\nfoo: !int 0x1\nbaz: !str 2\n...\n");
158   ASSERT_TRUE(Ok);
159   ASSERT_EQ(Doc.getRoot().getKind(), Type::Map);
160   auto M = Doc.getRoot().getMap();
161   ASSERT_EQ(M.size(), 2u);
162   auto SI = M["foo"];
163   ASSERT_EQ(SI.getKind(), Type::UInt);
164   ASSERT_EQ(SI.getUInt(), 1u);
165   auto SS = M["baz"];
166   ASSERT_EQ(SS.getKind(), Type::String);
167   ASSERT_EQ(SS.getString(), "2");
168 }
169