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