120f9cd88SScott Linder //===- MsgPackWriterTest.cpp ------------------------------------*- C++ -*-===// 220f9cd88SScott Linder // 320f9cd88SScott Linder // The LLVM Compiler Infrastructure 420f9cd88SScott Linder // 520f9cd88SScott Linder // This file is distributed under the University of Illinois Open Source 620f9cd88SScott Linder // License. See LICENSE.TXT for details. 720f9cd88SScott Linder // 820f9cd88SScott Linder //===----------------------------------------------------------------------===// 920f9cd88SScott Linder 1020f9cd88SScott Linder #include "llvm/BinaryFormat/MsgPackWriter.h" 1120f9cd88SScott Linder #include "llvm/BinaryFormat/MsgPack.h" 1220f9cd88SScott Linder #include "gtest/gtest.h" 1320f9cd88SScott Linder 1420f9cd88SScott Linder using namespace llvm; 1520f9cd88SScott Linder using namespace llvm::msgpack; 1620f9cd88SScott Linder 1720f9cd88SScott Linder struct MsgPackWriter : testing::Test { 1820f9cd88SScott Linder std::string Buffer; 1920f9cd88SScott Linder llvm::raw_string_ostream OStream; 2020f9cd88SScott Linder Writer MPWriter; 2120f9cd88SScott Linder 2220f9cd88SScott Linder MsgPackWriter() : OStream(Buffer), MPWriter(OStream) {} 2320f9cd88SScott Linder }; 2420f9cd88SScott Linder 2520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteNil) { 2620f9cd88SScott Linder MPWriter.writeNil(); 2720f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xc0"); 2820f9cd88SScott Linder } 2920f9cd88SScott Linder 3020f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBool) { 3120f9cd88SScott Linder MPWriter.write(true); 3220f9cd88SScott Linder MPWriter.write(false); 3320f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xc3\xc2"); 3420f9cd88SScott Linder } 3520f9cd88SScott Linder 3620f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixPositiveInt) { 3720f9cd88SScott Linder // FixPositiveInt form bitpattern starts with 0, so max FixPositiveInt 3820f9cd88SScott Linder // is 01111111 = 127 3920f9cd88SScott Linder for (uint64_t u = 0; u <= 127; ++u) { 4020f9cd88SScott Linder Buffer.clear(); 4120f9cd88SScott Linder MPWriter.write(u); 4220f9cd88SScott Linder std::string Output = OStream.str(); 4320f9cd88SScott Linder EXPECT_EQ(Output.size(), 1u); 4420f9cd88SScott Linder EXPECT_EQ(Output.data()[0], static_cast<uint8_t>(u)); 4520f9cd88SScott Linder } 4620f9cd88SScott Linder } 4720f9cd88SScott Linder 4820f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt8Min) { 4920f9cd88SScott Linder // See TestWriteFixPositiveInt for why 128 is the min non-fix Int8 5020f9cd88SScott Linder uint64_t u = 128; 5120f9cd88SScott Linder MPWriter.write(u); 5220f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xcc\x80"); 5320f9cd88SScott Linder } 5420f9cd88SScott Linder 5520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt8) { 5620f9cd88SScott Linder uint64_t u = 221; 5720f9cd88SScott Linder MPWriter.write(u); 5820f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xcc\xdd"); 5920f9cd88SScott Linder } 6020f9cd88SScott Linder 6120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt8Max) { 6220f9cd88SScott Linder uint64_t u = UINT8_MAX; 6320f9cd88SScott Linder MPWriter.write(u); 6420f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xcc\xff"); 6520f9cd88SScott Linder } 6620f9cd88SScott Linder 6720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt16Min) { 6820f9cd88SScott Linder uint64_t u = static_cast<uint64_t>(UINT8_MAX) + 1; 6920f9cd88SScott Linder MPWriter.write(u); 7020f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xcd\x01\x00", 3)); 7120f9cd88SScott Linder } 7220f9cd88SScott Linder 7320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt16) { 7420f9cd88SScott Linder uint64_t u = 43981; 7520f9cd88SScott Linder MPWriter.write(u); 7620f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xcd\xab\xcd"); 7720f9cd88SScott Linder } 7820f9cd88SScott Linder 7920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt16Max) { 8020f9cd88SScott Linder uint64_t u = UINT16_MAX; 8120f9cd88SScott Linder MPWriter.write(u); 8220f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xcd\xff\xff"); 8320f9cd88SScott Linder } 8420f9cd88SScott Linder 8520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt32Min) { 8620f9cd88SScott Linder uint64_t u = static_cast<uint64_t>(UINT16_MAX) + 1; 8720f9cd88SScott Linder MPWriter.write(u); 8820f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xce\x00\x01\x00\x00", 5)); 8920f9cd88SScott Linder } 9020f9cd88SScott Linder 9120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt32) { 9220f9cd88SScott Linder uint64_t u = 2882400186; 9320f9cd88SScott Linder MPWriter.write(u); 9420f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xce\xab\xcd\xef\xba"); 9520f9cd88SScott Linder } 9620f9cd88SScott Linder 9720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt32Max) { 9820f9cd88SScott Linder uint64_t u = UINT32_MAX; 9920f9cd88SScott Linder MPWriter.write(u); 10020f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xce\xff\xff\xff\xff"); 10120f9cd88SScott Linder } 10220f9cd88SScott Linder 10320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt64Min) { 10420f9cd88SScott Linder uint64_t u = static_cast<uint64_t>(UINT32_MAX) + 1; 10520f9cd88SScott Linder MPWriter.write(u); 10620f9cd88SScott Linder EXPECT_EQ(OStream.str(), 10720f9cd88SScott Linder std::string("\xcf\x00\x00\x00\x01\x00\x00\x00\x00", 9)); 10820f9cd88SScott Linder } 10920f9cd88SScott Linder 11020f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt64) { 11120f9cd88SScott Linder uint64_t u = 0x010203040506074a; 11220f9cd88SScott Linder MPWriter.write(u); 11320f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xcf\x01\x02\x03\x04\x05\x06\x07\x4a"); 11420f9cd88SScott Linder } 11520f9cd88SScott Linder 11620f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteUInt64Max) { 11720f9cd88SScott Linder uint64_t u = UINT64_MAX; 11820f9cd88SScott Linder MPWriter.write(u); 11920f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xcf\xff\xff\xff\xff\xff\xff\xff\xff"); 12020f9cd88SScott Linder } 12120f9cd88SScott Linder 12220f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixNegativeInt) { 12320f9cd88SScott Linder // Positive values will be written in a UInt form, so max FixNegativeInt is -1 12420f9cd88SScott Linder // 12520f9cd88SScott Linder // FixNegativeInt form bitpattern starts with 111, so min FixNegativeInt 12620f9cd88SScott Linder // is 11100000 = -32 12720f9cd88SScott Linder for (int64_t i = -1; i >= -32; --i) { 12820f9cd88SScott Linder Buffer.clear(); 12920f9cd88SScott Linder MPWriter.write(i); 13020f9cd88SScott Linder std::string Output = OStream.str(); 13120f9cd88SScott Linder EXPECT_EQ(Output.size(), 1u); 132*daab25b8SVitaly Buka EXPECT_EQ(static_cast<int8_t>(Output.data()[0]), static_cast<int8_t>(i)); 13320f9cd88SScott Linder } 13420f9cd88SScott Linder } 13520f9cd88SScott Linder 13620f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt8Max) { 13720f9cd88SScott Linder // See TestWriteFixNegativeInt for why -33 is the max non-fix Int8 13820f9cd88SScott Linder int64_t i = -33; 13920f9cd88SScott Linder MPWriter.write(i); 14020f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xd0\xdf"); 14120f9cd88SScott Linder } 14220f9cd88SScott Linder 14320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt8) { 14420f9cd88SScott Linder int64_t i = -40; 14520f9cd88SScott Linder MPWriter.write(i); 14620f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xd0\xd8"); 14720f9cd88SScott Linder } 14820f9cd88SScott Linder 14920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt8Min) { 15020f9cd88SScott Linder int64_t i = INT8_MIN; 15120f9cd88SScott Linder MPWriter.write(i); 15220f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xd0\x80"); 15320f9cd88SScott Linder } 15420f9cd88SScott Linder 15520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt16Max) { 15620f9cd88SScott Linder int64_t i = static_cast<int64_t>(INT8_MIN) - 1; 15720f9cd88SScott Linder MPWriter.write(i); 15820f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xd1\xff\x7f"); 15920f9cd88SScott Linder } 16020f9cd88SScott Linder 16120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt16) { 16220f9cd88SScott Linder int64_t i = -4369; 16320f9cd88SScott Linder MPWriter.write(i); 16420f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xd1\xee\xef"); 16520f9cd88SScott Linder } 16620f9cd88SScott Linder 16720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt16Min) { 16820f9cd88SScott Linder int64_t i = INT16_MIN; 16920f9cd88SScott Linder MPWriter.write(i); 17020f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd1\x80\x00", 3)); 17120f9cd88SScott Linder } 17220f9cd88SScott Linder 17320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt32Max) { 17420f9cd88SScott Linder int64_t i = static_cast<int64_t>(INT16_MIN) - 1; 17520f9cd88SScott Linder MPWriter.write(i); 17620f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xd2\xff\xff\x7f\xff"); 17720f9cd88SScott Linder } 17820f9cd88SScott Linder 17920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt32) { 18020f9cd88SScott Linder int64_t i = -286331153; 18120f9cd88SScott Linder MPWriter.write(i); 18220f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xd2\xee\xee\xee\xef"); 18320f9cd88SScott Linder } 18420f9cd88SScott Linder 18520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt32Min) { 18620f9cd88SScott Linder int64_t i = INT32_MIN; 18720f9cd88SScott Linder MPWriter.write(i); 18820f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd2\x80\x00\x00\x00", 5)); 18920f9cd88SScott Linder } 19020f9cd88SScott Linder 19120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt64Max) { 19220f9cd88SScott Linder int64_t i = static_cast<int64_t>(INT32_MIN) - 1; 19320f9cd88SScott Linder MPWriter.write(i); 19420f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xd3\xff\xff\xff\xff\x7f\xff\xff\xff"); 19520f9cd88SScott Linder } 19620f9cd88SScott Linder 19720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt64) { 19820f9cd88SScott Linder int64_t i = -1229782938247303441; 19920f9cd88SScott Linder MPWriter.write(i); 20020f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xd3\xee\xee\xee\xee\xee\xee\xee\xef"); 20120f9cd88SScott Linder } 20220f9cd88SScott Linder 20320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteInt64Min) { 20420f9cd88SScott Linder int64_t i = INT64_MIN; 20520f9cd88SScott Linder MPWriter.write(i); 20620f9cd88SScott Linder EXPECT_EQ(OStream.str(), 20720f9cd88SScott Linder std::string("\xd3\x80\x00\x00\x00\x00\x00\x00\x00", 9)); 20820f9cd88SScott Linder } 20920f9cd88SScott Linder 21020f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFloat32) { 21120f9cd88SScott Linder float f = -3.6973142664068907e+28; 21220f9cd88SScott Linder MPWriter.write(f); 21320f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xca\xee\xee\xee\xef"); 21420f9cd88SScott Linder } 21520f9cd88SScott Linder 21620f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFloat64) { 21720f9cd88SScott Linder double d = -2.2899894549927042e+226; 21820f9cd88SScott Linder MPWriter.write(d); 21920f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xcb\xee\xee\xee\xee\xee\xee\xee\xef"); 22020f9cd88SScott Linder } 22120f9cd88SScott Linder 22220f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixStrMin) { 22320f9cd88SScott Linder std::string s; 22420f9cd88SScott Linder MPWriter.write(s); 22520f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xa0"); 22620f9cd88SScott Linder } 22720f9cd88SScott Linder 22820f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixStr) { 22920f9cd88SScott Linder std::string s = "foo"; 23020f9cd88SScott Linder MPWriter.write(s); 23120f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xa3" 23220f9cd88SScott Linder "foo"); 23320f9cd88SScott Linder } 23420f9cd88SScott Linder 23520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixStrMax) { 23620f9cd88SScott Linder // FixStr format's size is a 5 bit unsigned integer, so max is 11111 = 31 23720f9cd88SScott Linder std::string s(31, 'a'); 23820f9cd88SScott Linder MPWriter.write(s); 23920f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xbf") + s); 24020f9cd88SScott Linder } 24120f9cd88SScott Linder 24220f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr8Min) { 24320f9cd88SScott Linder // See TestWriteFixStrMax for why 32 is the min non-fix Str8 24420f9cd88SScott Linder std::string s(32, 'a'); 24520f9cd88SScott Linder MPWriter.write(s); 24620f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd9\x20") + s); 24720f9cd88SScott Linder } 24820f9cd88SScott Linder 24920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr8) { 25020f9cd88SScott Linder std::string s(33, 'a'); 25120f9cd88SScott Linder MPWriter.write(s); 25220f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd9\x21") + s); 25320f9cd88SScott Linder } 25420f9cd88SScott Linder 25520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr8Max) { 25620f9cd88SScott Linder std::string s(UINT8_MAX, 'a'); 25720f9cd88SScott Linder MPWriter.write(s); 25820f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd9\xff") + s); 25920f9cd88SScott Linder } 26020f9cd88SScott Linder 26120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr16Min) { 26220f9cd88SScott Linder std::string s(static_cast<uint64_t>(UINT8_MAX) + 1, 'a'); 26320f9cd88SScott Linder MPWriter.write(s); 26420f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xda\x01\x00", 3) + s); 26520f9cd88SScott Linder } 26620f9cd88SScott Linder 26720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr16) { 26820f9cd88SScott Linder std::string s(511, 'a'); 26920f9cd88SScott Linder MPWriter.write(s); 27020f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xda\x01\xff") + s); 27120f9cd88SScott Linder } 27220f9cd88SScott Linder 27320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr16Max) { 27420f9cd88SScott Linder std::string s(UINT16_MAX, 'a'); 27520f9cd88SScott Linder MPWriter.write(s); 27620f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xda\xff\xff") + s); 27720f9cd88SScott Linder } 27820f9cd88SScott Linder 27920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr32Min) { 28020f9cd88SScott Linder std::string s(static_cast<uint64_t>(UINT16_MAX) + 1, 'a'); 28120f9cd88SScott Linder MPWriter.write(s); 28220f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xdb\x00\x01\x00\x00", 5) + s); 28320f9cd88SScott Linder } 28420f9cd88SScott Linder 28520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteStr32) { 28620f9cd88SScott Linder std::string s(131071, 'a'); 28720f9cd88SScott Linder MPWriter.write(s); 28820f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xdb\x00\x01\xff\xff", 5) + s); 28920f9cd88SScott Linder } 29020f9cd88SScott Linder 29120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin8Min) { 29220f9cd88SScott Linder std::string s; 29320f9cd88SScott Linder MPWriter.write(MemoryBufferRef(s, "")); 29420f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc4\x00", 2) + s); 29520f9cd88SScott Linder } 29620f9cd88SScott Linder 29720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin8) { 29820f9cd88SScott Linder std::string s(5, 'a'); 29920f9cd88SScott Linder MPWriter.write(MemoryBufferRef(s, "")); 30020f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc4\x05") + s); 30120f9cd88SScott Linder } 30220f9cd88SScott Linder 30320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin8Max) { 30420f9cd88SScott Linder std::string s(UINT8_MAX, 'a'); 30520f9cd88SScott Linder MPWriter.write(MemoryBufferRef(s, "")); 30620f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc4\xff") + s); 30720f9cd88SScott Linder } 30820f9cd88SScott Linder 30920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin16Min) { 31020f9cd88SScott Linder std::string s(static_cast<uint64_t>(UINT8_MAX) + 1, 'a'); 31120f9cd88SScott Linder MPWriter.write(MemoryBufferRef(s, "")); 31220f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc5\x01\x00", 3) + s); 31320f9cd88SScott Linder } 31420f9cd88SScott Linder 31520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin16) { 31620f9cd88SScott Linder std::string s(511, 'a'); 31720f9cd88SScott Linder MPWriter.write(MemoryBufferRef(s, "")); 31820f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xc5\x01\xff" + s); 31920f9cd88SScott Linder } 32020f9cd88SScott Linder 32120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin16Max) { 32220f9cd88SScott Linder std::string s(UINT16_MAX, 'a'); 32320f9cd88SScott Linder MPWriter.write(MemoryBufferRef(s, "")); 32420f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc5\xff\xff") + s); 32520f9cd88SScott Linder } 32620f9cd88SScott Linder 32720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin32Min) { 32820f9cd88SScott Linder std::string s(static_cast<uint64_t>(UINT16_MAX) + 1, 'a'); 32920f9cd88SScott Linder MPWriter.write(MemoryBufferRef(s, "")); 33020f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc6\x00\x01\x00\x00", 5) + s); 33120f9cd88SScott Linder } 33220f9cd88SScott Linder 33320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteBin32) { 33420f9cd88SScott Linder std::string s(131071, 'a'); 33520f9cd88SScott Linder MPWriter.write(MemoryBufferRef(s, "")); 33620f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc6\x00\x01\xff\xff", 5) + s); 33720f9cd88SScott Linder } 33820f9cd88SScott Linder 33920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixArrayMin) { 34020f9cd88SScott Linder MPWriter.writeArraySize(0); 34120f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\x90"); 34220f9cd88SScott Linder } 34320f9cd88SScott Linder 34420f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixArray) { 34520f9cd88SScott Linder MPWriter.writeArraySize(4); 34620f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\x94"); 34720f9cd88SScott Linder } 34820f9cd88SScott Linder 34920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixArrayMax) { 35020f9cd88SScott Linder // FixArray format's size is a 4 bit unsigned integer, so max is 1111 = 15 35120f9cd88SScott Linder MPWriter.writeArraySize(15); 35220f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\x9f"); 35320f9cd88SScott Linder } 35420f9cd88SScott Linder 35520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray16Min) { 35620f9cd88SScott Linder // See TestWriteFixArrayMax for why 16 is the min non-fix Array16 35720f9cd88SScott Linder MPWriter.writeArraySize(16); 35820f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xdc\x00\x10", 3)); 35920f9cd88SScott Linder } 36020f9cd88SScott Linder 36120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray16) { 36220f9cd88SScott Linder MPWriter.writeArraySize(273); 36320f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xdc\x01\x11"); 36420f9cd88SScott Linder } 36520f9cd88SScott Linder 36620f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray16Max) { 36720f9cd88SScott Linder MPWriter.writeArraySize(UINT16_MAX); 36820f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xdc\xff\xff"); 36920f9cd88SScott Linder } 37020f9cd88SScott Linder 37120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray32Min) { 37220f9cd88SScott Linder MPWriter.writeArraySize(static_cast<uint64_t>(UINT16_MAX) + 1); 37320f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xdd\x00\x01\x00\x00", 5)); 37420f9cd88SScott Linder } 37520f9cd88SScott Linder 37620f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray32) { 37720f9cd88SScott Linder MPWriter.writeArraySize(131071); 37820f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xdd\x00\x01\xff\xff", 5)); 37920f9cd88SScott Linder } 38020f9cd88SScott Linder 38120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteArray32Max) { 38220f9cd88SScott Linder MPWriter.writeArraySize(UINT32_MAX); 38320f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xdd\xff\xff\xff\xff"); 38420f9cd88SScott Linder } 38520f9cd88SScott Linder 38620f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixMapMin) { 38720f9cd88SScott Linder MPWriter.writeMapSize(0); 38820f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\x80"); 38920f9cd88SScott Linder } 39020f9cd88SScott Linder 39120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixMap) { 39220f9cd88SScott Linder MPWriter.writeMapSize(4); 39320f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\x84"); 39420f9cd88SScott Linder } 39520f9cd88SScott Linder 39620f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixMapMax) { 39720f9cd88SScott Linder // FixMap format's size is a 4 bit unsigned integer, so max is 1111 = 15 39820f9cd88SScott Linder MPWriter.writeMapSize(15); 39920f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\x8f"); 40020f9cd88SScott Linder } 40120f9cd88SScott Linder 40220f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap16Min) { 40320f9cd88SScott Linder // See TestWriteFixMapMax for why 16 is the min non-fix Map16 40420f9cd88SScott Linder MPWriter.writeMapSize(16); 40520f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xde\x00\x10", 3)); 40620f9cd88SScott Linder } 40720f9cd88SScott Linder 40820f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap16) { 40920f9cd88SScott Linder MPWriter.writeMapSize(273); 41020f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xde\x01\x11"); 41120f9cd88SScott Linder } 41220f9cd88SScott Linder 41320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap16Max) { 41420f9cd88SScott Linder MPWriter.writeMapSize(UINT16_MAX); 41520f9cd88SScott Linder EXPECT_EQ(OStream.str(), "\xde\xff\xff"); 41620f9cd88SScott Linder } 41720f9cd88SScott Linder 41820f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap32Min) { 41920f9cd88SScott Linder MPWriter.writeMapSize(static_cast<uint64_t>(UINT16_MAX) + 1); 42020f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xdf\x00\x01\x00\x00", 5)); 42120f9cd88SScott Linder } 42220f9cd88SScott Linder 42320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap32) { 42420f9cd88SScott Linder MPWriter.writeMapSize(131071); 42520f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xdf\x00\x01\xff\xff", 5)); 42620f9cd88SScott Linder } 42720f9cd88SScott Linder 42820f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteMap32Max) { 42920f9cd88SScott Linder MPWriter.writeMapSize(UINT32_MAX); 43020f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xdf\xff\xff\xff\xff", 5)); 43120f9cd88SScott Linder } 43220f9cd88SScott Linder 43320f9cd88SScott Linder // FixExt formats are only available for these specific lengths: 1, 2, 4, 8, 16 43420f9cd88SScott Linder 43520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt1) { 43620f9cd88SScott Linder std::string s(1, 'a'); 43720f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 43820f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd4\x01") + s); 43920f9cd88SScott Linder } 44020f9cd88SScott Linder 44120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt2) { 44220f9cd88SScott Linder std::string s(2, 'a'); 44320f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 44420f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd5\x01") + s); 44520f9cd88SScott Linder } 44620f9cd88SScott Linder 44720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt4) { 44820f9cd88SScott Linder std::string s(4, 'a'); 44920f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 45020f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd6\x01") + s); 45120f9cd88SScott Linder } 45220f9cd88SScott Linder 45320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt8) { 45420f9cd88SScott Linder std::string s(8, 'a'); 45520f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 45620f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd7\x01") + s); 45720f9cd88SScott Linder } 45820f9cd88SScott Linder 45920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteFixExt16) { 46020f9cd88SScott Linder std::string s(16, 'a'); 46120f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 46220f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xd8\x01") + s); 46320f9cd88SScott Linder } 46420f9cd88SScott Linder 46520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt8Min) { 46620f9cd88SScott Linder std::string s; 46720f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 46820f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc7\x00\x01", 3) + s); 46920f9cd88SScott Linder } 47020f9cd88SScott Linder 47120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt8) { 47220f9cd88SScott Linder std::string s(0x2a, 'a'); 47320f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 47420f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc7\x2a\x01") + s); 47520f9cd88SScott Linder } 47620f9cd88SScott Linder 47720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt8Max) { 47820f9cd88SScott Linder std::string s(UINT8_MAX, 'a'); 47920f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 48020f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc7\xff\x01") + s); 48120f9cd88SScott Linder } 48220f9cd88SScott Linder 48320f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt16Min) { 48420f9cd88SScott Linder std::string s(static_cast<uint16_t>(UINT8_MAX) + 1, 'a'); 48520f9cd88SScott Linder MPWriter.writeExt(0x02, MemoryBufferRef(s, "")); 48620f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc8\x01\x00\x02", 4) + s); 48720f9cd88SScott Linder } 48820f9cd88SScott Linder 48920f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt16) { 49020f9cd88SScott Linder std::string s(273, 'a'); 49120f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 49220f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc8\x01\x11\x01") + s); 49320f9cd88SScott Linder } 49420f9cd88SScott Linder 49520f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt16Max) { 49620f9cd88SScott Linder std::string s(UINT16_MAX, 'a'); 49720f9cd88SScott Linder MPWriter.writeExt(0x01, MemoryBufferRef(s, "")); 49820f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc8\xff\xff\x01") + s); 49920f9cd88SScott Linder } 50020f9cd88SScott Linder 50120f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteExt32Min) { 50220f9cd88SScott Linder std::string s(static_cast<uint32_t>(UINT16_MAX) + 1, 'a'); 50320f9cd88SScott Linder MPWriter.writeExt(0x02, MemoryBufferRef(s, "")); 50420f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xc9\x00\x01\x00\x00\x02", 6) + s); 50520f9cd88SScott Linder } 50620f9cd88SScott Linder 50720f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteCompatibleNoStr8) { 50820f9cd88SScott Linder Writer CompatWriter(OStream, true); 50920f9cd88SScott Linder std::string s(32, 'a'); 51020f9cd88SScott Linder CompatWriter.write(s); 51120f9cd88SScott Linder EXPECT_EQ(OStream.str(), std::string("\xda\x00\x20", 3) + s); 51220f9cd88SScott Linder } 51320f9cd88SScott Linder 51420f9cd88SScott Linder TEST_F(MsgPackWriter, TestWriteCompatibleNoBin) { 51520f9cd88SScott Linder Writer CompatWriter(OStream, true); 51620f9cd88SScott Linder std::string s; 51720f9cd88SScott Linder 51820f9cd88SScott Linder #ifdef GTEST_HAS_DEATH_TEST 51920f9cd88SScott Linder #ifndef NDEBUG 52020f9cd88SScott Linder EXPECT_DEATH(CompatWriter.write(MemoryBufferRef(s, "")), "compatible mode"); 52120f9cd88SScott Linder #endif 52220f9cd88SScott Linder #endif 52320f9cd88SScott Linder } 524