#include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #if !defined(MSGPACK_USE_CPP03) class TestEnumClassMemberClass { public: TestEnumClassMemberClass() : t1(TestEnumClassType::STATE_A), t2(TestEnumClassType::STATE_B), t3(TestEnumClassType::STATE_C) {} enum class TestEnumClassType:long { STATE_INVALID = 0, STATE_A = 1, STATE_B = 2, STATE_C = 3 }; TestEnumClassType t1; TestEnumClassType t2; TestEnumClassType t3; MSGPACK_DEFINE(t1, t2, t3); }; MSGPACK_ADD_ENUM(TestEnumClassMemberClass::TestEnumClassType); using namespace std; const unsigned int kLoop = 10000; const unsigned int kElements = 100; // C++11 TEST(MSGPACK_CPP11, simple_tuple) { msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 12.3); msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); std::tuple val2 = ret.get().as >(); EXPECT_EQ(val1, val2); } TEST(MSGPACK_CPP11, simple_tuple_empty) { msgpack::sbuffer sbuf; std::tuple<> val1; msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); std::tuple<> val2 = ret.get().as >(); EXPECT_EQ(val1, val2); } TEST(MSGPACK_CPP11, simple_array) { for (unsigned int k = 0; k < kLoop; k++) { array val1; for (unsigned int i = 0; i < kElements; i++) val1[i] = rand(); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); EXPECT_EQ(ret.get().type, msgpack::type::ARRAY); array val2 = ret.get().as >(); EXPECT_EQ(val1.size(), val2.size()); EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); } } TEST(MSGPACK_CPP11, simple_buffer_array_char) { for (unsigned int k = 0; k < kLoop; k++) { array val1; for (unsigned int i = 0; i < kElements; i++) val1[i] = rand(); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); EXPECT_EQ(ret.get().type, msgpack::type::BIN); array val2 = ret.get().as >(); EXPECT_EQ(val1.size(), val2.size()); EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); } } TEST(MSGPACK_STL, simple_buffer_forward_list) { for (unsigned int k = 0; k < kLoop; k++) { forward_list val1; for (unsigned int i = 0; i < kElements; i++) val1.push_front(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); forward_list val2 = ret.get().as >(); EXPECT_EQ(val1, val2); } } TEST(MSGPACK_STL, simple_buffer_unordered_map) { for (unsigned int k = 0; k < kLoop; k++) { unordered_map val1; for (unsigned int i = 0; i < kElements; i++) val1[rand()] = rand(); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); unordered_map val2 = ret.get().as >(); EXPECT_EQ(val1, val2); } } TEST(MSGPACK_STL, simple_buffer_unordered_multimap) { for (unsigned int k = 0; k < kLoop; k++) { unordered_multimap val1; for (unsigned int i = 0; i < kElements; i++) { int i1 = rand(); val1.insert(make_pair(i1, rand())); val1.insert(make_pair(i1, rand())); } msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); unordered_multimap val2 = ret.get().as >(); EXPECT_EQ(val1, val2); } } TEST(MSGPACK_STL, simple_buffer_unordered_set) { for (unsigned int k = 0; k < kLoop; k++) { unordered_set val1; for (unsigned int i = 0; i < kElements; i++) val1.insert(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); unordered_set val2 = ret.get().as >(); EXPECT_EQ(val1, val2); } } TEST(MSGPACK_STL, simple_buffer_unordered_multiset) { for (unsigned int k = 0; k < kLoop; k++) { unordered_multiset val1; for (unsigned int i = 0; i < kElements; i++) val1.insert(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); unordered_multiset val2 = ret.get().as >(); EXPECT_EQ(val1, val2); } } TEST(MSGPACK_USER_DEFINED, simple_buffer_enum_class_member) { TestEnumClassMemberClass val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); TestEnumClassMemberClass val2 = ret.get().as(); EXPECT_EQ(val1.t1, val2.t1); EXPECT_EQ(val1.t2, val2.t2); EXPECT_EQ(val1.t3, val2.t3); } struct top { int t; MSGPACK_DEFINE(t); }; struct mid1 : top { int m1; MSGPACK_DEFINE(MSGPACK_BASE(top), m1); }; struct mid2 : top { int m2; MSGPACK_DEFINE(m2, MSGPACK_BASE(top)); }; struct bottom : mid1, mid2 { int b; MSGPACK_DEFINE(MSGPACK_BASE(mid1), MSGPACK_BASE(mid2), b); }; TEST(MSGPACK_INHERIT, simple_buffer_non_virtual) { bottom b; b.b = 1; b.m1 = 2; b.m2 = 3; b.mid1::t = 4; b.mid2::t = 5; msgpack::sbuffer sbuf; msgpack::pack(sbuf, b); msgpack::unpacked ret = msgpack::unpack(sbuf.data(), sbuf.size()); bottom br = ret.get().as(); EXPECT_EQ(b.b, br.b); EXPECT_EQ(b.m1, br.m1); EXPECT_EQ(b.m2, br.m2); EXPECT_EQ(b.mid1::t, br.mid1::t); EXPECT_EQ(b.mid2::t, br.mid2::t); } struct v_top { int t; MSGPACK_DEFINE(t); }; struct v_mid1 : virtual v_top { int m1; MSGPACK_DEFINE(m1); }; struct v_mid2 : virtual v_top { int m2; MSGPACK_DEFINE(m2); }; struct v_bottom : v_mid1, v_mid2 { int b; MSGPACK_DEFINE(MSGPACK_BASE(v_mid1), MSGPACK_BASE(v_mid2), MSGPACK_BASE(v_top), b); }; TEST(MSGPACK_INHERIT, simple_buffer_virtual) { v_bottom b; b.b = 1; b.m1 = 2; b.m2 = 3; b.t = 4; msgpack::sbuffer sbuf; msgpack::pack(sbuf, b); msgpack::unpacked ret = msgpack::unpack(sbuf.data(), sbuf.size()); v_bottom br = ret.get().as(); EXPECT_EQ(b.b, br.b); EXPECT_EQ(b.m1, br.m1); EXPECT_EQ(b.m2, br.m2); EXPECT_EQ(b.t, br.t); } #endif // !defined(MSGPACK_USE_CPP03)