1*20f9cd88SScott Linder //===- MsgPackWriterTest.cpp ------------------------------------*- C++ -*-===//
2*20f9cd88SScott Linder //
3*20f9cd88SScott Linder //                     The LLVM Compiler Infrastructure
4*20f9cd88SScott Linder //
5*20f9cd88SScott Linder // This file is distributed under the University of Illinois Open Source
6*20f9cd88SScott Linder // License. See LICENSE.TXT for details.
7*20f9cd88SScott Linder //
8*20f9cd88SScott Linder //===----------------------------------------------------------------------===//
9*20f9cd88SScott Linder 
10*20f9cd88SScott Linder #include "llvm/BinaryFormat/MsgPackWriter.h"
11*20f9cd88SScott Linder #include "llvm/BinaryFormat/MsgPack.h"
12*20f9cd88SScott Linder #include "gtest/gtest.h"
13*20f9cd88SScott Linder 
14*20f9cd88SScott Linder using namespace llvm;
15*20f9cd88SScott Linder using namespace llvm::msgpack;
16*20f9cd88SScott Linder 
17*20f9cd88SScott Linder struct MsgPackWriter : testing::Test {
18*20f9cd88SScott Linder   std::string Buffer;
19*20f9cd88SScott Linder   llvm::raw_string_ostream OStream;
20*20f9cd88SScott Linder   Writer MPWriter;
21*20f9cd88SScott Linder 
22*20f9cd88SScott Linder   MsgPackWriter() : OStream(Buffer), MPWriter(OStream) {}
23*20f9cd88SScott Linder };
24*20f9cd88SScott Linder 
25*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteNil) {
26*20f9cd88SScott Linder   MPWriter.writeNil();
27*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xc0");
28*20f9cd88SScott Linder }
29*20f9cd88SScott Linder 
30*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBool) {
31*20f9cd88SScott Linder   MPWriter.write(true);
32*20f9cd88SScott Linder   MPWriter.write(false);
33*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xc3\xc2");
34*20f9cd88SScott Linder }
35*20f9cd88SScott Linder 
36*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixPositiveInt) {
37*20f9cd88SScott Linder   // FixPositiveInt form bitpattern starts with 0, so max FixPositiveInt
38*20f9cd88SScott Linder   // is 01111111 = 127
39*20f9cd88SScott Linder   for (uint64_t u = 0; u <= 127; ++u) {
40*20f9cd88SScott Linder     Buffer.clear();
41*20f9cd88SScott Linder     MPWriter.write(u);
42*20f9cd88SScott Linder     std::string Output = OStream.str();
43*20f9cd88SScott Linder     EXPECT_EQ(Output.size(), 1u);
44*20f9cd88SScott Linder     EXPECT_EQ(Output.data()[0], static_cast<uint8_t>(u));
45*20f9cd88SScott Linder   }
46*20f9cd88SScott Linder }
47*20f9cd88SScott Linder 
48*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt8Min) {
49*20f9cd88SScott Linder   // See TestWriteFixPositiveInt for why 128 is the min non-fix Int8
50*20f9cd88SScott Linder   uint64_t u = 128;
51*20f9cd88SScott Linder   MPWriter.write(u);
52*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xcc\x80");
53*20f9cd88SScott Linder }
54*20f9cd88SScott Linder 
55*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt8) {
56*20f9cd88SScott Linder   uint64_t u = 221;
57*20f9cd88SScott Linder   MPWriter.write(u);
58*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xcc\xdd");
59*20f9cd88SScott Linder }
60*20f9cd88SScott Linder 
61*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt8Max) {
62*20f9cd88SScott Linder   uint64_t u = UINT8_MAX;
63*20f9cd88SScott Linder   MPWriter.write(u);
64*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xcc\xff");
65*20f9cd88SScott Linder }
66*20f9cd88SScott Linder 
67*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt16Min) {
68*20f9cd88SScott Linder   uint64_t u = static_cast<uint64_t>(UINT8_MAX) + 1;
69*20f9cd88SScott Linder   MPWriter.write(u);
70*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xcd\x01\x00", 3));
71*20f9cd88SScott Linder }
72*20f9cd88SScott Linder 
73*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt16) {
74*20f9cd88SScott Linder   uint64_t u = 43981;
75*20f9cd88SScott Linder   MPWriter.write(u);
76*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xcd\xab\xcd");
77*20f9cd88SScott Linder }
78*20f9cd88SScott Linder 
79*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt16Max) {
80*20f9cd88SScott Linder   uint64_t u = UINT16_MAX;
81*20f9cd88SScott Linder   MPWriter.write(u);
82*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xcd\xff\xff");
83*20f9cd88SScott Linder }
84*20f9cd88SScott Linder 
85*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt32Min) {
86*20f9cd88SScott Linder   uint64_t u = static_cast<uint64_t>(UINT16_MAX) + 1;
87*20f9cd88SScott Linder   MPWriter.write(u);
88*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xce\x00\x01\x00\x00", 5));
89*20f9cd88SScott Linder }
90*20f9cd88SScott Linder 
91*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt32) {
92*20f9cd88SScott Linder   uint64_t u = 2882400186;
93*20f9cd88SScott Linder   MPWriter.write(u);
94*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xce\xab\xcd\xef\xba");
95*20f9cd88SScott Linder }
96*20f9cd88SScott Linder 
97*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt32Max) {
98*20f9cd88SScott Linder   uint64_t u = UINT32_MAX;
99*20f9cd88SScott Linder   MPWriter.write(u);
100*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xce\xff\xff\xff\xff");
101*20f9cd88SScott Linder }
102*20f9cd88SScott Linder 
103*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt64Min) {
104*20f9cd88SScott Linder   uint64_t u = static_cast<uint64_t>(UINT32_MAX) + 1;
105*20f9cd88SScott Linder   MPWriter.write(u);
106*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(),
107*20f9cd88SScott Linder             std::string("\xcf\x00\x00\x00\x01\x00\x00\x00\x00", 9));
108*20f9cd88SScott Linder }
109*20f9cd88SScott Linder 
110*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt64) {
111*20f9cd88SScott Linder   uint64_t u = 0x010203040506074a;
112*20f9cd88SScott Linder   MPWriter.write(u);
113*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xcf\x01\x02\x03\x04\x05\x06\x07\x4a");
114*20f9cd88SScott Linder }
115*20f9cd88SScott Linder 
116*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt64Max) {
117*20f9cd88SScott Linder   uint64_t u = UINT64_MAX;
118*20f9cd88SScott Linder   MPWriter.write(u);
119*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xcf\xff\xff\xff\xff\xff\xff\xff\xff");
120*20f9cd88SScott Linder }
121*20f9cd88SScott Linder 
122*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixNegativeInt) {
123*20f9cd88SScott Linder   // Positive values will be written in a UInt form, so max FixNegativeInt is -1
124*20f9cd88SScott Linder   //
125*20f9cd88SScott Linder   // FixNegativeInt form bitpattern starts with 111, so min FixNegativeInt
126*20f9cd88SScott Linder   // is 11100000 = -32
127*20f9cd88SScott Linder   for (int64_t i = -1; i >= -32; --i) {
128*20f9cd88SScott Linder     Buffer.clear();
129*20f9cd88SScott Linder     MPWriter.write(i);
130*20f9cd88SScott Linder     std::string Output = OStream.str();
131*20f9cd88SScott Linder     EXPECT_EQ(Output.size(), 1u);
132*20f9cd88SScott Linder     EXPECT_EQ(Output.data()[0], static_cast<int8_t>(i));
133*20f9cd88SScott Linder   }
134*20f9cd88SScott Linder }
135*20f9cd88SScott Linder 
136*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt8Max) {
137*20f9cd88SScott Linder   // See TestWriteFixNegativeInt for why -33 is the max non-fix Int8
138*20f9cd88SScott Linder   int64_t i = -33;
139*20f9cd88SScott Linder   MPWriter.write(i);
140*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xd0\xdf");
141*20f9cd88SScott Linder }
142*20f9cd88SScott Linder 
143*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt8) {
144*20f9cd88SScott Linder   int64_t i = -40;
145*20f9cd88SScott Linder   MPWriter.write(i);
146*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xd0\xd8");
147*20f9cd88SScott Linder }
148*20f9cd88SScott Linder 
149*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt8Min) {
150*20f9cd88SScott Linder   int64_t i = INT8_MIN;
151*20f9cd88SScott Linder   MPWriter.write(i);
152*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xd0\x80");
153*20f9cd88SScott Linder }
154*20f9cd88SScott Linder 
155*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt16Max) {
156*20f9cd88SScott Linder   int64_t i = static_cast<int64_t>(INT8_MIN) - 1;
157*20f9cd88SScott Linder   MPWriter.write(i);
158*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xd1\xff\x7f");
159*20f9cd88SScott Linder }
160*20f9cd88SScott Linder 
161*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt16) {
162*20f9cd88SScott Linder   int64_t i = -4369;
163*20f9cd88SScott Linder   MPWriter.write(i);
164*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xd1\xee\xef");
165*20f9cd88SScott Linder }
166*20f9cd88SScott Linder 
167*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt16Min) {
168*20f9cd88SScott Linder   int64_t i = INT16_MIN;
169*20f9cd88SScott Linder   MPWriter.write(i);
170*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd1\x80\x00", 3));
171*20f9cd88SScott Linder }
172*20f9cd88SScott Linder 
173*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt32Max) {
174*20f9cd88SScott Linder   int64_t i = static_cast<int64_t>(INT16_MIN) - 1;
175*20f9cd88SScott Linder   MPWriter.write(i);
176*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xd2\xff\xff\x7f\xff");
177*20f9cd88SScott Linder }
178*20f9cd88SScott Linder 
179*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt32) {
180*20f9cd88SScott Linder   int64_t i = -286331153;
181*20f9cd88SScott Linder   MPWriter.write(i);
182*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xd2\xee\xee\xee\xef");
183*20f9cd88SScott Linder }
184*20f9cd88SScott Linder 
185*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt32Min) {
186*20f9cd88SScott Linder   int64_t i = INT32_MIN;
187*20f9cd88SScott Linder   MPWriter.write(i);
188*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd2\x80\x00\x00\x00", 5));
189*20f9cd88SScott Linder }
190*20f9cd88SScott Linder 
191*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt64Max) {
192*20f9cd88SScott Linder   int64_t i = static_cast<int64_t>(INT32_MIN) - 1;
193*20f9cd88SScott Linder   MPWriter.write(i);
194*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xd3\xff\xff\xff\xff\x7f\xff\xff\xff");
195*20f9cd88SScott Linder }
196*20f9cd88SScott Linder 
197*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt64) {
198*20f9cd88SScott Linder   int64_t i = -1229782938247303441;
199*20f9cd88SScott Linder   MPWriter.write(i);
200*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xd3\xee\xee\xee\xee\xee\xee\xee\xef");
201*20f9cd88SScott Linder }
202*20f9cd88SScott Linder 
203*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt64Min) {
204*20f9cd88SScott Linder   int64_t i = INT64_MIN;
205*20f9cd88SScott Linder   MPWriter.write(i);
206*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(),
207*20f9cd88SScott Linder             std::string("\xd3\x80\x00\x00\x00\x00\x00\x00\x00", 9));
208*20f9cd88SScott Linder }
209*20f9cd88SScott Linder 
210*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFloat32) {
211*20f9cd88SScott Linder   float f = -3.6973142664068907e+28;
212*20f9cd88SScott Linder   MPWriter.write(f);
213*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xca\xee\xee\xee\xef");
214*20f9cd88SScott Linder }
215*20f9cd88SScott Linder 
216*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFloat64) {
217*20f9cd88SScott Linder   double d = -2.2899894549927042e+226;
218*20f9cd88SScott Linder   MPWriter.write(d);
219*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xcb\xee\xee\xee\xee\xee\xee\xee\xef");
220*20f9cd88SScott Linder }
221*20f9cd88SScott Linder 
222*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixStrMin) {
223*20f9cd88SScott Linder   std::string s;
224*20f9cd88SScott Linder   MPWriter.write(s);
225*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xa0");
226*20f9cd88SScott Linder }
227*20f9cd88SScott Linder 
228*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixStr) {
229*20f9cd88SScott Linder   std::string s = "foo";
230*20f9cd88SScott Linder   MPWriter.write(s);
231*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xa3"
232*20f9cd88SScott Linder                            "foo");
233*20f9cd88SScott Linder }
234*20f9cd88SScott Linder 
235*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixStrMax) {
236*20f9cd88SScott Linder   // FixStr format's size is a 5 bit unsigned integer, so max is 11111 = 31
237*20f9cd88SScott Linder   std::string s(31, 'a');
238*20f9cd88SScott Linder   MPWriter.write(s);
239*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xbf") + s);
240*20f9cd88SScott Linder }
241*20f9cd88SScott Linder 
242*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr8Min) {
243*20f9cd88SScott Linder   // See TestWriteFixStrMax for why 32 is the min non-fix Str8
244*20f9cd88SScott Linder   std::string s(32, 'a');
245*20f9cd88SScott Linder   MPWriter.write(s);
246*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd9\x20") + s);
247*20f9cd88SScott Linder }
248*20f9cd88SScott Linder 
249*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr8) {
250*20f9cd88SScott Linder   std::string s(33, 'a');
251*20f9cd88SScott Linder   MPWriter.write(s);
252*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd9\x21") + s);
253*20f9cd88SScott Linder }
254*20f9cd88SScott Linder 
255*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr8Max) {
256*20f9cd88SScott Linder   std::string s(UINT8_MAX, 'a');
257*20f9cd88SScott Linder   MPWriter.write(s);
258*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd9\xff") + s);
259*20f9cd88SScott Linder }
260*20f9cd88SScott Linder 
261*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr16Min) {
262*20f9cd88SScott Linder   std::string s(static_cast<uint64_t>(UINT8_MAX) + 1, 'a');
263*20f9cd88SScott Linder   MPWriter.write(s);
264*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xda\x01\x00", 3) + s);
265*20f9cd88SScott Linder }
266*20f9cd88SScott Linder 
267*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr16) {
268*20f9cd88SScott Linder   std::string s(511, 'a');
269*20f9cd88SScott Linder   MPWriter.write(s);
270*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xda\x01\xff") + s);
271*20f9cd88SScott Linder }
272*20f9cd88SScott Linder 
273*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr16Max) {
274*20f9cd88SScott Linder   std::string s(UINT16_MAX, 'a');
275*20f9cd88SScott Linder   MPWriter.write(s);
276*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xda\xff\xff") + s);
277*20f9cd88SScott Linder }
278*20f9cd88SScott Linder 
279*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr32Min) {
280*20f9cd88SScott Linder   std::string s(static_cast<uint64_t>(UINT16_MAX) + 1, 'a');
281*20f9cd88SScott Linder   MPWriter.write(s);
282*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xdb\x00\x01\x00\x00", 5) + s);
283*20f9cd88SScott Linder }
284*20f9cd88SScott Linder 
285*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr32) {
286*20f9cd88SScott Linder   std::string s(131071, 'a');
287*20f9cd88SScott Linder   MPWriter.write(s);
288*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xdb\x00\x01\xff\xff", 5) + s);
289*20f9cd88SScott Linder }
290*20f9cd88SScott Linder 
291*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin8Min) {
292*20f9cd88SScott Linder   std::string s;
293*20f9cd88SScott Linder   MPWriter.write(MemoryBufferRef(s, ""));
294*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc4\x00", 2) + s);
295*20f9cd88SScott Linder }
296*20f9cd88SScott Linder 
297*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin8) {
298*20f9cd88SScott Linder   std::string s(5, 'a');
299*20f9cd88SScott Linder   MPWriter.write(MemoryBufferRef(s, ""));
300*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc4\x05") + s);
301*20f9cd88SScott Linder }
302*20f9cd88SScott Linder 
303*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin8Max) {
304*20f9cd88SScott Linder   std::string s(UINT8_MAX, 'a');
305*20f9cd88SScott Linder   MPWriter.write(MemoryBufferRef(s, ""));
306*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc4\xff") + s);
307*20f9cd88SScott Linder }
308*20f9cd88SScott Linder 
309*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin16Min) {
310*20f9cd88SScott Linder   std::string s(static_cast<uint64_t>(UINT8_MAX) + 1, 'a');
311*20f9cd88SScott Linder   MPWriter.write(MemoryBufferRef(s, ""));
312*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc5\x01\x00", 3) + s);
313*20f9cd88SScott Linder }
314*20f9cd88SScott Linder 
315*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin16) {
316*20f9cd88SScott Linder   std::string s(511, 'a');
317*20f9cd88SScott Linder   MPWriter.write(MemoryBufferRef(s, ""));
318*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xc5\x01\xff" + s);
319*20f9cd88SScott Linder }
320*20f9cd88SScott Linder 
321*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin16Max) {
322*20f9cd88SScott Linder   std::string s(UINT16_MAX, 'a');
323*20f9cd88SScott Linder   MPWriter.write(MemoryBufferRef(s, ""));
324*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc5\xff\xff") + s);
325*20f9cd88SScott Linder }
326*20f9cd88SScott Linder 
327*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin32Min) {
328*20f9cd88SScott Linder   std::string s(static_cast<uint64_t>(UINT16_MAX) + 1, 'a');
329*20f9cd88SScott Linder   MPWriter.write(MemoryBufferRef(s, ""));
330*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc6\x00\x01\x00\x00", 5) + s);
331*20f9cd88SScott Linder }
332*20f9cd88SScott Linder 
333*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin32) {
334*20f9cd88SScott Linder   std::string s(131071, 'a');
335*20f9cd88SScott Linder   MPWriter.write(MemoryBufferRef(s, ""));
336*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc6\x00\x01\xff\xff", 5) + s);
337*20f9cd88SScott Linder }
338*20f9cd88SScott Linder 
339*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixArrayMin) {
340*20f9cd88SScott Linder   MPWriter.writeArraySize(0);
341*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\x90");
342*20f9cd88SScott Linder }
343*20f9cd88SScott Linder 
344*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixArray) {
345*20f9cd88SScott Linder   MPWriter.writeArraySize(4);
346*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\x94");
347*20f9cd88SScott Linder }
348*20f9cd88SScott Linder 
349*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixArrayMax) {
350*20f9cd88SScott Linder   // FixArray format's size is a 4 bit unsigned integer, so max is 1111 = 15
351*20f9cd88SScott Linder   MPWriter.writeArraySize(15);
352*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\x9f");
353*20f9cd88SScott Linder }
354*20f9cd88SScott Linder 
355*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray16Min) {
356*20f9cd88SScott Linder   // See TestWriteFixArrayMax for why 16 is the min non-fix Array16
357*20f9cd88SScott Linder   MPWriter.writeArraySize(16);
358*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xdc\x00\x10", 3));
359*20f9cd88SScott Linder }
360*20f9cd88SScott Linder 
361*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray16) {
362*20f9cd88SScott Linder   MPWriter.writeArraySize(273);
363*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xdc\x01\x11");
364*20f9cd88SScott Linder }
365*20f9cd88SScott Linder 
366*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray16Max) {
367*20f9cd88SScott Linder   MPWriter.writeArraySize(UINT16_MAX);
368*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xdc\xff\xff");
369*20f9cd88SScott Linder }
370*20f9cd88SScott Linder 
371*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray32Min) {
372*20f9cd88SScott Linder   MPWriter.writeArraySize(static_cast<uint64_t>(UINT16_MAX) + 1);
373*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xdd\x00\x01\x00\x00", 5));
374*20f9cd88SScott Linder }
375*20f9cd88SScott Linder 
376*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray32) {
377*20f9cd88SScott Linder   MPWriter.writeArraySize(131071);
378*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xdd\x00\x01\xff\xff", 5));
379*20f9cd88SScott Linder }
380*20f9cd88SScott Linder 
381*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray32Max) {
382*20f9cd88SScott Linder   MPWriter.writeArraySize(UINT32_MAX);
383*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xdd\xff\xff\xff\xff");
384*20f9cd88SScott Linder }
385*20f9cd88SScott Linder 
386*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixMapMin) {
387*20f9cd88SScott Linder   MPWriter.writeMapSize(0);
388*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\x80");
389*20f9cd88SScott Linder }
390*20f9cd88SScott Linder 
391*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixMap) {
392*20f9cd88SScott Linder   MPWriter.writeMapSize(4);
393*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\x84");
394*20f9cd88SScott Linder }
395*20f9cd88SScott Linder 
396*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixMapMax) {
397*20f9cd88SScott Linder   // FixMap format's size is a 4 bit unsigned integer, so max is 1111 = 15
398*20f9cd88SScott Linder   MPWriter.writeMapSize(15);
399*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\x8f");
400*20f9cd88SScott Linder }
401*20f9cd88SScott Linder 
402*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap16Min) {
403*20f9cd88SScott Linder   // See TestWriteFixMapMax for why 16 is the min non-fix Map16
404*20f9cd88SScott Linder   MPWriter.writeMapSize(16);
405*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xde\x00\x10", 3));
406*20f9cd88SScott Linder }
407*20f9cd88SScott Linder 
408*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap16) {
409*20f9cd88SScott Linder   MPWriter.writeMapSize(273);
410*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xde\x01\x11");
411*20f9cd88SScott Linder }
412*20f9cd88SScott Linder 
413*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap16Max) {
414*20f9cd88SScott Linder   MPWriter.writeMapSize(UINT16_MAX);
415*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), "\xde\xff\xff");
416*20f9cd88SScott Linder }
417*20f9cd88SScott Linder 
418*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap32Min) {
419*20f9cd88SScott Linder   MPWriter.writeMapSize(static_cast<uint64_t>(UINT16_MAX) + 1);
420*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xdf\x00\x01\x00\x00", 5));
421*20f9cd88SScott Linder }
422*20f9cd88SScott Linder 
423*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap32) {
424*20f9cd88SScott Linder   MPWriter.writeMapSize(131071);
425*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xdf\x00\x01\xff\xff", 5));
426*20f9cd88SScott Linder }
427*20f9cd88SScott Linder 
428*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap32Max) {
429*20f9cd88SScott Linder   MPWriter.writeMapSize(UINT32_MAX);
430*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xdf\xff\xff\xff\xff", 5));
431*20f9cd88SScott Linder }
432*20f9cd88SScott Linder 
433*20f9cd88SScott Linder // FixExt formats are only available for these specific lengths: 1, 2, 4, 8, 16
434*20f9cd88SScott Linder 
435*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt1) {
436*20f9cd88SScott Linder   std::string s(1, 'a');
437*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
438*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd4\x01") + s);
439*20f9cd88SScott Linder }
440*20f9cd88SScott Linder 
441*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt2) {
442*20f9cd88SScott Linder   std::string s(2, 'a');
443*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
444*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd5\x01") + s);
445*20f9cd88SScott Linder }
446*20f9cd88SScott Linder 
447*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt4) {
448*20f9cd88SScott Linder   std::string s(4, 'a');
449*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
450*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd6\x01") + s);
451*20f9cd88SScott Linder }
452*20f9cd88SScott Linder 
453*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt8) {
454*20f9cd88SScott Linder   std::string s(8, 'a');
455*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
456*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd7\x01") + s);
457*20f9cd88SScott Linder }
458*20f9cd88SScott Linder 
459*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt16) {
460*20f9cd88SScott Linder   std::string s(16, 'a');
461*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
462*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xd8\x01") + s);
463*20f9cd88SScott Linder }
464*20f9cd88SScott Linder 
465*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt8Min) {
466*20f9cd88SScott Linder   std::string s;
467*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
468*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc7\x00\x01", 3) + s);
469*20f9cd88SScott Linder }
470*20f9cd88SScott Linder 
471*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt8) {
472*20f9cd88SScott Linder   std::string s(0x2a, 'a');
473*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
474*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc7\x2a\x01") + s);
475*20f9cd88SScott Linder }
476*20f9cd88SScott Linder 
477*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt8Max) {
478*20f9cd88SScott Linder   std::string s(UINT8_MAX, 'a');
479*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
480*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc7\xff\x01") + s);
481*20f9cd88SScott Linder }
482*20f9cd88SScott Linder 
483*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt16Min) {
484*20f9cd88SScott Linder   std::string s(static_cast<uint16_t>(UINT8_MAX) + 1, 'a');
485*20f9cd88SScott Linder   MPWriter.writeExt(0x02, MemoryBufferRef(s, ""));
486*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc8\x01\x00\x02", 4) + s);
487*20f9cd88SScott Linder }
488*20f9cd88SScott Linder 
489*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt16) {
490*20f9cd88SScott Linder   std::string s(273, 'a');
491*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
492*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc8\x01\x11\x01") + s);
493*20f9cd88SScott Linder }
494*20f9cd88SScott Linder 
495*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt16Max) {
496*20f9cd88SScott Linder   std::string s(UINT16_MAX, 'a');
497*20f9cd88SScott Linder   MPWriter.writeExt(0x01, MemoryBufferRef(s, ""));
498*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc8\xff\xff\x01") + s);
499*20f9cd88SScott Linder }
500*20f9cd88SScott Linder 
501*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt32Min) {
502*20f9cd88SScott Linder   std::string s(static_cast<uint32_t>(UINT16_MAX) + 1, 'a');
503*20f9cd88SScott Linder   MPWriter.writeExt(0x02, MemoryBufferRef(s, ""));
504*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xc9\x00\x01\x00\x00\x02", 6) + s);
505*20f9cd88SScott Linder }
506*20f9cd88SScott Linder 
507*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteCompatibleNoStr8) {
508*20f9cd88SScott Linder   Writer CompatWriter(OStream, true);
509*20f9cd88SScott Linder   std::string s(32, 'a');
510*20f9cd88SScott Linder   CompatWriter.write(s);
511*20f9cd88SScott Linder   EXPECT_EQ(OStream.str(), std::string("\xda\x00\x20", 3) + s);
512*20f9cd88SScott Linder }
513*20f9cd88SScott Linder 
514*20f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteCompatibleNoBin) {
515*20f9cd88SScott Linder   Writer CompatWriter(OStream, true);
516*20f9cd88SScott Linder   std::string s;
517*20f9cd88SScott Linder 
518*20f9cd88SScott Linder #ifdef GTEST_HAS_DEATH_TEST
519*20f9cd88SScott Linder #ifndef NDEBUG
520*20f9cd88SScott Linder   EXPECT_DEATH(CompatWriter.write(MemoryBufferRef(s, "")), "compatible mode");
521*20f9cd88SScott Linder #endif
522*20f9cd88SScott Linder #endif
523*20f9cd88SScott Linder }
524