This fix is ogirinally from https://github.com/msgpack/msgpack-c/pull/133

I removed raw support and added str, bin, and ext support.
This commit is contained in:
Takatoshi Kondo
2014-11-17 12:51:34 +09:00
parent 0de0b434b3
commit 037b1c22dc
3 changed files with 214 additions and 4 deletions

View File

@@ -11,12 +11,14 @@ struct myclass {
int num;
std::string str;
std::vector<double> vec;
std::map<std::string, std::vector<char> > map;
MSGPACK_DEFINE(num, str);
MSGPACK_DEFINE(num, str, vec, map);
bool operator==(const myclass& o) const
{
return num == o.num && str == o.str;
return num == o.num && str == o.str && vec == o.vec && map == o.map;
}
};
@@ -28,7 +30,7 @@ std::ostream& operator<<(std::ostream& o, const myclass& m)
TEST(object, convert)
{
myclass m1;
myclass m1(1, "custom");
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, m1);
@@ -45,7 +47,7 @@ TEST(object, convert)
TEST(object, as)
{
myclass m1;
myclass m1(1, "custom");
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, m1);
@@ -56,6 +58,127 @@ TEST(object, as)
EXPECT_EQ(m1, ret.get().as<myclass>());
}
TEST(object, cross_zone_copy)
{
myclass m1(1, "custom");
m1.vec.push_back(1.0);
m1.vec.push_back(0.1);
std::vector<char> vc;
vc.push_back('t');
vc.push_back('w');
vc.push_back('o');
m1.map["one"] = vc;
msgpack::zone z1;
msgpack::object::with_zone obj1(z1);
{
msgpack::zone z2;
msgpack::object::with_zone obj2(z2);
obj2 << m1;
obj1 << obj2;
EXPECT_EQ(obj1.via.array.ptr[2].via.array.ptr[0].via.dec, 1.0);
EXPECT_EQ(obj1.via.array.ptr[3].via.map.ptr[0].key.via.str.ptr[0], 'o');
EXPECT_EQ(obj1.via.array.ptr[3].via.map.ptr[0].val.via.bin.ptr[0], 't');
EXPECT_NE(
obj1.via.array.ptr[2].via.array.ptr,
obj2.via.array.ptr[2].via.array.ptr);
EXPECT_NE(
obj1.via.array.ptr[3].via.map.ptr,
obj2.via.array.ptr[3].via.map.ptr);
EXPECT_NE(
obj1.via.array.ptr[3].via.map.ptr[0].key.via.str.ptr,
obj2.via.array.ptr[3].via.map.ptr[0].key.via.str.ptr);
EXPECT_NE(
obj1.via.array.ptr[3].via.map.ptr[0].val.via.bin.ptr,
obj2.via.array.ptr[3].via.map.ptr[0].val.via.bin.ptr);
}
EXPECT_EQ(m1, obj1.as<myclass>());
}
TEST(object, cross_zone_copy_construct)
{
myclass m1(1, "custom");
m1.vec.push_back(1.0);
m1.vec.push_back(0.1);
std::vector<char> vc;
vc.push_back('t');
vc.push_back('w');
vc.push_back('o');
m1.map["one"] = vc;
msgpack::zone z1;
msgpack::zone z2;
msgpack::object::with_zone obj2(z2);
obj2 << m1;
msgpack::object obj1(obj2, z1);
EXPECT_EQ(obj1.via.array.ptr[2].via.array.ptr[0].via.dec, 1.0);
EXPECT_EQ(obj1.via.array.ptr[3].via.map.ptr[0].key.via.str.ptr[0], 'o');
EXPECT_EQ(obj1.via.array.ptr[3].via.map.ptr[0].val.via.bin.ptr[0], 't');
EXPECT_NE(
obj1.via.array.ptr[2].via.array.ptr,
obj2.via.array.ptr[2].via.array.ptr);
EXPECT_NE(
obj1.via.array.ptr[3].via.map.ptr,
obj2.via.array.ptr[3].via.map.ptr);
EXPECT_NE(
obj1.via.array.ptr[3].via.map.ptr[0].key.via.str.ptr,
obj2.via.array.ptr[3].via.map.ptr[0].key.via.str.ptr);
EXPECT_NE(
obj1.via.array.ptr[3].via.map.ptr[0].val.via.bin.ptr,
obj2.via.array.ptr[3].via.map.ptr[0].val.via.bin.ptr);
EXPECT_EQ(m1, obj1.as<myclass>());
}
TEST(object, cross_zone_copy_ext)
{
msgpack::zone z1;
msgpack::zone z2;
msgpack::object::with_zone obj1(z1);
obj1.type = msgpack::type::EXT;
char* ptr = static_cast<char*>(obj1.zone.allocate_align(2));
ptr[0] = 1;
ptr[1] = 2;
obj1.via.ext.ptr = ptr;
obj1.via.ext.size = 1;
msgpack::object::with_zone obj2(z2);
obj2 << obj1;
EXPECT_EQ(obj2.via.ext.size, 1);
EXPECT_EQ(obj2.via.ext.ptr[0], 1);
EXPECT_EQ(obj2.via.ext.ptr[1], 2);
EXPECT_NE(
obj1.via.ext.ptr,
obj2.via.ext.ptr);
}
TEST(object, cross_zone_copy_construct_ext)
{
msgpack::zone z1;
msgpack::zone z2;
msgpack::object::with_zone obj1(z1);
obj1.type = msgpack::type::EXT;
char* ptr = static_cast<char*>(obj1.zone.allocate_align(2));
ptr[0] = 1;
ptr[1] = 2;
obj1.via.ext.ptr = ptr;
obj1.via.ext.size = 1;
msgpack::object obj2(obj1, z2);
EXPECT_EQ(obj2.via.ext.size, 1);
EXPECT_EQ(obj2.via.ext.ptr[0], 1);
EXPECT_EQ(obj2.via.ext.ptr[1], 2);
EXPECT_NE(
obj1.via.ext.ptr,
obj2.via.ext.ptr);
}
TEST(object, print)
{