summaryrefslogtreecommitdiff
path: root/cpp/test
diff options
context:
space:
mode:
authorINADA Naoki <songofacandy@gmail.com>2010-09-02 01:30:32 +0900
committerINADA Naoki <songofacandy@gmail.com>2010-09-02 01:30:32 +0900
commit623df2357025a860578db54683aa10ddea7d261d (patch)
tree697b5401dc7ca2108600464ae905aa688ae96fce /cpp/test
parent4a15d8b6d2b69bdc1de0b0a7f643b02e00100e66 (diff)
parent558e9c21edf3cee5813aaa0e7797509eec5d43fb (diff)
downloadmsgpack-python-623df2357025a860578db54683aa10ddea7d261d.tar.gz
Merge branch 'master' of github.com:msgpack/msgpack
Diffstat (limited to 'cpp/test')
-rw-r--r--cpp/test/Makefile.am34
-rw-r--r--cpp/test/buffer.cc25
-rw-r--r--cpp/test/cases.cc38
-rw-r--r--cpp/test/fixint.cc55
-rw-r--r--cpp/test/fixint_c.cc32
-rw-r--r--cpp/test/msgpack_test.cpp982
-rw-r--r--cpp/test/msgpackc_test.cpp424
-rw-r--r--cpp/test/pack_unpack.cc10
-rw-r--r--cpp/test/pack_unpack_c.cc70
-rw-r--r--cpp/test/streaming.cc19
-rw-r--r--cpp/test/streaming_c.cc57
-rw-r--r--cpp/test/version.cc13
12 files changed, 1742 insertions, 17 deletions
diff --git a/cpp/test/Makefile.am b/cpp/test/Makefile.am
index 2b96669..5225f28 100644
--- a/cpp/test/Makefile.am
+++ b/cpp/test/Makefile.am
@@ -1,15 +1,23 @@
-AM_CPPFLAGS = -I..
-AM_C_CPPFLAGS = -I..
-AM_LDFLAGS = ../libmsgpack.la -lgtest_main
+AM_CPPFLAGS = -I../src
+AM_C_CPPFLAGS = -I../src
+AM_LDFLAGS = ../src/libmsgpack.la -lgtest_main
check_PROGRAMS = \
zone \
pack_unpack \
+ pack_unpack_c \
streaming \
+ streaming_c \
object \
convert \
- buffer
+ buffer \
+ cases \
+ fixint \
+ fixint_c \
+ version \
+ msgpackc_test \
+ msgpack_test
TESTS = $(check_PROGRAMS)
@@ -17,8 +25,12 @@ zone_SOURCES = zone.cc
pack_unpack_SOURCES = pack_unpack.cc
+pack_unpack_c_SOURCES = pack_unpack_c.cc
+
streaming_SOURCES = streaming.cc
+streaming_c_SOURCES = streaming_c.cc
+
object_SOURCES = object.cc
convert_SOURCES = convert.cc
@@ -26,3 +38,17 @@ convert_SOURCES = convert.cc
buffer_SOURCES = buffer.cc
buffer_LDADD = -lz
+cases_SOURCES = cases.cc
+
+fixint_SOURCES = fixint.cc
+
+fixint_c_SOURCES = fixint_c.cc
+
+version_SOURCES = version.cc
+
+msgpackc_test_SOURCES = msgpackc_test.cpp
+
+msgpack_test_SOURCES = msgpack_test.cpp
+
+EXTRA_DIST = cases.mpac cases_compact.mpac
+
diff --git a/cpp/test/buffer.cc b/cpp/test/buffer.cc
index a2e9037..aff0699 100644
--- a/cpp/test/buffer.cc
+++ b/cpp/test/buffer.cc
@@ -12,6 +12,14 @@ TEST(buffer, sbuffer)
EXPECT_EQ(3, sbuf.size());
EXPECT_TRUE( memcmp(sbuf.data(), "aaa", 3) == 0 );
+
+ sbuf.clear();
+ sbuf.write("a", 1);
+ sbuf.write("a", 1);
+ sbuf.write("a", 1);
+
+ EXPECT_EQ(3, sbuf.size());
+ EXPECT_TRUE( memcmp(sbuf.data(), "aaa", 3) == 0 );
}
@@ -32,6 +40,23 @@ TEST(buffer, vrefbuffer)
EXPECT_EQ(3, sbuf.size());
EXPECT_TRUE( memcmp(sbuf.data(), "aaa", 3) == 0 );
+
+
+ vbuf.clear();
+ vbuf.write("a", 1);
+ vbuf.write("a", 1);
+ vbuf.write("a", 1);
+
+ vec = vbuf.vector();
+ veclen = vbuf.vector_size();
+
+ sbuf.clear();
+ for(size_t i=0; i < veclen; ++i) {
+ sbuf.write((const char*)vec[i].iov_base, vec[i].iov_len);
+ }
+
+ EXPECT_EQ(3, sbuf.size());
+ EXPECT_TRUE( memcmp(sbuf.data(), "aaa", 3) == 0 );
}
diff --git a/cpp/test/cases.cc b/cpp/test/cases.cc
new file mode 100644
index 0000000..eb1286c
--- /dev/null
+++ b/cpp/test/cases.cc
@@ -0,0 +1,38 @@
+#include <msgpack.hpp>
+#include <fstream>
+#include <gtest/gtest.h>
+
+static void feed_file(msgpack::unpacker& pac, const char* path)
+{
+ std::ifstream fin(path);
+ while(true) {
+ pac.reserve_buffer(32*1024);
+ fin.read(pac.buffer(), pac.buffer_capacity());
+ if(fin.bad()) {
+ throw std::runtime_error("read failed");
+ }
+ pac.buffer_consumed(fin.gcount());
+ if(fin.fail()) {
+ break;
+ }
+ }
+}
+
+TEST(cases, format)
+{
+ msgpack::unpacker pac;
+ msgpack::unpacker pac_compact;
+
+ feed_file(pac, "cases.mpac");
+ feed_file(pac_compact, "cases_compact.mpac");
+
+ msgpack::unpacked result;
+ while(pac.next(&result)) {
+ msgpack::unpacked result_compact;
+ EXPECT_TRUE( pac_compact.next(&result_compact) );
+ EXPECT_EQ(result_compact.get(), result.get());
+ }
+
+ EXPECT_FALSE( pac_compact.next(&result) );
+}
+
diff --git a/cpp/test/fixint.cc b/cpp/test/fixint.cc
new file mode 100644
index 0000000..63288a1
--- /dev/null
+++ b/cpp/test/fixint.cc
@@ -0,0 +1,55 @@
+#include <msgpack.hpp>
+#include <gtest/gtest.h>
+
+template <typename T>
+void check_size(size_t size) {
+ T v(0);
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, v);
+ EXPECT_EQ(size, sbuf.size());
+}
+
+TEST(fixint, size)
+{
+ check_size<msgpack::type::fix_int8>(2);
+ check_size<msgpack::type::fix_int16>(3);
+ check_size<msgpack::type::fix_int32>(5);
+ check_size<msgpack::type::fix_int64>(9);
+
+ check_size<msgpack::type::fix_uint8>(2);
+ check_size<msgpack::type::fix_uint16>(3);
+ check_size<msgpack::type::fix_uint32>(5);
+ check_size<msgpack::type::fix_uint64>(9);
+}
+
+
+template <typename T>
+void check_convert() {
+ T v1(-11);
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, v1);
+
+ msgpack::unpacked msg;
+ msgpack::unpack(&msg, sbuf.data(), sbuf.size());
+
+ T v2;
+ msg.get().convert(&v2);
+
+ EXPECT_EQ(v1.get(), v2.get());
+
+ EXPECT_EQ(msg.get(), msgpack::object(T(v1.get())));
+}
+
+TEST(fixint, convert)
+{
+ check_convert<msgpack::type::fix_int8>();
+ check_convert<msgpack::type::fix_int16>();
+ check_convert<msgpack::type::fix_int32>();
+ check_convert<msgpack::type::fix_int64>();
+
+ check_convert<msgpack::type::fix_uint8>();
+ check_convert<msgpack::type::fix_uint16>();
+ check_convert<msgpack::type::fix_uint32>();
+ check_convert<msgpack::type::fix_uint64>();
+}
+
diff --git a/cpp/test/fixint_c.cc b/cpp/test/fixint_c.cc
new file mode 100644
index 0000000..caa4d26
--- /dev/null
+++ b/cpp/test/fixint_c.cc
@@ -0,0 +1,32 @@
+#include <msgpack.hpp>
+#include <gtest/gtest.h>
+
+TEST(fixint, size)
+{
+ msgpack_sbuffer* sbuf = msgpack_sbuffer_new();
+ msgpack_packer* pk = msgpack_packer_new(sbuf, msgpack_sbuffer_write);
+
+ size_t sum = 0;
+
+ EXPECT_EQ(0, msgpack_pack_fix_int8(pk, 0));
+ EXPECT_EQ(sum+=2, sbuf->size);
+ EXPECT_EQ(0, msgpack_pack_fix_int16(pk, 0));
+ EXPECT_EQ(sum+=3, sbuf->size);
+ EXPECT_EQ(0, msgpack_pack_fix_int32(pk, 0));
+ EXPECT_EQ(sum+=5, sbuf->size);
+ EXPECT_EQ(0, msgpack_pack_fix_int64(pk, 0));
+ EXPECT_EQ(sum+=9, sbuf->size);
+
+ EXPECT_EQ(0, msgpack_pack_fix_uint8(pk, 0));
+ EXPECT_EQ(sum+=2, sbuf->size);
+ EXPECT_EQ(0, msgpack_pack_fix_uint16(pk, 0));
+ EXPECT_EQ(sum+=3, sbuf->size);
+ EXPECT_EQ(0, msgpack_pack_fix_uint32(pk, 0));
+ EXPECT_EQ(sum+=5, sbuf->size);
+ EXPECT_EQ(0, msgpack_pack_fix_uint64(pk, 0));
+ EXPECT_EQ(sum+=9, sbuf->size);
+
+ msgpack_sbuffer_free(sbuf);
+ msgpack_packer_free(pk);
+}
+
diff --git a/cpp/test/msgpack_test.cpp b/cpp/test/msgpack_test.cpp
new file mode 100644
index 0000000..0dd0ffc
--- /dev/null
+++ b/cpp/test/msgpack_test.cpp
@@ -0,0 +1,982 @@
+#include "msgpack.hpp"
+
+#include <math.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <deque>
+#include <set>
+#include <list>
+
+#include <gtest/gtest.h>
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+using namespace std;
+
+const unsigned int kLoop = 10000;
+const unsigned int kElements = 100;
+const double kEPS = 1e-10;
+
+#define GEN_TEST(test_type) \
+ do { \
+ vector<test_type> v; \
+ v.push_back(0); \
+ v.push_back(1); \
+ v.push_back(2); \
+ v.push_back(numeric_limits<test_type>::min()); \
+ v.push_back(numeric_limits<test_type>::max()); \
+ for (unsigned int i = 0; i < kLoop; i++) \
+ v.push_back(rand()); \
+ for (unsigned int i = 0; i < v.size() ; i++) { \
+ msgpack::sbuffer sbuf; \
+ test_type val1 = v[i]; \
+ msgpack::pack(sbuf, val1); \
+ msgpack::zone z; \
+ msgpack::object obj; \
+ msgpack::unpack_return ret = \
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); \
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); \
+ test_type val2; \
+ obj.convert(&val2); \
+ EXPECT_EQ(val1, val2); \
+ } \
+} while(0)
+
+TEST(MSGPACK, simple_buffer_short)
+{
+ GEN_TEST(short);
+}
+
+TEST(MSGPACK, simple_buffer_int)
+{
+ GEN_TEST(int);
+}
+
+TEST(MSGPACK, simple_buffer_long)
+{
+ GEN_TEST(long);
+}
+
+TEST(MSGPACK, simple_buffer_long_long)
+{
+ GEN_TEST(long long);
+}
+
+TEST(MSGPACK, simple_buffer_unsigned_short)
+{
+ GEN_TEST(unsigned short);
+}
+
+TEST(MSGPACK, simple_buffer_unsigned_int)
+{
+ GEN_TEST(unsigned int);
+}
+
+TEST(MSGPACK, simple_buffer_unsigned_long)
+{
+ GEN_TEST(unsigned long);
+}
+
+TEST(MSGPACK, simple_buffer_unsigned_long_long)
+{
+ GEN_TEST(unsigned long long);
+}
+
+TEST(MSGPACK, simple_buffer_uint8)
+{
+ GEN_TEST(uint8_t);
+}
+
+TEST(MSGPACK, simple_buffer_uint16)
+{
+ GEN_TEST(uint16_t);
+}
+
+TEST(MSGPACK, simple_buffer_uint32)
+{
+ GEN_TEST(uint32_t);
+}
+
+TEST(MSGPACK, simple_buffer_uint64)
+{
+ GEN_TEST(uint64_t);
+}
+
+TEST(MSGPACK, simple_buffer_int8)
+{
+ GEN_TEST(int8_t);
+}
+
+TEST(MSGPACK, simple_buffer_int16)
+{
+ GEN_TEST(int16_t);
+}
+
+TEST(MSGPACK, simple_buffer_int32)
+{
+ GEN_TEST(int32_t);
+}
+
+TEST(MSGPACK, simple_buffer_int64)
+{
+ GEN_TEST(int64_t);
+}
+
+TEST(MSGPACK, simple_buffer_float)
+{
+ vector<float> v;
+ v.push_back(0.0);
+ v.push_back(-0.0);
+ v.push_back(1.0);
+ v.push_back(-1.0);
+ v.push_back(numeric_limits<float>::min());
+ v.push_back(numeric_limits<float>::max());
+ v.push_back(nanf("tag"));
+ v.push_back(1.0/0.0); // inf
+ v.push_back(-(1.0/0.0)); // -inf
+ for (unsigned int i = 0; i < kLoop; i++) {
+ v.push_back(drand48());
+ v.push_back(-drand48());
+ }
+ for (unsigned int i = 0; i < v.size() ; i++) {
+ msgpack::sbuffer sbuf;
+ float val1 = v[i];
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ float val2;
+ obj.convert(&val2);
+
+ if (isnan(val1))
+ EXPECT_TRUE(isnan(val2));
+ else if (isinf(val1))
+ EXPECT_TRUE(isinf(val2));
+ else
+ EXPECT_TRUE(fabs(val2 - val1) <= kEPS);
+ }
+}
+
+TEST(MSGPACK, simple_buffer_double)
+{
+ vector<double> v;
+ v.push_back(0.0);
+ v.push_back(-0.0);
+ v.push_back(1.0);
+ v.push_back(-1.0);
+ v.push_back(numeric_limits<double>::min());
+ v.push_back(numeric_limits<double>::max());
+ v.push_back(nanf("tag"));
+ v.push_back(1.0/0.0); // inf
+ v.push_back(-(1.0/0.0)); // -inf
+ for (unsigned int i = 0; i < kLoop; i++) {
+ v.push_back(drand48());
+ v.push_back(-drand48());
+ }
+ for (unsigned int i = 0; i < v.size() ; i++) {
+ msgpack::sbuffer sbuf;
+ double val1 = v[i];
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ double val2;
+ obj.convert(&val2);
+
+ if (isnan(val1))
+ EXPECT_TRUE(isnan(val2));
+ else if (isinf(val1))
+ EXPECT_TRUE(isinf(val2));
+ else
+ EXPECT_TRUE(fabs(val2 - val1) <= kEPS);
+ }
+}
+
+TEST(MSGPACK, simple_buffer_true)
+{
+ msgpack::sbuffer sbuf;
+ bool val1 = true;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ bool val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1, val2);
+}
+
+TEST(MSGPACK, simple_buffer_false)
+{
+ msgpack::sbuffer sbuf;
+ bool val1 = false;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ bool val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1, val2);
+}
+
+//-----------------------------------------------------------------------------
+
+// STL
+
+TEST(MSGPACK_STL, simple_buffer_string)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ string val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1 += 'a' + rand() % 26;
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ string val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_EQ(val1, val2);
+ }
+}
+
+TEST(MSGPACK_STL, simple_buffer_vector)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ vector<int> val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1.push_back(rand());
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ vector<int> val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
+ }
+}
+
+TEST(MSGPACK_STL, simple_buffer_map)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ map<int, int> val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1[rand()] = rand();
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ map<int, int> val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
+ }
+}
+
+TEST(MSGPACK_STL, simple_buffer_deque)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ deque<int> val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1.push_back(rand());
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ deque<int> val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
+ }
+}
+
+TEST(MSGPACK_STL, simple_buffer_list)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ list<int> val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1.push_back(rand());
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ list<int> val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
+ }
+}
+
+TEST(MSGPACK_STL, simple_buffer_set)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ set<int> val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1.insert(rand());
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ set<int> val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
+ }
+}
+
+TEST(MSGPACK_STL, simple_buffer_pair)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ pair<int, int> val1 = make_pair(rand(), rand());
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ pair<int, int> val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.first, val2.first);
+ EXPECT_EQ(val1.second, val2.second);
+ }
+}
+
+TEST(MSGPACK_STL, simple_buffer_multimap)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ multimap<int, int> 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::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ multimap<int, int> val2;
+ obj.convert(&val2);
+
+ vector<pair<int, int> > v1, v2;
+ multimap<int, int>::const_iterator it;
+ for (it = val1.begin(); it != val1.end(); ++it)
+ v1.push_back(make_pair(it->first, it->second));
+ for (it = val2.begin(); it != val2.end(); ++it)
+ v2.push_back(make_pair(it->first, it->second));
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_EQ(v1.size(), v2.size());
+ sort(v1.begin(), v1.end());
+ sort(v2.begin(), v2.end());
+ EXPECT_TRUE(v1 == v2);
+ }
+}
+
+TEST(MSGPACK_STL, simple_buffer_multiset)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ multiset<int> val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1.insert(rand());
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ multiset<int> val2;
+ obj.convert(&val2);
+
+ vector<int> v1, v2;
+ multiset<int>::const_iterator it;
+ for (it = val1.begin(); it != val1.end(); ++it)
+ v1.push_back(*it);
+ for (it = val2.begin(); it != val2.end(); ++it)
+ v2.push_back(*it);
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_EQ(v1.size(), v2.size());
+ sort(v1.begin(), v1.end());
+ sort(v2.begin(), v2.end());
+ EXPECT_TRUE(v1 == v2);
+ }
+}
+
+// TR1
+
+#ifdef HAVE_TR1_UNORDERED_MAP
+#include <tr1/unordered_map>
+#include "msgpack/type/tr1/unordered_map.hpp"
+TEST(MSGPACK_TR1, simple_buffer_unordered_map)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ tr1::unordered_map<int, int> val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1[rand()] = rand();
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ tr1::unordered_map<int, int> val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.size(), val2.size());
+ tr1::unordered_map<int, int>::const_iterator it;
+ for (it = val1.begin(); it != val1.end(); ++it) {
+ EXPECT_TRUE(val2.find(it->first) != val2.end());
+ EXPECT_EQ(it->second, val2.find(it->first)->second);
+ }
+ }
+}
+
+TEST(MSGPACK_TR1, simple_buffer_unordered_multimap)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ tr1::unordered_multimap<int, int> 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::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ tr1::unordered_multimap<int, int> val2;
+ obj.convert(&val2);
+
+ vector<pair<int, int> > v1, v2;
+ tr1::unordered_multimap<int, int>::const_iterator it;
+ for (it = val1.begin(); it != val1.end(); ++it)
+ v1.push_back(make_pair(it->first, it->second));
+ for (it = val2.begin(); it != val2.end(); ++it)
+ v2.push_back(make_pair(it->first, it->second));
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_EQ(v1.size(), v2.size());
+ sort(v1.begin(), v1.end());
+ sort(v2.begin(), v2.end());
+ EXPECT_TRUE(v1 == v2);
+ }
+}
+#endif
+
+#ifdef HAVE_TR1_UNORDERED_SET
+#include <tr1/unordered_set>
+#include "msgpack/type/tr1/unordered_set.hpp"
+TEST(MSGPACK_TR1, simple_buffer_unordered_set)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ tr1::unordered_set<int> val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1.insert(rand());
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ tr1::unordered_set<int> val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.size(), val2.size());
+ tr1::unordered_set<int>::const_iterator it;
+ for (it = val1.begin(); it != val1.end(); ++it)
+ EXPECT_TRUE(val2.find(*it) != val2.end());
+ }
+}
+
+TEST(MSGPACK_TR1, simple_buffer_unordered_multiset)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ tr1::unordered_multiset<int> val1;
+ for (unsigned int i = 0; i < kElements; i++)
+ val1.insert(rand());
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ tr1::unordered_multiset<int> val2;
+ obj.convert(&val2);
+
+ vector<int> v1, v2;
+ tr1::unordered_multiset<int>::const_iterator it;
+ for (it = val1.begin(); it != val1.end(); ++it)
+ v1.push_back(*it);
+ for (it = val2.begin(); it != val2.end(); ++it)
+ v2.push_back(*it);
+ EXPECT_EQ(val1.size(), val2.size());
+ EXPECT_EQ(v1.size(), v2.size());
+ sort(v1.begin(), v1.end());
+ sort(v2.begin(), v2.end());
+ EXPECT_TRUE(v1 == v2);
+ }
+}
+#endif
+
+// User-Defined Structures
+
+class TestClass
+{
+public:
+ TestClass() : i(0), s("kzk") {}
+ int i;
+ string s;
+ MSGPACK_DEFINE(i, s);
+};
+
+TEST(MSGPACK_USER_DEFINED, simple_buffer_class)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ TestClass val1;
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ TestClass val2;
+ val2.i = -1;
+ val2.s = "";
+ obj.convert(&val2);
+ EXPECT_EQ(val1.i, val2.i);
+ EXPECT_EQ(val1.s, val2.s);
+ }
+}
+
+class TestClass2
+{
+public:
+ TestClass2() : i(0), s("kzk") {
+ for (unsigned int i = 0; i < kElements; i++)
+ v.push_back(rand());
+ }
+ int i;
+ string s;
+ vector<int> v;
+ MSGPACK_DEFINE(i, s, v);
+};
+
+TEST(MSGPACK_USER_DEFINED, simple_buffer_class_old_to_new)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ TestClass val1;
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ TestClass2 val2;
+ val2.i = -1;
+ val2.s = "";
+ val2.v = vector<int>();
+ obj.convert(&val2);
+ EXPECT_EQ(val1.i, val2.i);
+ EXPECT_EQ(val1.s, val2.s);
+ EXPECT_FALSE(val2.s.empty());
+ }
+}
+
+TEST(MSGPACK_USER_DEFINED, simple_buffer_class_new_to_old)
+{
+ for (unsigned int k = 0; k < kLoop; k++) {
+ TestClass2 val1;
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ TestClass val2;
+ val2.i = -1;
+ val2.s = "";
+ obj.convert(&val2);
+ EXPECT_EQ(val1.i, val2.i);
+ EXPECT_EQ(val1.s, val2.s);
+ EXPECT_FALSE(val2.s.empty());
+ }
+}
+
+class TestEnumMemberClass
+{
+public:
+ TestEnumMemberClass()
+ : t1(STATE_A), t2(STATE_B), t3(STATE_C) {}
+
+ enum TestEnumType {
+ STATE_INVALID = 0,
+ STATE_A = 1,
+ STATE_B = 2,
+ STATE_C = 3
+ };
+ TestEnumType t1;
+ TestEnumType t2;
+ TestEnumType t3;
+
+ MSGPACK_DEFINE((int&)t1, (int&)t2, (int&)t3);
+};
+
+TEST(MSGPACK_USER_DEFINED, simple_buffer_enum_member)
+{
+ TestEnumMemberClass val1;
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ TestEnumMemberClass val2;
+ val2.t1 = TestEnumMemberClass::STATE_INVALID;
+ val2.t2 = TestEnumMemberClass::STATE_INVALID;
+ val2.t3 = TestEnumMemberClass::STATE_INVALID;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.t1, val2.t1);
+ EXPECT_EQ(val1.t2, val2.t2);
+ EXPECT_EQ(val1.t3, val2.t3);
+}
+
+class TestUnionMemberClass
+{
+public:
+ TestUnionMemberClass() {}
+ TestUnionMemberClass(double f) {
+ is_double = true;
+ value.f = f;
+ }
+ TestUnionMemberClass(int i) {
+ is_double = false;
+ value.i = i;
+ }
+
+ union {
+ double f;
+ int i;
+ } value;
+ bool is_double;
+
+ template <typename Packer>
+ void msgpack_pack(Packer& pk) const
+ {
+ if (is_double)
+ pk.pack(msgpack::type::tuple<bool, double>(true, value.f));
+ else
+ pk.pack(msgpack::type::tuple<bool, int>(false, value.i));
+ }
+
+ void msgpack_unpack(msgpack::object o)
+ {
+ msgpack::type::tuple<bool, msgpack::object> tuple;
+ o.convert(&tuple);
+
+ is_double = tuple.get<0>();
+ if (is_double)
+ tuple.get<1>().convert(&value.f);
+ else
+ tuple.get<1>().convert(&value.i);
+ }
+};
+
+TEST(MSGPACK_USER_DEFINED, simple_buffer_union_member)
+{
+ {
+ // double
+ TestUnionMemberClass val1(1.0);
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ TestUnionMemberClass val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.is_double, val2.is_double);
+ EXPECT_TRUE(fabs(val1.value.f - val2.value.f) < kEPS);
+ }
+ {
+ // int
+ TestUnionMemberClass val1(1);
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, val1);
+ msgpack::zone z;
+ msgpack::object obj;
+ msgpack::unpack_return ret =
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
+ TestUnionMemberClass val2;
+ obj.convert(&val2);
+ EXPECT_EQ(val1.is_double, val2.is_double);
+ EXPECT_EQ(val1.value.i, 1);
+ EXPECT_EQ(val1.value.i, val2.value.i);
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+#define GEN_TEST_VREF(test_type) \
+ do { \
+ vector<test_type> v; \
+ v.push_back(0); \
+ for (unsigned int i = 0; i < v.size(); i++) { \
+ test_type val1 = v[i]; \
+ msgpack::vrefbuffer vbuf; \
+ msgpack::pack(vbuf, val1); \
+ msgpack::sbuffer sbuf; \
+ const struct iovec* cur = vbuf.vector(); \
+ const struct iovec* end = cur + vbuf.vector_size(); \
+ for(; cur != end; ++cur) \
+ sbuf.write((const char*)cur->iov_base, cur->iov_len); \
+ msgpack::zone z; \
+ msgpack::object obj; \
+ msgpack::unpack_return ret = \
+ msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); \
+ EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); \
+ test_type val2; \
+ obj.convert(&val2); \
+ EXPECT_EQ(val1, val2); \
+ } \
+ } while(0);
+
+TEST(MSGPACK, vrefbuffer_short)
+{
+ GEN_TEST_VREF(short);
+}
+
+TEST(MSGPACK, vrefbuffer_int)
+{
+ GEN_TEST_VREF(int);
+}
+
+TEST(MSGPACK, vrefbuffer_long)
+{
+ GEN_TEST_VREF(long);
+}
+
+TEST(MSGPACK, vrefbuffer_long_long)
+{
+ GEN_TEST_VREF(long long);
+}
+
+TEST(MSGPACK, vrefbuffer_unsigned_short)
+{
+ GEN_TEST_VREF(unsigned short);
+}
+
+TEST(MSGPACK, vrefbuffer_unsigned_int)
+{
+ GEN_TEST_VREF(unsigned int);
+}
+
+TEST(MSGPACK, vrefbuffer_unsigned_long)
+{
+ GEN_TEST_VREF(unsigned long);
+}
+
+TEST(MSGPACK, vrefbuffer_unsigned_long_long)
+{
+ GEN_TEST_VREF(unsigned long long);
+}
+
+TEST(MSGPACK, vrefbuffer_uint8)
+{
+ GEN_TEST_VREF(uint8_t);
+}
+
+TEST(MSGPACK, vrefbuffer_uint16)
+{
+ GEN_TEST_VREF(uint16_t);
+}
+
+TEST(MSGPACK, vrefbuffer_uint32)
+{
+ GEN_TEST_VREF(uint32_t);
+}
+
+TEST(MSGPACK, vrefbuffer_uint64)
+{
+ GEN_TEST_VREF(uint64_t);
+}
+
+TEST(MSGPACK, vrefbuffer_int8)
+{
+ GEN_TEST_VREF(int8_t);
+}
+
+TEST(MSGPACK, vrefbuffer_int16)
+{
+ GEN_TEST_VREF(int16_t);
+}
+
+TEST(MSGPACK, vrefbuffer_int32)
+{
+ GEN_TEST_VREF(int32_t);
+}
+
+TEST(MSGPACK, vrefbuffer_int64)
+{
+ GEN_TEST_VREF(int64_t);
+}
+
+//-----------------------------------------------------------------------------
+
+#define GEN_TEST_STREAM(test_type) \
+ for (unsigned int k = 0; k < kLoop; k++) { \
+ msgpack::sbuffer sbuf; \
+ msgpack::packer<msgpack::sbuffer> pk(sbuf); \
+ typedef std::vector<test_type> vec_type; \
+ vec_type vec; \
+ for(unsigned int i = 0; i < rand() % kLoop; ++i) { \
+ vec_type::value_type r = rand(); \
+ vec.push_back(r); \
+ pk.pack(r); \
+ } \
+ msgpack::unpacker pac; \
+ vec_type::const_iterator it = vec.begin(); \
+ const char *p = sbuf.data(); \
+ const char * const pend = p + sbuf.size(); \
+ while (p < pend) { \
+ const size_t sz = std::min<size_t>(pend - p, rand() % 128); \
+ pac.reserve_buffer(sz); \
+ memcpy(pac.buffer(), p, sz); \
+ pac.buffer_consumed(sz); \
+ while (pac.execute()) { \
+ if (it == vec.end()) goto out; \
+ msgpack::object obj = pac.data(); \
+ msgpack::zone *life = pac.release_zone(); \
+ EXPECT_TRUE(life != NULL); \
+ pac.reset(); \
+ vec_type::value_type val; \
+ obj.convert(&val); \
+ EXPECT_EQ(*it, val); \
+ ++it; \
+ delete life; \
+ } \
+ p += sz; \
+ } \
+ out: \
+ ; \
+ }
+
+TEST(MSGPACK, stream_short)
+{
+ GEN_TEST_STREAM(short);
+}
+
+TEST(MSGPACK, stream_int)
+{
+ GEN_TEST_STREAM(int);
+}
+
+TEST(MSGPACK, stream_long)
+{
+ GEN_TEST_STREAM(long);
+}
+
+TEST(MSGPACK, stream_long_long)
+{
+ GEN_TEST_STREAM(long long);
+}
+
+TEST(MSGPACK, stream_unsigned_short)
+{
+ GEN_TEST_STREAM(unsigned short);
+}
+
+TEST(MSGPACK, stream_unsigned_int)
+{
+ GEN_TEST_STREAM(unsigned int);
+}
+
+TEST(MSGPACK, stream_unsigned_long)
+{
+ GEN_TEST_STREAM(unsigned long);
+}
+
+TEST(MSGPACK, stream_unsigned_long_long)
+{
+ GEN_TEST_STREAM(unsigned long long);
+}
+
+TEST(MSGPACK, stream_uint8)
+{
+ GEN_TEST_STREAM(uint8_t);
+}
+
+TEST(MSGPACK, stream_uint16)
+{
+ GEN_TEST_STREAM(uint16_t);
+}
+
+TEST(MSGPACK, stream_uint32)
+{
+ GEN_TEST_STREAM(uint32_t);
+}
+
+TEST(MSGPACK, stream_uint64)
+{
+ GEN_TEST_STREAM(uint64_t);
+}
+
+TEST(MSGPACK, stream_int8)
+{
+ GEN_TEST_STREAM(int8_t);
+}
+
+TEST(MSGPACK, stream_int16)
+{
+ GEN_TEST_STREAM(int16_t);
+}
+
+TEST(MSGPACK, stream_int32)
+{
+ GEN_TEST_STREAM(int32_t);
+}
+
+TEST(MSGPACK, stream_int64)
+{
+ GEN_TEST_STREAM(int64_t);
+}
diff --git a/cpp/test/msgpackc_test.cpp b/cpp/test/msgpackc_test.cpp
new file mode 100644
index 0000000..f5646ea
--- /dev/null
+++ b/cpp/test/msgpackc_test.cpp
@@ -0,0 +1,424 @@
+#include "msgpack.h"
+
+#include <math.h>
+#include <vector>
+#include <limits>
+
+#include <gtest/gtest.h>
+
+using namespace std;
+
+const unsigned int kLoop = 10000;
+const double kEPS = 1e-10;
+
+#define GEN_TEST_SIGNED(test_type, func_type) \
+ do { \
+ vector<test_type> v; \
+ v.push_back(0); \
+ v.push_back(1); \
+ v.push_back(-1); \
+ v.push_back(numeric_limits<test_type>::min()); \
+ v.push_back(numeric_limits<test_type>::max()); \
+ for (unsigned int i = 0; i < kLoop; i++) \
+ v.push_back(rand()); \
+ for (unsigned int i = 0; i < v.size() ; i++) { \
+ test_type val = v[i]; \
+ msgpack_sbuffer sbuf; \
+ msgpack_sbuffer_init(&sbuf); \
+ msgpack_packer pk; \
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); \
+ msgpack_pack_##func_type(&pk, val); \
+ msgpack_zone z; \
+ msgpack_zone_init(&z, 2048); \
+ msgpack_object obj; \
+ msgpack_unpack_return ret = \
+ msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); \
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); \
+ if (val < 0) { \
+ EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, obj.type); \
+ EXPECT_EQ(val, obj.via.i64); \
+ } else { \
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type); \
+ EXPECT_EQ(val, obj.via.u64); \
+ } \
+ msgpack_zone_destroy(&z); \
+ msgpack_sbuffer_destroy(&sbuf); \
+ } \
+ } while(0)
+
+#define GEN_TEST_UNSIGNED(test_type, func_type) \
+ do { \
+ vector<test_type> v; \
+ v.push_back(0); \
+ v.push_back(1); \
+ v.push_back(2); \
+ v.push_back(numeric_limits<test_type>::min()); \
+ v.push_back(numeric_limits<test_type>::max()); \
+ for (unsigned int i = 0; i < kLoop; i++) \
+ v.push_back(rand()); \
+ for (unsigned int i = 0; i < v.size() ; i++) { \
+ test_type val = v[i]; \
+ msgpack_sbuffer sbuf; \
+ msgpack_sbuffer_init(&sbuf); \
+ msgpack_packer pk; \
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); \
+ msgpack_pack_##func_type(&pk, val); \
+ msgpack_zone z; \
+ msgpack_zone_init(&z, 2048); \
+ msgpack_object obj; \
+ msgpack_unpack_return ret = \
+ msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); \
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); \
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type); \
+ EXPECT_EQ(val, obj.via.u64); \
+ msgpack_zone_destroy(&z); \
+ msgpack_sbuffer_destroy(&sbuf); \
+ } \
+ } while(0)
+
+TEST(MSGPACKC, simple_buffer_short)
+{
+ GEN_TEST_SIGNED(short, short);
+}
+
+TEST(MSGPACKC, simple_buffer_int)
+{
+ GEN_TEST_SIGNED(int, int);
+}
+
+TEST(MSGPACKC, simple_buffer_long)
+{
+ GEN_TEST_SIGNED(long, long);
+}
+
+TEST(MSGPACKC, simple_buffer_long_long)
+{
+ GEN_TEST_SIGNED(long long, long_long);
+}
+
+TEST(MSGPACKC, simple_buffer_unsigned_short)
+{
+ GEN_TEST_UNSIGNED(unsigned short, unsigned_short);
+}
+
+TEST(MSGPACKC, simple_buffer_unsigned_int)
+{
+ GEN_TEST_UNSIGNED(unsigned int, unsigned_int);
+}
+
+TEST(MSGPACKC, simple_buffer_unsigned_long)
+{
+ GEN_TEST_UNSIGNED(unsigned long, unsigned_long);
+}
+
+TEST(MSGPACKC, simple_buffer_unsigned_long_long)
+{
+ GEN_TEST_UNSIGNED(unsigned long long, unsigned_long_long);
+}
+
+TEST(MSGPACKC, simple_buffer_uint8)
+{
+ GEN_TEST_UNSIGNED(uint8_t, uint8);
+}
+
+TEST(MSGPACKC, simple_buffer_uint16)
+{
+ GEN_TEST_UNSIGNED(uint16_t, uint16);
+}
+
+TEST(MSGPACKC, simple_buffer_uint32)
+{
+ GEN_TEST_UNSIGNED(uint32_t, uint32);
+}
+
+TEST(MSGPACKC, simple_buffer_uint64)
+{
+ GEN_TEST_UNSIGNED(uint64_t, uint64);
+}
+
+TEST(MSGPACKC, simple_buffer_int8)
+{
+ GEN_TEST_SIGNED(int8_t, int8);
+}
+
+TEST(MSGPACKC, simple_buffer_int16)
+{
+ GEN_TEST_SIGNED(int16_t, int16);
+}
+
+TEST(MSGPACKC, simple_buffer_int32)
+{
+ GEN_TEST_SIGNED(int32_t, int32);
+}
+
+TEST(MSGPACKC, simple_buffer_int64)
+{
+ GEN_TEST_SIGNED(int64_t, int64);
+}
+
+TEST(MSGPACKC, simple_buffer_float)
+{
+ vector<float> v;
+ v.push_back(0.0);
+ v.push_back(1.0);
+ v.push_back(-1.0);
+ v.push_back(numeric_limits<float>::min());
+ v.push_back(numeric_limits<float>::max());
+ v.push_back(nanf("tag"));
+ v.push_back(1.0/0.0); // inf
+ v.push_back(-(1.0/0.0)); // -inf
+ for (unsigned int i = 0; i < kLoop; i++) {
+ v.push_back(drand48());
+ v.push_back(-drand48());
+ }
+
+ for (unsigned int i = 0; i < v.size() ; i++) {
+ float val = v[i];
+ msgpack_sbuffer sbuf;
+ msgpack_sbuffer_init(&sbuf);
+ msgpack_packer pk;
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
+ msgpack_pack_float(&pk, val);
+ msgpack_zone z;
+ msgpack_zone_init(&z, 2048);
+ msgpack_object obj;
+ msgpack_unpack_return ret =
+ msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
+ EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, obj.type);
+ if (isnan(val))
+ EXPECT_TRUE(isnan(obj.via.dec));
+ else if (isinf(val))
+ EXPECT_TRUE(isinf(obj.via.dec));
+ else
+ EXPECT_TRUE(fabs(obj.via.dec - val) <= kEPS);
+ msgpack_zone_destroy(&z);
+ msgpack_sbuffer_destroy(&sbuf);
+ }
+}
+
+TEST(MSGPACKC, simple_buffer_double)
+{
+ vector<double> v;
+ v.push_back(0.0);
+ v.push_back(-0.0);
+ v.push_back(1.0);
+ v.push_back(-1.0);
+ v.push_back(numeric_limits<double>::min());
+ v.push_back(numeric_limits<double>::max());
+ v.push_back(nan("tag"));
+ v.push_back(1.0/0.0); // inf
+ v.push_back(-(1.0/0.0)); // -inf
+ for (unsigned int i = 0; i < kLoop; i++) {
+ v.push_back(drand48());
+ v.push_back(-drand48());
+ }
+
+ for (unsigned int i = 0; i < v.size() ; i++) {
+ double val = v[i];
+ msgpack_sbuffer sbuf;
+ msgpack_sbuffer_init(&sbuf);
+ msgpack_packer pk;
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
+ msgpack_pack_double(&pk, val);
+ msgpack_zone z;
+ msgpack_zone_init(&z, 2048);
+ msgpack_object obj;
+ msgpack_unpack_return ret =
+ msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
+ EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, obj.type);
+ if (isnan(val))
+ EXPECT_TRUE(isnan(obj.via.dec));
+ else if (isinf(val))
+ EXPECT_TRUE(isinf(obj.via.dec));
+ else
+ EXPECT_TRUE(fabs(obj.via.dec - val) <= kEPS);
+ msgpack_zone_destroy(&z);
+ msgpack_sbuffer_destroy(&sbuf);
+ }
+}
+
+TEST(MSGPACKC, simple_buffer_nil)
+{
+ msgpack_sbuffer sbuf;
+ msgpack_sbuffer_init(&sbuf);
+ msgpack_packer pk;
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
+ msgpack_pack_nil(&pk);
+ msgpack_zone z;
+ msgpack_zone_init(&z, 2048);
+ msgpack_object obj;
+ msgpack_unpack_return ret =
+ msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
+ EXPECT_EQ(MSGPACK_OBJECT_NIL, obj.type);
+ msgpack_zone_destroy(&z);
+ msgpack_sbuffer_destroy(&sbuf);
+}
+
+TEST(MSGPACKC, simple_buffer_true)
+{
+ msgpack_sbuffer sbuf;
+ msgpack_sbuffer_init(&sbuf);
+ msgpack_packer pk;
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
+ msgpack_pack_true(&pk);
+ msgpack_zone z;
+ msgpack_zone_init(&z, 2048);
+ msgpack_object obj;
+ msgpack_unpack_return ret =
+ msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
+ EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, obj.type);
+ EXPECT_EQ(true, obj.via.boolean);
+ msgpack_zone_destroy(&z);
+ msgpack_sbuffer_destroy(&sbuf);
+}
+
+TEST(MSGPACKC, simple_buffer_false)
+{
+ msgpack_sbuffer sbuf;
+ msgpack_sbuffer_init(&sbuf);
+ msgpack_packer pk;
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
+ msgpack_pack_false(&pk);
+ msgpack_zone z;
+ msgpack_zone_init(&z, 2048);
+ msgpack_object obj;
+ msgpack_unpack_return ret =
+ msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
+ EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, obj.type);
+ EXPECT_EQ(false, obj.via.boolean);
+ msgpack_zone_destroy(&z);
+ msgpack_sbuffer_destroy(&sbuf);
+}
+
+TEST(MSGPACKC, simple_buffer_array)
+{
+ unsigned int array_size = 5;
+
+ msgpack_sbuffer sbuf;
+ msgpack_sbuffer_init(&sbuf);
+ msgpack_packer pk;
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
+ msgpack_pack_array(&pk, array_size);
+ msgpack_pack_nil(&pk);
+ msgpack_pack_true(&pk);
+ msgpack_pack_false(&pk);
+ msgpack_pack_int(&pk, 10);
+ msgpack_pack_int(&pk, -10);
+
+ msgpack_zone z;
+ msgpack_zone_init(&z, 2048);
+ msgpack_object obj;
+ msgpack_unpack_return ret;
+ ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
+ EXPECT_EQ(MSGPACK_OBJECT_ARRAY, obj.type);
+ EXPECT_EQ(array_size, obj.via.array.size);
+
+ for (unsigned int i = 0; i < obj.via.array.size; i++) {
+ msgpack_object o = obj.via.array.ptr[i];
+ switch (i) {
+ case 0:
+ EXPECT_EQ(MSGPACK_OBJECT_NIL, o.type);
+ break;
+ case 1:
+ EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, o.type);
+ EXPECT_EQ(true, o.via.boolean);
+ break;
+ case 2:
+ EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, o.type);
+ EXPECT_EQ(false, o.via.boolean);
+ break;
+ case 3:
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, o.type);
+ EXPECT_EQ(10, o.via.u64);
+ break;
+ case 4:
+ EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, o.type);
+ EXPECT_EQ(-10, o.via.i64);
+ break;
+ }
+ }
+
+ msgpack_zone_destroy(&z);
+ msgpack_sbuffer_destroy(&sbuf);
+}
+
+TEST(MSGPACKC, simple_buffer_map)
+{
+ unsigned int map_size = 2;
+
+ msgpack_sbuffer sbuf;
+ msgpack_sbuffer_init(&sbuf);
+ msgpack_packer pk;
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
+ msgpack_pack_map(&pk, map_size);
+ msgpack_pack_true(&pk);
+ msgpack_pack_false(&pk);
+ msgpack_pack_int(&pk, 10);
+ msgpack_pack_int(&pk, -10);
+
+ msgpack_zone z;
+ msgpack_zone_init(&z, 2048);
+ msgpack_object obj;
+ msgpack_unpack_return ret;
+ ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
+ EXPECT_EQ(MSGPACK_OBJECT_MAP, obj.type);
+ EXPECT_EQ(map_size, obj.via.map.size);
+
+ for (unsigned int i = 0; i < map_size; i++) {
+ msgpack_object key = obj.via.map.ptr[i].key;
+ msgpack_object val = obj.via.map.ptr[i].val;
+ switch (i) {
+ case 0:
+ EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, key.type);
+ EXPECT_EQ(true, key.via.boolean);
+ EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, val.type);
+ EXPECT_EQ(false, val.via.boolean);
+ break;
+ case 1:
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, key.type);
+ EXPECT_EQ(10, key.via.u64);
+ EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, val.type);
+ EXPECT_EQ(-10, val.via.i64);
+ break;
+ }
+ }
+
+ msgpack_zone_destroy(&z);
+ msgpack_sbuffer_destroy(&sbuf);
+}
+
+TEST(MSGPACKC, simple_buffer_raw)
+{
+ unsigned int raw_size = 7;
+
+ msgpack_sbuffer sbuf;
+ msgpack_sbuffer_init(&sbuf);
+ msgpack_packer pk;
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
+ msgpack_pack_raw(&pk, raw_size);
+ msgpack_pack_raw_body(&pk, "fr", 2);
+ msgpack_pack_raw_body(&pk, "syuki", 5);
+ // invalid data
+ msgpack_pack_raw_body(&pk, "", 0);
+ msgpack_pack_raw_body(&pk, "kzk", 0);
+
+ msgpack_zone z;
+ msgpack_zone_init(&z, 2048);
+ msgpack_object obj;
+ msgpack_unpack_return ret;
+ ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
+ EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
+ EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type);
+ EXPECT_EQ(raw_size, obj.via.raw.size);
+ EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size));
+
+ msgpack_zone_destroy(&z);
+ msgpack_sbuffer_destroy(&sbuf);
+}
diff --git a/cpp/test/pack_unpack.cc b/cpp/test/pack_unpack.cc
index ca9b7d5..fe4625a 100644
--- a/cpp/test/pack_unpack.cc
+++ b/cpp/test/pack_unpack.cc
@@ -77,21 +77,17 @@ TEST(unpack, sequence)
msgpack::pack(sbuf, 2);
msgpack::pack(sbuf, 3);
- bool cont;
size_t offset = 0;
msgpack::unpacked msg;
- cont = msgpack::unpack(&msg, sbuf.data(), sbuf.size(), &offset);
- EXPECT_TRUE(cont);
+ msgpack::unpack(&msg, sbuf.data(), sbuf.size(), &offset);
EXPECT_EQ(1, msg.get().as<int>());
- cont = msgpack::unpack(&msg, sbuf.data(), sbuf.size(), &offset);
- EXPECT_TRUE(cont);
+ msgpack::unpack(&msg, sbuf.data(), sbuf.size(), &offset);
EXPECT_EQ(2, msg.get().as<int>());
- cont = msgpack::unpack(&msg, sbuf.data(), sbuf.size(), &offset);
- EXPECT_FALSE(cont);
+ msgpack::unpack(&msg, sbuf.data(), sbuf.size(), &offset);
EXPECT_EQ(3, msg.get().as<int>());
}
diff --git a/cpp/test/pack_unpack_c.cc b/cpp/test/pack_unpack_c.cc
new file mode 100644
index 0000000..e9a0389
--- /dev/null
+++ b/cpp/test/pack_unpack_c.cc
@@ -0,0 +1,70 @@
+#include <msgpack.h>
+#include <gtest/gtest.h>
+#include <stdio.h>
+
+TEST(pack, num)
+{
+ msgpack_sbuffer* sbuf = msgpack_sbuffer_new();
+ msgpack_packer* pk = msgpack_packer_new(sbuf, msgpack_sbuffer_write);
+
+ EXPECT_EQ(0, msgpack_pack_int(pk, 1));
+
+ msgpack_sbuffer_free(sbuf);
+ msgpack_packer_free(pk);
+}
+
+
+TEST(pack, array)
+{
+ msgpack_sbuffer* sbuf = msgpack_sbuffer_new();
+ msgpack_packer* pk = msgpack_packer_new(sbuf, msgpack_sbuffer_write);
+
+ EXPECT_EQ(0, msgpack_pack_array(pk, 3));
+ EXPECT_EQ(0, msgpack_pack_int(pk, 1));
+ EXPECT_EQ(0, msgpack_pack_int(pk, 2));
+ EXPECT_EQ(0, msgpack_pack_int(pk, 3));
+
+ msgpack_sbuffer_free(sbuf);
+ msgpack_packer_free(pk);
+}
+
+
+TEST(unpack, sequence)
+{
+ msgpack_sbuffer* sbuf = msgpack_sbuffer_new();
+ msgpack_packer* pk = msgpack_packer_new(sbuf, msgpack_sbuffer_write);
+
+ EXPECT_EQ(0, msgpack_pack_int(pk, 1));
+ EXPECT_EQ(0, msgpack_pack_int(pk, 2));
+ EXPECT_EQ(0, msgpack_pack_int(pk, 3));
+
+ msgpack_packer_free(pk);
+
+ bool success;
+ size_t offset = 0;
+
+ msgpack_unpacked msg;
+ msgpack_unpacked_init(&msg);
+
+ success = msgpack_unpack_next(&msg, sbuf->data, sbuf->size, &offset);
+ EXPECT_TRUE(success);
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, msg.data.type);
+ EXPECT_EQ(1, msg.data.via.u64);
+
+ success = msgpack_unpack_next(&msg, sbuf->data, sbuf->size, &offset);
+ EXPECT_TRUE(success);
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, msg.data.type);
+ EXPECT_EQ(2, msg.data.via.u64);
+
+ success = msgpack_unpack_next(&msg, sbuf->data, sbuf->size, &offset);
+ EXPECT_TRUE(success);
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, msg.data.type);
+ EXPECT_EQ(3, msg.data.via.u64);
+
+ success = msgpack_unpack_next(&msg, sbuf->data, sbuf->size, &offset);
+ EXPECT_FALSE(success);
+
+ msgpack_sbuffer_free(sbuf);
+ msgpack_unpacked_destroy(&msg);
+}
+
diff --git a/cpp/test/streaming.cc b/cpp/test/streaming.cc
index c01b8be..e80c671 100644
--- a/cpp/test/streaming.cc
+++ b/cpp/test/streaming.cc
@@ -2,28 +2,33 @@
#include <gtest/gtest.h>
#include <sstream>
-
TEST(streaming, basic)
{
- std::ostringstream stream;
- msgpack::packer<std::ostream> pk(&stream);
+ msgpack::sbuffer buffer;
+ msgpack::packer<msgpack::sbuffer> pk(&buffer);
pk.pack(1);
pk.pack(2);
pk.pack(3);
- std::istringstream input(stream.str());
+ const char* input = buffer.data();
+ const char* const eof = input + buffer.size();
msgpack::unpacker pac;
+ msgpack::unpacked result;
int count = 0;
while(count < 3) {
pac.reserve_buffer(32*1024);
- size_t len = input.readsome(pac.buffer(), pac.buffer_capacity());
+ // read buffer into pac.buffer() upto
+ // pac.buffer_capacity() bytes.
+ size_t len = 1;
+ memcpy(pac.buffer(), input, len);
+ input += len;
+
pac.buffer_consumed(len);
- msgpack::unpacked result;
while(pac.next(&result)) {
msgpack::object obj = result.get();
switch(count++) {
@@ -38,6 +43,8 @@ TEST(streaming, basic)
return;
}
}
+
+ EXPECT_TRUE(input < eof);
}
}
diff --git a/cpp/test/streaming_c.cc b/cpp/test/streaming_c.cc
new file mode 100644
index 0000000..6c87ac6
--- /dev/null
+++ b/cpp/test/streaming_c.cc
@@ -0,0 +1,57 @@
+#include <msgpack.h>
+#include <gtest/gtest.h>
+#include <stdio.h>
+
+TEST(streaming, basic)
+{
+ msgpack_sbuffer* buffer = msgpack_sbuffer_new();
+
+ msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write);
+ EXPECT_EQ(0, msgpack_pack_int(pk, 1));
+ EXPECT_EQ(0, msgpack_pack_int(pk, 2));
+ EXPECT_EQ(0, msgpack_pack_int(pk, 3));
+ msgpack_packer_free(pk);
+
+ const char* input = buffer->data;
+ const char* const eof = input + buffer->size;
+
+ msgpack_unpacker pac;
+ msgpack_unpacker_init(&pac, MSGPACK_UNPACKER_INIT_BUFFER_SIZE);
+
+ msgpack_unpacked result;
+ msgpack_unpacked_init(&result);
+
+ int count = 0;
+ while(count < 3) {
+ msgpack_unpacker_reserve_buffer(&pac, 32*1024);
+
+ /* read buffer into msgpack_unapcker_buffer(&pac) upto
+ * msgpack_unpacker_buffer_capacity(&pac) bytes. */
+ size_t len = 1;
+ memcpy(msgpack_unpacker_buffer(&pac), input, len);
+ input += len;
+
+ msgpack_unpacker_buffer_consumed(&pac, len);
+
+ while(msgpack_unpacker_next(&pac, &result)) {
+ msgpack_object obj = result.data;
+ switch(count++) {
+ case 0:
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, result.data.type);
+ EXPECT_EQ(1, result.data.via.u64);
+ break;
+ case 1:
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, result.data.type);
+ EXPECT_EQ(2, result.data.via.u64);
+ break;
+ case 2:
+ EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, result.data.type);
+ EXPECT_EQ(3, result.data.via.u64);
+ return;
+ }
+ }
+
+ EXPECT_TRUE(input < eof);
+ }
+}
+
diff --git a/cpp/test/version.cc b/cpp/test/version.cc
new file mode 100644
index 0000000..9357271
--- /dev/null
+++ b/cpp/test/version.cc
@@ -0,0 +1,13 @@
+#include <msgpack.hpp>
+#include <gtest/gtest.h>
+
+TEST(version, print)
+{
+ printf("MSGPACK_VERSION : %s\n", MSGPACK_VERSION);
+ printf("MSGPACK_VERSION_MAJOR : %d\n", MSGPACK_VERSION_MAJOR);
+ printf("MSGPACK_VERSION_MINOR : %d\n", MSGPACK_VERSION_MINOR);
+ printf("msgpack_version() : %s\n", msgpack_version());
+ printf("msgpack_version_major() : %d\n", msgpack_version_major());
+ printf("msgpack_version_minor() : %d\n", msgpack_version_minor());
+}
+