msgpack_container.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870
  1. #include <iostream>
  2. #include <msgpack.hpp>
  3. #include <cmath>
  4. #include <string>
  5. #include <vector>
  6. #include <map>
  7. #include <deque>
  8. #include <set>
  9. #include <list>
  10. #include <limits>
  11. #include "test_allocator.hpp"
  12. #include <gtest/gtest.h>
  13. #ifdef HAVE_CONFIG_H
  14. #include "config.h"
  15. #endif
  16. using namespace std;
  17. const unsigned int kLoop = 1000;
  18. const unsigned int kElements = 100;
  19. // strong typedefs
  20. namespace test {
  21. template <class Key>
  22. struct equal_to : std::equal_to<Key> {
  23. };
  24. template <class Key>
  25. struct less : std::less<Key> {
  26. };
  27. } // namespace test
  28. TEST(MSGPACK_STL, simple_buffer_vector)
  29. {
  30. typedef vector<int, test::allocator<int> > type;
  31. for (unsigned int k = 0; k < kLoop; k++) {
  32. type val1;
  33. for (unsigned int i = 0; i < kElements; i++)
  34. val1.push_back(rand());
  35. msgpack::sbuffer sbuf;
  36. msgpack::pack(sbuf, val1);
  37. msgpack::object_handle oh =
  38. msgpack::unpack(sbuf.data(), sbuf.size());
  39. EXPECT_EQ(oh.get().type, msgpack::type::ARRAY);
  40. type const& val2 = oh.get().as<type>();
  41. EXPECT_EQ(val1.size(), val2.size());
  42. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  43. }
  44. }
  45. TEST(MSGPACK_STL, simple_buffer_vector_empty)
  46. {
  47. typedef vector<int, test::allocator<int> > type;
  48. type val1;
  49. msgpack::sbuffer sbuf;
  50. msgpack::pack(sbuf, val1);
  51. msgpack::object_handle oh =
  52. msgpack::unpack(sbuf.data(), sbuf.size());
  53. EXPECT_EQ(oh.get().type, msgpack::type::ARRAY);
  54. type const& val2 = oh.get().as<type>();
  55. EXPECT_EQ(val1.size(), val2.size());
  56. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  57. }
  58. TEST(MSGPACK_STL, simple_buffer_vector_char)
  59. {
  60. typedef vector<char, test::allocator<char> > type;
  61. for (unsigned int k = 0; k < kLoop; k++) {
  62. type val1;
  63. for (unsigned int i = 0; i < kElements; i++)
  64. val1.push_back(rand());
  65. msgpack::sbuffer sbuf;
  66. msgpack::pack(sbuf, val1);
  67. msgpack::object_handle oh =
  68. msgpack::unpack(sbuf.data(), sbuf.size());
  69. EXPECT_EQ(oh.get().type, msgpack::type::BIN);
  70. type const& val2 = oh.get().as<type>();
  71. EXPECT_EQ(val1.size(), val2.size());
  72. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  73. }
  74. }
  75. TEST(MSGPACK_STL, simple_buffer_vector_char_empty)
  76. {
  77. typedef vector<char, test::allocator<char> > type;
  78. type val1;
  79. msgpack::sbuffer sbuf;
  80. msgpack::pack(sbuf, val1);
  81. msgpack::object_handle oh =
  82. msgpack::unpack(sbuf.data(), sbuf.size());
  83. EXPECT_EQ(oh.get().type, msgpack::type::BIN);
  84. type const& val2 = oh.get().as<type>();
  85. EXPECT_EQ(val1.size(), val2.size());
  86. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  87. }
  88. TEST(MSGPACK_STL, simple_buffer_vector_unsigned_char)
  89. {
  90. typedef vector<unsigned char, test::allocator<unsigned char> > type;
  91. for (unsigned int k = 0; k < kLoop; k++) {
  92. type val1;
  93. for (unsigned int i = 0; i < kElements; i++)
  94. val1.push_back(rand());
  95. msgpack::sbuffer sbuf;
  96. msgpack::pack(sbuf, val1);
  97. msgpack::object_handle oh =
  98. msgpack::unpack(sbuf.data(), sbuf.size());
  99. EXPECT_EQ(oh.get().type, msgpack::type::BIN);
  100. type const& val2 = oh.get().as<type>();
  101. EXPECT_EQ(val1.size(), val2.size());
  102. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  103. }
  104. }
  105. TEST(MSGPACK_STL, simple_buffer_vector_unsigned_char_empty)
  106. {
  107. typedef vector<unsigned char, test::allocator<unsigned char> > type;
  108. type val1;
  109. msgpack::sbuffer sbuf;
  110. msgpack::pack(sbuf, val1);
  111. msgpack::object_handle oh =
  112. msgpack::unpack(sbuf.data(), sbuf.size());
  113. EXPECT_EQ(oh.get().type, msgpack::type::BIN);
  114. type const& val2 = oh.get().as<type>();
  115. EXPECT_EQ(val1.size(), val2.size());
  116. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  117. }
  118. TEST(MSGPACK_STL, simple_buffer_vector_uint8_t)
  119. {
  120. if (!msgpack::is_same<uint8_t, unsigned char>::value) return;
  121. typedef vector<uint8_t, test::allocator<uint8_t> > type;
  122. for (unsigned int k = 0; k < kLoop; k++) {
  123. type val1;
  124. for (unsigned int i = 0; i < kElements; i++)
  125. val1.push_back(rand());
  126. msgpack::sbuffer sbuf;
  127. msgpack::pack(sbuf, val1);
  128. msgpack::object_handle oh =
  129. msgpack::unpack(sbuf.data(), sbuf.size());
  130. EXPECT_EQ(oh.get().type, msgpack::type::BIN);
  131. type const& val2 = oh.get().as<type>();
  132. EXPECT_EQ(val1.size(), val2.size());
  133. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  134. }
  135. }
  136. TEST(MSGPACK_STL, simple_buffer_vector_uint8_t_empty)
  137. {
  138. if (!msgpack::is_same<uint8_t, unsigned char>::value) return;
  139. typedef vector<uint8_t, test::allocator<uint8_t> > type;
  140. type val1;
  141. msgpack::sbuffer sbuf;
  142. msgpack::pack(sbuf, val1);
  143. msgpack::object_handle oh =
  144. msgpack::unpack(sbuf.data(), sbuf.size());
  145. EXPECT_EQ(oh.get().type, msgpack::type::BIN);
  146. type const& val2 = oh.get().as<type>();
  147. EXPECT_EQ(val1.size(), val2.size());
  148. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  149. }
  150. TEST(MSGPACK_STL, simple_buffer_vector_bool)
  151. {
  152. typedef vector<bool, test::allocator<bool> > type;
  153. type val1;
  154. for (unsigned int i = 0; i < kElements; i++)
  155. val1.push_back(i % 2 ? false : true);
  156. msgpack::sbuffer sbuf;
  157. msgpack::pack(sbuf, val1);
  158. msgpack::object_handle oh =
  159. msgpack::unpack(sbuf.data(), sbuf.size());
  160. EXPECT_EQ(oh.get().type, msgpack::type::ARRAY);
  161. type const& val2 = oh.get().as<type>();
  162. EXPECT_EQ(val1.size(), val2.size());
  163. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  164. }
  165. TEST(MSGPACK_STL, simple_buffer_vector_bool_empty)
  166. {
  167. typedef vector<bool, test::allocator<bool> > type;
  168. type val1;
  169. msgpack::sbuffer sbuf;
  170. msgpack::pack(sbuf, val1);
  171. msgpack::object_handle oh =
  172. msgpack::unpack(sbuf.data(), sbuf.size());
  173. EXPECT_EQ(oh.get().type, msgpack::type::ARRAY);
  174. type const& val2 = oh.get().as<type>();
  175. EXPECT_EQ(val1.size(), val2.size());
  176. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  177. }
  178. TEST(MSGPACK_STL, simple_buffer_assoc_vector)
  179. {
  180. typedef msgpack::type::assoc_vector<int, int, test::less<int>, test::allocator<std::pair<int, int> > >type;
  181. for (unsigned int k = 0; k < kLoop; k++) {
  182. type val1;
  183. val1.push_back(std::make_pair(1, 2));
  184. val1.push_back(std::make_pair(3, 4));
  185. val1.push_back(std::make_pair(5, 6));
  186. msgpack::sbuffer sbuf;
  187. msgpack::pack(sbuf, val1);
  188. msgpack::object_handle oh =
  189. msgpack::unpack(sbuf.data(), sbuf.size());
  190. type const& val2 = oh.get().as<type>();
  191. EXPECT_EQ(val1.size(), val2.size());
  192. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  193. }
  194. }
  195. TEST(MSGPACK_STL, simple_buffer_assoc_vector_empty)
  196. {
  197. typedef msgpack::type::assoc_vector<int, int, test::less<int>, test::allocator<std::pair<int, int> > >type;
  198. type val1;
  199. msgpack::sbuffer sbuf;
  200. msgpack::pack(sbuf, val1);
  201. msgpack::object_handle oh =
  202. msgpack::unpack(sbuf.data(), sbuf.size());
  203. type const& val2 = oh.get().as<type>();
  204. EXPECT_EQ(val1.size(), val2.size());
  205. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  206. }
  207. TEST(MSGPACK_STL, simple_buffer_map)
  208. {
  209. typedef map<int, int, test::less<int>, test::allocator<std::pair<const int, int> > > type;
  210. for (unsigned int k = 0; k < kLoop; k++) {
  211. type val1;
  212. for (unsigned int i = 0; i < kElements; i++)
  213. val1[rand()] = rand();
  214. msgpack::sbuffer sbuf;
  215. msgpack::pack(sbuf, val1);
  216. msgpack::object_handle oh =
  217. msgpack::unpack(sbuf.data(), sbuf.size());
  218. type const& val2 = oh.get().as<type>();
  219. EXPECT_EQ(val1.size(), val2.size());
  220. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  221. }
  222. }
  223. TEST(MSGPACK_STL, simple_buffer_map_empty)
  224. {
  225. typedef map<int, int, test::less<int>, test::allocator<std::pair<const int, int> > > type;
  226. type val1;
  227. msgpack::sbuffer sbuf;
  228. msgpack::pack(sbuf, val1);
  229. msgpack::object_handle oh =
  230. msgpack::unpack(sbuf.data(), sbuf.size());
  231. type const& val2 = oh.get().as<type>();
  232. EXPECT_EQ(val1.size(), val2.size());
  233. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  234. }
  235. TEST(MSGPACK_STL, simple_buffer_deque)
  236. {
  237. typedef deque<int, test::allocator<int> > type;
  238. for (unsigned int k = 0; k < kLoop; k++) {
  239. type val1;
  240. for (unsigned int i = 0; i < kElements; i++)
  241. val1.push_back(rand());
  242. msgpack::sbuffer sbuf;
  243. msgpack::pack(sbuf, val1);
  244. msgpack::object_handle oh =
  245. msgpack::unpack(sbuf.data(), sbuf.size());
  246. type const& val2 = oh.get().as<type>();
  247. EXPECT_EQ(val1.size(), val2.size());
  248. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  249. }
  250. }
  251. TEST(MSGPACK_STL, simple_buffer_deque_empty)
  252. {
  253. typedef deque<int, test::allocator<int> > type;
  254. type val1;
  255. msgpack::sbuffer sbuf;
  256. msgpack::pack(sbuf, val1);
  257. msgpack::object_handle oh =
  258. msgpack::unpack(sbuf.data(), sbuf.size());
  259. type const& val2 = oh.get().as<type>();
  260. EXPECT_EQ(val1.size(), val2.size());
  261. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  262. }
  263. TEST(MSGPACK_STL, simple_buffer_list)
  264. {
  265. typedef list<int, test::allocator<int> > type;
  266. for (unsigned int k = 0; k < kLoop; k++) {
  267. type val1;
  268. for (unsigned int i = 0; i < kElements; i++)
  269. val1.push_back(rand());
  270. msgpack::sbuffer sbuf;
  271. msgpack::pack(sbuf, val1);
  272. msgpack::object_handle oh =
  273. msgpack::unpack(sbuf.data(), sbuf.size());
  274. type const& val2 = oh.get().as<type>();
  275. EXPECT_EQ(val1.size(), val2.size());
  276. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  277. }
  278. }
  279. TEST(MSGPACK_STL, simple_buffer_list_empty)
  280. {
  281. typedef list<int, test::allocator<int> > type;
  282. type val1;
  283. msgpack::sbuffer sbuf;
  284. msgpack::pack(sbuf, val1);
  285. msgpack::object_handle oh =
  286. msgpack::unpack(sbuf.data(), sbuf.size());
  287. type const& val2 = oh.get().as<type>();
  288. EXPECT_EQ(val1.size(), val2.size());
  289. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  290. }
  291. TEST(MSGPACK_STL, simple_buffer_set)
  292. {
  293. typedef set<int, test::less<int>, test::allocator<int> > type;
  294. for (unsigned int k = 0; k < kLoop; k++) {
  295. type val1;
  296. for (unsigned int i = 0; i < kElements; i++)
  297. val1.insert(rand());
  298. msgpack::sbuffer sbuf;
  299. msgpack::pack(sbuf, val1);
  300. msgpack::object_handle oh =
  301. msgpack::unpack(sbuf.data(), sbuf.size());
  302. type val2 = oh.get().as<type>();
  303. EXPECT_EQ(val1.size(), val2.size());
  304. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  305. }
  306. }
  307. TEST(MSGPACK_STL, simple_buffer_set_empty)
  308. {
  309. typedef set<int, test::less<int>, test::allocator<int> > type;
  310. type val1;
  311. msgpack::sbuffer sbuf;
  312. msgpack::pack(sbuf, val1);
  313. msgpack::object_handle oh =
  314. msgpack::unpack(sbuf.data(), sbuf.size());
  315. type val2 = oh.get().as<type>();
  316. EXPECT_EQ(val1.size(), val2.size());
  317. EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin()));
  318. }
  319. TEST(MSGPACK_STL, simple_buffer_pair)
  320. {
  321. for (unsigned int k = 0; k < kLoop; k++) {
  322. pair<int, int> val1 = make_pair(rand(), rand());
  323. msgpack::sbuffer sbuf;
  324. msgpack::pack(sbuf, val1);
  325. msgpack::object_handle oh =
  326. msgpack::unpack(sbuf.data(), sbuf.size());
  327. pair<int, int> val2 = oh.get().as<pair<int, int> >();
  328. EXPECT_EQ(val1.first, val2.first);
  329. EXPECT_EQ(val1.second, val2.second);
  330. }
  331. }
  332. TEST(MSGPACK_STL, simple_buffer_multimap)
  333. {
  334. typedef multimap<int, int, test::less<int>, test::allocator<std::pair<const int, int> > > type;
  335. for (unsigned int k = 0; k < kLoop; k++) {
  336. type val1;
  337. for (unsigned int i = 0; i < kElements; i++) {
  338. int i1 = rand();
  339. val1.insert(make_pair(i1, rand()));
  340. val1.insert(make_pair(i1, rand()));
  341. }
  342. msgpack::sbuffer sbuf;
  343. msgpack::pack(sbuf, val1);
  344. msgpack::object_handle oh =
  345. msgpack::unpack(sbuf.data(), sbuf.size());
  346. type val2 = oh.get().as<type>();
  347. vector<pair<int, int> > v1, v2;
  348. type::const_iterator it;
  349. for (it = val1.begin(); it != val1.end(); ++it)
  350. v1.push_back(make_pair(it->first, it->second));
  351. for (it = val2.begin(); it != val2.end(); ++it)
  352. v2.push_back(make_pair(it->first, it->second));
  353. EXPECT_EQ(val1.size(), val2.size());
  354. EXPECT_EQ(v1.size(), v2.size());
  355. sort(v1.begin(), v1.end());
  356. sort(v2.begin(), v2.end());
  357. EXPECT_TRUE(v1 == v2);
  358. }
  359. }
  360. TEST(MSGPACK_STL, simple_buffer_multimap_empty)
  361. {
  362. typedef multimap<int, int, test::less<int>, test::allocator<std::pair<const int, int> > > type;
  363. type val1;
  364. msgpack::sbuffer sbuf;
  365. msgpack::pack(sbuf, val1);
  366. msgpack::object_handle oh =
  367. msgpack::unpack(sbuf.data(), sbuf.size());
  368. type val2 = oh.get().as<type>();
  369. EXPECT_EQ(val1.size(), val2.size());
  370. }
  371. TEST(MSGPACK_STL, simple_buffer_multiset)
  372. {
  373. typedef multiset<int, test::less<int>, test::allocator<int> > type;
  374. for (unsigned int k = 0; k < kLoop; k++) {
  375. type val1;
  376. for (unsigned int i = 0; i < kElements; i++)
  377. val1.insert(rand());
  378. msgpack::sbuffer sbuf;
  379. msgpack::pack(sbuf, val1);
  380. msgpack::object_handle oh =
  381. msgpack::unpack(sbuf.data(), sbuf.size());
  382. type val2 = oh.get().as<type>();
  383. vector<int> v1, v2;
  384. type::const_iterator it;
  385. for (it = val1.begin(); it != val1.end(); ++it)
  386. v1.push_back(*it);
  387. for (it = val2.begin(); it != val2.end(); ++it)
  388. v2.push_back(*it);
  389. EXPECT_EQ(val1.size(), val2.size());
  390. EXPECT_EQ(v1.size(), v2.size());
  391. sort(v1.begin(), v1.end());
  392. sort(v2.begin(), v2.end());
  393. EXPECT_TRUE(v1 == v2);
  394. }
  395. }
  396. TEST(MSGPACK_STL, simple_buffer_multiset_empty)
  397. {
  398. typedef multiset<int, test::less<int>, test::allocator<int> > type;
  399. type val1;
  400. msgpack::sbuffer sbuf;
  401. msgpack::pack(sbuf, val1);
  402. msgpack::object_handle oh =
  403. msgpack::unpack(sbuf.data(), sbuf.size());
  404. type val2 = oh.get().as<type>();
  405. EXPECT_EQ(val1.size(), val2.size());
  406. }
  407. TEST(MSGPACK_TUPLE, simple_tuple)
  408. {
  409. msgpack::sbuffer sbuf;
  410. msgpack::type::tuple<bool, std::string, double> val1(true, "kzk", 12.3);
  411. msgpack::pack(sbuf, val1);
  412. msgpack::object_handle oh =
  413. msgpack::unpack(sbuf.data(), sbuf.size());
  414. msgpack::type::tuple<bool, std::string, double> val2
  415. = oh.get().as<msgpack::type::tuple<bool, std::string, double> >();
  416. EXPECT_EQ(oh.get().via.array.size, 3u);
  417. EXPECT_EQ(val1.get<0>(), val2.get<0>());
  418. EXPECT_EQ(val1.get<1>(), val2.get<1>());
  419. EXPECT_EQ(val1.get<2>(), val2.get<2>());
  420. }
  421. TEST(MSGPACK_TUPLE, simple_tuple_empty)
  422. {
  423. msgpack::sbuffer sbuf;
  424. msgpack::type::tuple<> val1;
  425. msgpack::pack(sbuf, val1);
  426. msgpack::object_handle oh =
  427. msgpack::unpack(sbuf.data(), sbuf.size());
  428. oh.get().as<msgpack::type::tuple<> >();
  429. EXPECT_EQ(oh.get().via.array.size, 0u);
  430. }
  431. TEST(MSGPACK_TUPLE, simple_tuple_grater_than_as)
  432. {
  433. msgpack::sbuffer sbuf;
  434. msgpack::type::tuple<bool, std::string, int> val1(true, "kzk", 42);
  435. msgpack::pack(sbuf, val1);
  436. msgpack::object_handle oh =
  437. msgpack::unpack(sbuf.data(), sbuf.size());
  438. msgpack::type::tuple<bool, std::string, int, int> val2
  439. = oh.get().as<msgpack::type::tuple<bool, std::string, int, int> >();
  440. EXPECT_EQ(oh.get().via.array.size, 3u);
  441. EXPECT_EQ(val1.get<0>(), val2.get<0>());
  442. EXPECT_EQ(val1.get<1>(), val2.get<1>());
  443. EXPECT_EQ(val1.get<2>(), val2.get<2>());
  444. }
  445. TEST(MSGPACK_TUPLE, simple_tuple_grater_than_convert)
  446. {
  447. msgpack::sbuffer sbuf;
  448. msgpack::type::tuple<bool, std::string, int> val1(true, "kzk", 42);
  449. msgpack::pack(sbuf, val1);
  450. msgpack::object_handle oh =
  451. msgpack::unpack(sbuf.data(), sbuf.size());
  452. msgpack::type::tuple<bool, std::string, int, int> val2;
  453. oh.get().convert(val2);
  454. EXPECT_EQ(oh.get().via.array.size, 3u);
  455. EXPECT_EQ(val1.get<0>(), val2.get<0>());
  456. EXPECT_EQ(val1.get<1>(), val2.get<1>());
  457. EXPECT_EQ(val1.get<2>(), val2.get<2>());
  458. }
  459. TEST(MSGPACK_TUPLE, simple_tuple_less_than_as)
  460. {
  461. msgpack::sbuffer sbuf;
  462. msgpack::type::tuple<bool, std::string, int> val1(true, "kzk", 42);
  463. msgpack::pack(sbuf, val1);
  464. msgpack::object_handle oh =
  465. msgpack::unpack(sbuf.data(), sbuf.size());
  466. msgpack::type::tuple<bool, std::string> val2
  467. = oh.get().as<msgpack::type::tuple<bool, std::string> >();
  468. EXPECT_EQ(oh.get().via.array.size, 3u);
  469. EXPECT_EQ(val1.get<0>(), val2.get<0>());
  470. EXPECT_EQ(val1.get<1>(), val2.get<1>());
  471. }
  472. TEST(MSGPACK_TUPLE, simple_tuple_less_than_convert)
  473. {
  474. msgpack::sbuffer sbuf;
  475. msgpack::type::tuple<bool, std::string, int> val1(true, "kzk", 42);
  476. msgpack::pack(sbuf, val1);
  477. msgpack::object_handle oh =
  478. msgpack::unpack(sbuf.data(), sbuf.size());
  479. msgpack::type::tuple<bool, std::string> val2;
  480. oh.get().convert(val2);
  481. EXPECT_EQ(oh.get().via.array.size, 3u);
  482. EXPECT_EQ(val1.get<0>(), val2.get<0>());
  483. EXPECT_EQ(val1.get<1>(), val2.get<1>());
  484. }
  485. // TR1
  486. #if defined(MSGPACK_HAS_STD_TR1_UNORDERED_MAP) || defined(MSGPACK_HAS_STD_TR1_UNORDERED_SET)
  487. #include <tr1/functional>
  488. namespace test {
  489. template <class Key>
  490. struct tr1_hash : std::tr1::hash<Key> {
  491. };
  492. } // namespace test
  493. #endif // defined(MSGPACK_HAS_STD_TR1_UNORDERED_MAP) || defined(MSGPACK_HAS_STD_TR1_UNORDERED_SET)
  494. #ifdef MSGPACK_HAS_STD_TR1_UNORDERED_MAP
  495. #include <tr1/unordered_map>
  496. #include "msgpack/adaptor/tr1/unordered_map.hpp"
  497. TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_map)
  498. {
  499. typedef tr1::unordered_map<int, int, test::tr1_hash<int>, test::equal_to<int>, test::allocator<std::pair<const int, int> > > type;
  500. for (unsigned int k = 0; k < kLoop; k++) {
  501. type val1;
  502. for (unsigned int i = 0; i < kElements; i++)
  503. val1[rand()] = rand();
  504. msgpack::sbuffer sbuf;
  505. msgpack::pack(sbuf, val1);
  506. msgpack::object_handle oh =
  507. msgpack::unpack(sbuf.data(), sbuf.size());
  508. type val2 = oh.get().as<type>();
  509. EXPECT_EQ(val1.size(), val2.size());
  510. type::const_iterator it;
  511. for (it = val1.begin(); it != val1.end(); ++it) {
  512. EXPECT_TRUE(val2.find(it->first) != val2.end());
  513. EXPECT_EQ(it->second, val2.find(it->first)->second);
  514. }
  515. }
  516. }
  517. TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_map_empty)
  518. {
  519. typedef tr1::unordered_map<int, int, test::tr1_hash<int>, test::equal_to<int>, test::allocator<std::pair<const int, int> > > type;
  520. type val1;
  521. msgpack::sbuffer sbuf;
  522. msgpack::pack(sbuf, val1);
  523. msgpack::object_handle oh =
  524. msgpack::unpack(sbuf.data(), sbuf.size());
  525. type val2 = oh.get().as<type>();
  526. EXPECT_EQ(val1.size(), val2.size());
  527. }
  528. TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multimap)
  529. {
  530. typedef tr1::unordered_multimap<int, int, test::tr1_hash<int>, test::equal_to<int>, test::allocator<std::pair<const int, int> > > type;
  531. for (unsigned int k = 0; k < kLoop; k++) {
  532. type val1;
  533. for (unsigned int i = 0; i < kElements; i++) {
  534. int i1 = rand();
  535. val1.insert(make_pair(i1, rand()));
  536. val1.insert(make_pair(i1, rand()));
  537. }
  538. msgpack::sbuffer sbuf;
  539. msgpack::pack(sbuf, val1);
  540. msgpack::object_handle oh =
  541. msgpack::unpack(sbuf.data(), sbuf.size());
  542. type val2 = oh.get().as<type>();
  543. vector<pair<int, int> > v1, v2;
  544. type::const_iterator it;
  545. for (it = val1.begin(); it != val1.end(); ++it)
  546. v1.push_back(make_pair(it->first, it->second));
  547. for (it = val2.begin(); it != val2.end(); ++it)
  548. v2.push_back(make_pair(it->first, it->second));
  549. EXPECT_EQ(val1.size(), val2.size());
  550. EXPECT_EQ(v1.size(), v2.size());
  551. sort(v1.begin(), v1.end());
  552. sort(v2.begin(), v2.end());
  553. EXPECT_TRUE(v1 == v2);
  554. }
  555. }
  556. TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multimap_empty)
  557. {
  558. typedef tr1::unordered_multimap<int, int, test::tr1_hash<int>, test::equal_to<int>, test::allocator<std::pair<const int, int> > > type;
  559. type val1;
  560. msgpack::sbuffer sbuf;
  561. msgpack::pack(sbuf, val1);
  562. msgpack::object_handle oh =
  563. msgpack::unpack(sbuf.data(), sbuf.size());
  564. type val2 = oh.get().as<type>();
  565. EXPECT_EQ(val1.size(), val2.size());
  566. }
  567. #endif
  568. #ifdef MSGPACK_HAS_STD_TR1_UNORDERED_SET
  569. #include <tr1/unordered_set>
  570. #include "msgpack/adaptor/tr1/unordered_set.hpp"
  571. TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_set)
  572. {
  573. typedef tr1::unordered_set<int, test::tr1_hash<int>, test::equal_to<int>, test::allocator<int> > type;
  574. for (unsigned int k = 0; k < kLoop; k++) {
  575. type val1;
  576. for (unsigned int i = 0; i < kElements; i++)
  577. val1.insert(rand());
  578. msgpack::sbuffer sbuf;
  579. msgpack::pack(sbuf, val1);
  580. msgpack::object_handle oh =
  581. msgpack::unpack(sbuf.data(), sbuf.size());
  582. type val2 = oh.get().as<type>();
  583. EXPECT_EQ(val1.size(), val2.size());
  584. type::const_iterator it;
  585. for (it = val1.begin(); it != val1.end(); ++it)
  586. EXPECT_TRUE(val2.find(*it) != val2.end());
  587. }
  588. }
  589. TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_set_empty)
  590. {
  591. typedef tr1::unordered_set<int, test::tr1_hash<int>, test::equal_to<int>, test::allocator<int> > type;
  592. type val1;
  593. msgpack::sbuffer sbuf;
  594. msgpack::pack(sbuf, val1);
  595. msgpack::object_handle oh =
  596. msgpack::unpack(sbuf.data(), sbuf.size());
  597. type val2 = oh.get().as<type>();
  598. EXPECT_EQ(val1.size(), val2.size());
  599. }
  600. TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multiset)
  601. {
  602. typedef tr1::unordered_multiset<int, test::tr1_hash<int>, test::equal_to<int>, test::allocator<int> > type;
  603. for (unsigned int k = 0; k < kLoop; k++) {
  604. type val1;
  605. for (unsigned int i = 0; i < kElements; i++)
  606. val1.insert(rand());
  607. msgpack::sbuffer sbuf;
  608. msgpack::pack(sbuf, val1);
  609. msgpack::object_handle oh =
  610. msgpack::unpack(sbuf.data(), sbuf.size());
  611. type val2 = oh.get().as<type>();
  612. vector<int> v1, v2;
  613. type::const_iterator it;
  614. for (it = val1.begin(); it != val1.end(); ++it)
  615. v1.push_back(*it);
  616. for (it = val2.begin(); it != val2.end(); ++it)
  617. v2.push_back(*it);
  618. EXPECT_EQ(val1.size(), val2.size());
  619. EXPECT_EQ(v1.size(), v2.size());
  620. sort(v1.begin(), v1.end());
  621. sort(v2.begin(), v2.end());
  622. EXPECT_TRUE(v1 == v2);
  623. }
  624. }
  625. TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multiset_empty)
  626. {
  627. typedef tr1::unordered_multiset<int, test::tr1_hash<int>, test::equal_to<int>, test::allocator<int> > type;
  628. type val1;
  629. msgpack::sbuffer sbuf;
  630. msgpack::pack(sbuf, val1);
  631. msgpack::object_handle oh =
  632. msgpack::unpack(sbuf.data(), sbuf.size());
  633. type val2 = oh.get().as<type>();
  634. EXPECT_EQ(val1.size(), val2.size());
  635. }
  636. #endif
  637. #if defined (MSGPACK_HAS_STD_UNORDERED_MAP) || defined (MSGPACK_HAS_STD_UNORDERED_SET)
  638. #include <functional>
  639. namespace test {
  640. template <class Key>
  641. struct hash : std::hash<Key> {
  642. };
  643. } // namespace test
  644. #endif // defined (MSGPACK_HAS_STD_UNORDERED_MAP) || defined (MSGPACK_HAS_STD_UNORDERED_SET)
  645. #ifdef MSGPACK_HAS_STD_UNORDERED_MAP
  646. #include <unordered_map>
  647. #include "msgpack/adaptor/tr1/unordered_map.hpp"
  648. TEST(MSGPACK_TR1, simple_buffer_unordered_map)
  649. {
  650. typedef unordered_map<int, int, test::hash<int>, test::equal_to<int>, test::allocator<std::pair<const int, int> > > type;
  651. for (unsigned int k = 0; k < kLoop; k++) {
  652. type val1;
  653. for (unsigned int i = 0; i < kElements; i++)
  654. val1[rand()] = rand();
  655. msgpack::sbuffer sbuf;
  656. msgpack::pack(sbuf, val1);
  657. msgpack::object_handle oh =
  658. msgpack::unpack(sbuf.data(), sbuf.size());
  659. type val2 = oh.get().as<type>();
  660. EXPECT_EQ(val1.size(), val2.size());
  661. type::const_iterator it;
  662. for (it = val1.begin(); it != val1.end(); ++it) {
  663. EXPECT_TRUE(val2.find(it->first) != val2.end());
  664. EXPECT_EQ(it->second, val2.find(it->first)->second);
  665. }
  666. }
  667. }
  668. TEST(MSGPACK_TR1, simple_buffer_unordered_map_empty)
  669. {
  670. typedef unordered_map<int, int, test::hash<int>, test::equal_to<int>, test::allocator<std::pair<const int, int> > > type;
  671. type val1;
  672. msgpack::sbuffer sbuf;
  673. msgpack::pack(sbuf, val1);
  674. msgpack::object_handle oh =
  675. msgpack::unpack(sbuf.data(), sbuf.size());
  676. type val2 = oh.get().as<type>();
  677. EXPECT_EQ(val1.size(), val2.size());
  678. }
  679. TEST(MSGPACK_TR1, simple_buffer_unordered_multimap)
  680. {
  681. typedef unordered_multimap<int, int, test::hash<int>, test::equal_to<int>, test::allocator<std::pair<const int, int> > > type;
  682. for (unsigned int k = 0; k < kLoop; k++) {
  683. type val1;
  684. for (unsigned int i = 0; i < kElements; i++) {
  685. int i1 = rand();
  686. val1.insert(make_pair(i1, rand()));
  687. val1.insert(make_pair(i1, rand()));
  688. }
  689. msgpack::sbuffer sbuf;
  690. msgpack::pack(sbuf, val1);
  691. msgpack::object_handle oh =
  692. msgpack::unpack(sbuf.data(), sbuf.size());
  693. type val2 = oh.get().as<type>();
  694. vector<pair<int, int> > v1, v2;
  695. type::const_iterator it;
  696. for (it = val1.begin(); it != val1.end(); ++it)
  697. v1.push_back(make_pair(it->first, it->second));
  698. for (it = val2.begin(); it != val2.end(); ++it)
  699. v2.push_back(make_pair(it->first, it->second));
  700. EXPECT_EQ(val1.size(), val2.size());
  701. EXPECT_EQ(v1.size(), v2.size());
  702. sort(v1.begin(), v1.end());
  703. sort(v2.begin(), v2.end());
  704. EXPECT_TRUE(v1 == v2);
  705. }
  706. }
  707. TEST(MSGPACK_TR1, simple_buffer_unordered_multimap_empty)
  708. {
  709. typedef unordered_multimap<int, int, test::hash<int>, test::equal_to<int>, test::allocator<std::pair<const int, int> > > type;
  710. type val1;
  711. msgpack::sbuffer sbuf;
  712. msgpack::pack(sbuf, val1);
  713. msgpack::object_handle oh =
  714. msgpack::unpack(sbuf.data(), sbuf.size());
  715. type val2 = oh.get().as<type>();
  716. EXPECT_EQ(val1.size(), val2.size());
  717. }
  718. #endif
  719. #ifdef MSGPACK_HAS_STD_UNORDERED_SET
  720. #include <unordered_set>
  721. #include "msgpack/adaptor/tr1/unordered_set.hpp"
  722. TEST(MSGPACK_TR1, simple_buffer_unordered_set)
  723. {
  724. typedef unordered_set<int, test::hash<int>, test::equal_to<int>, test::allocator<int> > type;
  725. for (unsigned int k = 0; k < kLoop; k++) {
  726. type val1;
  727. for (unsigned int i = 0; i < kElements; i++)
  728. val1.insert(rand());
  729. msgpack::sbuffer sbuf;
  730. msgpack::pack(sbuf, val1);
  731. msgpack::object_handle oh =
  732. msgpack::unpack(sbuf.data(), sbuf.size());
  733. type val2 = oh.get().as<type>();
  734. EXPECT_EQ(val1.size(), val2.size());
  735. type::const_iterator it;
  736. for (it = val1.begin(); it != val1.end(); ++it)
  737. EXPECT_TRUE(val2.find(*it) != val2.end());
  738. }
  739. }
  740. TEST(MSGPACK_TR1, simple_buffer_unordered_set_empty)
  741. {
  742. typedef unordered_set<int, test::hash<int>, test::equal_to<int>, test::allocator<int> > type;
  743. type val1;
  744. msgpack::sbuffer sbuf;
  745. msgpack::pack(sbuf, val1);
  746. msgpack::object_handle oh =
  747. msgpack::unpack(sbuf.data(), sbuf.size());
  748. type val2 = oh.get().as<type>();
  749. EXPECT_EQ(val1.size(), val2.size());
  750. }
  751. TEST(MSGPACK_TR1, simple_buffer_unordered_multiset)
  752. {
  753. typedef unordered_multiset<int, test::hash<int>, test::equal_to<int>, test::allocator<int> > type;
  754. for (unsigned int k = 0; k < kLoop; k++) {
  755. type val1;
  756. for (unsigned int i = 0; i < kElements; i++)
  757. val1.insert(rand());
  758. msgpack::sbuffer sbuf;
  759. msgpack::pack(sbuf, val1);
  760. msgpack::object_handle oh =
  761. msgpack::unpack(sbuf.data(), sbuf.size());
  762. type val2 = oh.get().as<type>();
  763. vector<int> v1, v2;
  764. type::const_iterator it;
  765. for (it = val1.begin(); it != val1.end(); ++it)
  766. v1.push_back(*it);
  767. for (it = val2.begin(); it != val2.end(); ++it)
  768. v2.push_back(*it);
  769. EXPECT_EQ(val1.size(), val2.size());
  770. EXPECT_EQ(v1.size(), v2.size());
  771. sort(v1.begin(), v1.end());
  772. sort(v2.begin(), v2.end());
  773. EXPECT_TRUE(v1 == v2);
  774. }
  775. }
  776. TEST(MSGPACK_TR1, simple_buffer_unordered_multiset_empty)
  777. {
  778. typedef unordered_multiset<int, test::hash<int>, test::equal_to<int>, test::allocator<int> > type;
  779. type val1;
  780. msgpack::sbuffer sbuf;
  781. msgpack::pack(sbuf, val1);
  782. msgpack::object_handle oh =
  783. msgpack::unpack(sbuf.data(), sbuf.size());
  784. type val2 = oh.get().as<type>();
  785. EXPECT_EQ(val1.size(), val2.size());
  786. }
  787. #endif