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