object_with_zone.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068
  1. #include <msgpack.hpp>
  2. #include <gtest/gtest.h>
  3. #include <cmath>
  4. #ifdef HAVE_CONFIG_H
  5. #include "config.h"
  6. #endif
  7. enum enum_test {
  8. elem
  9. };
  10. MSGPACK_ADD_ENUM(enum_test);
  11. struct outer_enum {
  12. enum enum_test {
  13. elem
  14. };
  15. };
  16. MSGPACK_ADD_ENUM(outer_enum::enum_test);
  17. #if !defined(MSGPACK_USE_CPP03)
  18. enum class enum_class_test {
  19. elem
  20. };
  21. MSGPACK_ADD_ENUM(enum_class_test);
  22. struct outer_enum_class {
  23. enum class enum_class_test {
  24. elem
  25. };
  26. };
  27. MSGPACK_ADD_ENUM(outer_enum_class::enum_class_test);
  28. #endif // !defined(MSGPACK_USE_CPP03)
  29. using namespace std;
  30. const unsigned int kLoop = 1000;
  31. const unsigned int kElements = 100;
  32. const double kEPS = 1e-10;
  33. // bool
  34. TEST(object_with_zone, bool)
  35. {
  36. bool v = true;
  37. msgpack::zone z;
  38. msgpack::object obj(v, z);
  39. EXPECT_EQ(obj.as<bool>(), v);
  40. v = false;
  41. EXPECT_TRUE(obj.as<bool>());
  42. }
  43. // char
  44. TEST(object_with_zone, char)
  45. {
  46. char v = 1;
  47. msgpack::zone z;
  48. msgpack::object obj(v, z);
  49. EXPECT_EQ(obj.as<char>(), v);
  50. v = 2;
  51. EXPECT_EQ(obj.as<char>(), 1);
  52. }
  53. // signed integer family
  54. TEST(object_with_zone, signed_char)
  55. {
  56. signed char v = -1;
  57. msgpack::zone z;
  58. msgpack::object obj(v, z);
  59. EXPECT_EQ(obj.as<signed char>(), v);
  60. v = -2;
  61. EXPECT_EQ(obj.as<signed char>(), -1);
  62. }
  63. TEST(object_with_zone, signed_short)
  64. {
  65. signed short v = -1;
  66. msgpack::zone z;
  67. msgpack::object obj(v, z);
  68. EXPECT_EQ(obj.as<signed short>(), v);
  69. v = -2;
  70. EXPECT_EQ(obj.as<signed short>(), -1);
  71. }
  72. TEST(object_with_zone, signed_int)
  73. {
  74. signed int v = -1;
  75. msgpack::zone z;
  76. msgpack::object obj(v, z);
  77. EXPECT_EQ(obj.as<signed int>(), v);
  78. v = -2;
  79. EXPECT_EQ(obj.as<signed int>(), -1);
  80. }
  81. TEST(object_with_zone, signed_long)
  82. {
  83. signed long v = -1;
  84. msgpack::zone z;
  85. msgpack::object obj(v, z);
  86. EXPECT_EQ(obj.as<signed long>(), v);
  87. v = -2;
  88. EXPECT_EQ(obj.as<signed long>(), -1);
  89. }
  90. TEST(object_with_zone, signed_long_long)
  91. {
  92. signed long long v = -1;
  93. msgpack::zone z;
  94. msgpack::object obj(v, z);
  95. EXPECT_EQ(obj.as<signed long long>(), v);
  96. v = -2;
  97. EXPECT_EQ(obj.as<signed long long>(), -1);
  98. }
  99. // unsigned integer family
  100. TEST(object_with_zone, unsigned_char)
  101. {
  102. unsigned char v = 1;
  103. msgpack::zone z;
  104. msgpack::object obj(v, z);
  105. EXPECT_EQ(obj.as<unsigned char>(), v);
  106. v = 2;
  107. EXPECT_EQ(obj.as<unsigned char>(), 1);
  108. }
  109. TEST(object_with_zone, unsigned_short)
  110. {
  111. unsigned short v = 1;
  112. msgpack::zone z;
  113. msgpack::object obj(v, z);
  114. EXPECT_EQ(obj.as<unsigned short>(), v);
  115. v = 2;
  116. EXPECT_EQ(obj.as<unsigned short>(), 1);
  117. }
  118. TEST(object_with_zone, unsigned_int)
  119. {
  120. unsigned int v = 1;
  121. msgpack::zone z;
  122. msgpack::object obj(v, z);
  123. EXPECT_EQ(obj.as<unsigned int>(), v);
  124. v = 2;
  125. EXPECT_EQ(obj.as<unsigned int>(), 1u);
  126. }
  127. TEST(object_with_zone, unsigned_long)
  128. {
  129. unsigned long v = 1;
  130. msgpack::zone z;
  131. msgpack::object obj(v, z);
  132. EXPECT_EQ(obj.as<unsigned long>(), v);
  133. v = 2;
  134. EXPECT_EQ(obj.as<unsigned long>(), 1u);
  135. }
  136. TEST(object_with_zone, unsigned_long_long)
  137. {
  138. unsigned long long v = 1;
  139. msgpack::zone z;
  140. msgpack::object obj(v, z);
  141. EXPECT_EQ(obj.as<unsigned long long>(), v);
  142. v = 2;
  143. EXPECT_EQ(obj.as<unsigned long long>(), 1u);
  144. }
  145. // float
  146. TEST(object_with_zone, float)
  147. {
  148. float v = 1.23f;
  149. msgpack::zone z;
  150. msgpack::object obj(v, z);
  151. EXPECT_EQ(obj.type, msgpack::type::FLOAT32);
  152. EXPECT_TRUE(fabs(obj.as<float>() - v) <= kEPS);
  153. v = 4.56f;
  154. EXPECT_TRUE(fabs(obj.as<float>() - static_cast<float>(1.23)) <= kEPS);
  155. }
  156. // double
  157. TEST(object_with_zone, double)
  158. {
  159. double v = 1.23;
  160. msgpack::zone z;
  161. msgpack::object obj(v, z);
  162. EXPECT_EQ(obj.type, msgpack::type::FLOAT64);
  163. EXPECT_TRUE(fabs(obj.as<double>() - v) <= kEPS);
  164. v = 4.56;
  165. EXPECT_TRUE(fabs(obj.as<double>() - 1.23) <= kEPS);
  166. }
  167. // vector
  168. TEST(object_with_zone, vector)
  169. {
  170. for (unsigned int k = 0; k < kLoop; k++) {
  171. vector<int> v1;
  172. v1.push_back(1);
  173. for (unsigned int i = 1; i < kElements; i++)
  174. v1.push_back(i);
  175. msgpack::zone z;
  176. msgpack::object obj(v1, z);
  177. EXPECT_TRUE(obj.as<vector<int> >() == v1);
  178. v1.front() = 42;
  179. EXPECT_EQ(obj.as<vector<int> >().front(), 1);
  180. }
  181. }
  182. // vector_char
  183. TEST(object_with_zone, vector_char)
  184. {
  185. for (unsigned int k = 0; k < kLoop; k++) {
  186. vector<char> v1;
  187. v1.push_back(1);
  188. for (unsigned int i = 1; i < kElements; i++)
  189. v1.push_back(static_cast<char>(i));
  190. msgpack::zone z;
  191. msgpack::object obj(v1, z);
  192. EXPECT_TRUE(obj.as<vector<char> >() == v1);
  193. v1.front() = 42;
  194. EXPECT_EQ(obj.as<vector<char> >().front(), 1);
  195. }
  196. }
  197. TEST(object_without_zone, vector_char)
  198. {
  199. for (unsigned int k = 0; k < kLoop; k++) {
  200. vector<char> v1;
  201. v1.push_back(1);
  202. for (unsigned int i = 1; i < kElements; i++)
  203. v1.push_back(static_cast<char>(i));
  204. msgpack::object obj(v1);
  205. EXPECT_TRUE(obj.as<vector<char> >() == v1);
  206. v1.front() = 42;
  207. // obj refer to v1
  208. EXPECT_EQ(obj.as<vector<char> >().front(), 42);
  209. }
  210. }
  211. // vector_unsgined_char
  212. TEST(object_with_zone, vector_unsigned_char)
  213. {
  214. if (!msgpack::is_same<uint8_t, unsigned char>::value) return;
  215. for (unsigned int k = 0; k < kLoop; k++) {
  216. vector<unsigned char> v1;
  217. v1.push_back(1);
  218. for (unsigned int i = 1; i < kElements; i++)
  219. v1.push_back(static_cast<unsigned char>(i));
  220. msgpack::zone z;
  221. msgpack::object obj(v1, z);
  222. EXPECT_TRUE(obj.as<vector<unsigned char> >() == v1);
  223. v1.front() = 42;
  224. EXPECT_EQ(obj.as<vector<unsigned char> >().front(), 1);
  225. }
  226. }
  227. TEST(object_without_zone, vector_unsigned_char)
  228. {
  229. if (!msgpack::is_same<uint8_t, unsigned char>::value) return;
  230. for (unsigned int k = 0; k < kLoop; k++) {
  231. vector<unsigned char> v1;
  232. v1.push_back(1);
  233. for (unsigned int i = 1; i < kElements; i++)
  234. v1.push_back(static_cast<unsigned char>(i));
  235. msgpack::object obj(v1);
  236. EXPECT_TRUE(obj.as<vector<unsigned char> >() == v1);
  237. v1.front() = 42;
  238. // obj refer to v1
  239. EXPECT_EQ(obj.as<vector<unsigned char> >().front(), 42);
  240. }
  241. }
  242. // list
  243. TEST(object_with_zone, list)
  244. {
  245. for (unsigned int k = 0; k < kLoop; k++) {
  246. list<int> v1;
  247. v1.push_back(1);
  248. for (unsigned int i = 1; i < kElements; i++)
  249. v1.push_back(i);
  250. msgpack::zone z;
  251. msgpack::object obj(v1, z);
  252. EXPECT_TRUE(obj.as<list<int> >() == v1);
  253. v1.front() = 42;
  254. EXPECT_EQ(obj.as<list<int> >().front(), 1);
  255. }
  256. }
  257. // deque
  258. TEST(object_with_zone, deque)
  259. {
  260. for (unsigned int k = 0; k < kLoop; k++) {
  261. deque<int> v1;
  262. v1.push_back(1);
  263. for (unsigned int i = 1; i < kElements; i++)
  264. v1.push_back(i);
  265. msgpack::zone z;
  266. msgpack::object obj(v1, z);
  267. EXPECT_TRUE(obj.as<deque<int> >() == v1);
  268. v1.front() = 42;
  269. EXPECT_EQ(obj.as<deque<int> >().front(), 1);
  270. }
  271. }
  272. // string
  273. TEST(object_with_zone, string)
  274. {
  275. string v = "abc";
  276. msgpack::zone z;
  277. msgpack::object obj(v, z);
  278. EXPECT_EQ(obj.as<string>(), v);
  279. v[0] = 'd';
  280. EXPECT_EQ(obj.as<string>()[0], 'a');
  281. }
  282. #if MSGPACK_DEFAULT_API_VERSION == 1
  283. TEST(object_without_zone, string)
  284. {
  285. string v = "abc";
  286. msgpack::zone z;
  287. msgpack::object obj(v);
  288. EXPECT_EQ(obj.as<string>(), v);
  289. v[0] = 'd';
  290. EXPECT_EQ(obj.as<string>()[0], 'd');
  291. }
  292. #endif // MSGPACK_DEFAULT_API_VERSION == 1
  293. // char*
  294. TEST(object_with_zone, char_ptr)
  295. {
  296. char v[] = "abc";
  297. msgpack::zone z;
  298. msgpack::object obj(v, z);
  299. EXPECT_EQ(obj.as<string>(), std::string(v));
  300. v[0] = 'd';
  301. EXPECT_EQ(obj.as<string>()[0], 'a');
  302. }
  303. #if MSGPACK_DEFAULT_API_VERSION == 1
  304. TEST(object_without_zone, char_ptr)
  305. {
  306. char v[] = "abc";
  307. msgpack::zone z;
  308. msgpack::object obj(v);
  309. EXPECT_EQ(obj.as<string>(), std::string(v));
  310. v[0] = 'd';
  311. EXPECT_EQ(obj.as<string>()[0], 'd');
  312. }
  313. #endif // MSGPACK_DEFAULT_API_VERSION == 1
  314. // raw_ref
  315. TEST(object_with_zone, raw_ref)
  316. {
  317. string s = "abc";
  318. msgpack::type::raw_ref v(s.data(), static_cast<uint32_t>(s.size()));
  319. msgpack::zone z;
  320. msgpack::object obj(v, z);
  321. EXPECT_TRUE(obj.as<msgpack::type::raw_ref>() == v);
  322. s[0] = 'd';
  323. // even if with_zone, not copied due to raw_ref
  324. // Basically, the combination raw_ref and object::wit_zone
  325. // is meaningless.
  326. EXPECT_TRUE(obj.as<msgpack::type::raw_ref>() == v);
  327. }
  328. TEST(object_without_zone, raw_ref)
  329. {
  330. string s = "abc";
  331. msgpack::type::raw_ref v(s.data(), static_cast<uint32_t>(s.size()));
  332. msgpack::zone z;
  333. msgpack::object obj(v);
  334. EXPECT_TRUE(obj.as<msgpack::type::raw_ref>() == v);
  335. s[0] = 'd';
  336. EXPECT_TRUE(obj.as<msgpack::type::raw_ref>() == v);
  337. }
  338. // pair
  339. TEST(object_with_zone, pair)
  340. {
  341. typedef pair<int, string> test_t;
  342. test_t v(1, "abc");
  343. msgpack::zone z;
  344. msgpack::object obj(v, z);
  345. EXPECT_TRUE(obj.as<test_t>() == v);
  346. v.first = 42;
  347. EXPECT_EQ(obj.as<test_t>().first, 1);
  348. }
  349. // set
  350. TEST(object_with_zone, set)
  351. {
  352. for (unsigned int k = 0; k < kLoop; k++) {
  353. set<int> v1;
  354. for (unsigned int i = 0; i < kElements; i++)
  355. v1.insert(i);
  356. msgpack::zone z;
  357. msgpack::object obj(v1, z);
  358. EXPECT_TRUE(obj.as<set<int> >() == v1);
  359. }
  360. }
  361. // multiset
  362. TEST(object_with_zone, multiset)
  363. {
  364. for (unsigned int k = 0; k < kLoop; k++) {
  365. multiset<int> v1;
  366. for (unsigned int i = 0; i < kElements; i++)
  367. v1.insert(i % (kElements / 2));
  368. msgpack::zone z;
  369. msgpack::object obj(v1, z);
  370. EXPECT_TRUE(obj.as<multiset<int> >() == v1);
  371. }
  372. }
  373. // map
  374. TEST(object_with_zone, map)
  375. {
  376. typedef map<int, int> test_t;
  377. for (unsigned int k = 0; k < kLoop; k++) {
  378. test_t v1;
  379. for (unsigned int i = 0; i < kElements; i++)
  380. v1.insert(std::make_pair(i, i*2));
  381. msgpack::zone z;
  382. msgpack::object obj(v1, z);
  383. EXPECT_TRUE(obj.as<test_t >() == v1);
  384. }
  385. }
  386. // multimap
  387. TEST(object_with_zone, multimap)
  388. {
  389. typedef multimap<int, int> test_t;
  390. for (unsigned int k = 0; k < kLoop; k++) {
  391. test_t v1;
  392. for (unsigned int i = 0; i < kElements; i++)
  393. v1.insert(std::make_pair(i % (kElements / 2), i*2));
  394. msgpack::zone z;
  395. msgpack::object obj(v1, z);
  396. EXPECT_TRUE(obj.as<test_t >() == v1);
  397. }
  398. }
  399. // msgpack_tuple
  400. TEST(object_with_zone, msgpack_tuple)
  401. {
  402. typedef msgpack::type::tuple<int, string, bool> test_t;
  403. test_t v(1, "abc", true);
  404. msgpack::zone z;
  405. msgpack::object obj(v, z);
  406. EXPECT_EQ(msgpack::type::get<0>(obj.as<test_t>()), 1);
  407. EXPECT_EQ(msgpack::type::get<1>(obj.as<test_t>()), "abc");
  408. EXPECT_EQ(msgpack::type::get<2>(obj.as<test_t>()), true);
  409. msgpack::type::get<0>(v) = 42;
  410. EXPECT_EQ(msgpack::type::get<0>(obj.as<test_t>()), 1);
  411. }
  412. TEST(object_with_zone, msgpack_tuple_empty)
  413. {
  414. typedef msgpack::type::tuple<> test_t;
  415. test_t v;
  416. msgpack::zone z;
  417. msgpack::object obj(v, z);
  418. EXPECT_EQ(obj.via.array.size, 0u);
  419. }
  420. // TR1
  421. #ifdef MSGPACK_HAS_STD_TR1_UNORDERED_MAP
  422. #include <tr1/unordered_map>
  423. #include "msgpack/adaptor/tr1/unordered_map.hpp"
  424. TEST(object_with_zone, tr1_unordered_map)
  425. {
  426. typedef tr1::unordered_map<int, int> test_t;
  427. for (unsigned int k = 0; k < kLoop; k++) {
  428. test_t v1;
  429. for (unsigned int i = 0; i < kElements; i++)
  430. v1[rand()] = rand();
  431. msgpack::zone z;
  432. msgpack::object obj(v1, z);
  433. test_t v2 = obj.as<test_t>();
  434. EXPECT_EQ(v1.size(), v2.size());
  435. test_t::const_iterator it;
  436. for (it = v1.begin(); it != v1.end(); ++it) {
  437. EXPECT_TRUE(v2.find(it->first) != v2.end());
  438. EXPECT_EQ(it->second, v2.find(it->first)->second);
  439. }
  440. }
  441. }
  442. TEST(object_with_zone, tr1_unordered_multimap)
  443. {
  444. typedef tr1::unordered_multimap<int, int> test_t;
  445. for (unsigned int k = 0; k < kLoop; k++) {
  446. test_t v1;
  447. for (unsigned int i = 0; i < kElements; i++) {
  448. int i1 = rand();
  449. v1.insert(make_pair(i1, rand()));
  450. v1.insert(make_pair(i1, rand()));
  451. }
  452. msgpack::zone z;
  453. msgpack::object obj(v1, z);
  454. test_t v2 = obj.as<test_t>();
  455. vector<pair<int, int> > vec1, vec2;
  456. tr1::unordered_multimap<int, int>::const_iterator it;
  457. for (it = v1.begin(); it != v1.end(); ++it)
  458. vec1.push_back(make_pair(it->first, it->second));
  459. for (it = v2.begin(); it != v2.end(); ++it)
  460. vec2.push_back(make_pair(it->first, it->second));
  461. EXPECT_EQ(v1.size(), v2.size());
  462. EXPECT_EQ(vec1.size(), vec2.size());
  463. sort(vec1.begin(), vec1.end());
  464. sort(vec2.begin(), vec2.end());
  465. EXPECT_TRUE(vec1 == vec2);
  466. }
  467. }
  468. #endif
  469. #ifdef MSGPACK_HAS_STD_TR1_UNORDERED_SET
  470. #include <tr1/unordered_set>
  471. #include "msgpack/adaptor/tr1/unordered_set.hpp"
  472. TEST(object_with_zone, tr1_unordered_set)
  473. {
  474. typedef tr1::unordered_set<int> test_t;
  475. for (unsigned int k = 0; k < kLoop; k++) {
  476. test_t v1;
  477. for (unsigned int i = 0; i < kElements; i++)
  478. v1.insert(rand());
  479. msgpack::zone z;
  480. msgpack::object obj(v1, z);
  481. test_t v2 = obj.as<test_t>();
  482. EXPECT_EQ(v1.size(), v2.size());
  483. tr1::unordered_set<int>::const_iterator it;
  484. for (it = v1.begin(); it != v1.end(); ++it)
  485. EXPECT_TRUE(v2.find(*it) != v2.end());
  486. }
  487. }
  488. TEST(object_with_zone, tr1_unordered_multiset)
  489. {
  490. typedef tr1::unordered_set<int> test_t;
  491. for (unsigned int k = 0; k < kLoop; k++) {
  492. test_t v1;
  493. for (unsigned int i = 0; i < kElements; i++) {
  494. int i1 = rand();
  495. v1.insert(i1);
  496. v1.insert(i1);
  497. }
  498. msgpack::zone z;
  499. msgpack::object obj(v1, z);
  500. test_t v2 = obj.as<test_t>();
  501. vector<int> vec1, vec2;
  502. tr1::unordered_multiset<int>::const_iterator it;
  503. for (it = v1.begin(); it != v1.end(); ++it)
  504. vec1.push_back(*it);
  505. for (it = v2.begin(); it != v2.end(); ++it)
  506. vec2.push_back(*it);
  507. EXPECT_EQ(v1.size(), v2.size());
  508. EXPECT_EQ(vec1.size(), vec2.size());
  509. sort(vec1.begin(), vec1.end());
  510. sort(vec2.begin(), vec2.end());
  511. EXPECT_TRUE(vec1 == vec2);
  512. }
  513. }
  514. #endif
  515. #ifdef MSGPACK_HAS_STD_UNORDERED_MAP
  516. #include <unordered_map>
  517. #include "msgpack/adaptor/tr1/unordered_map.hpp"
  518. TEST(object_with_zone, unordered_map)
  519. {
  520. typedef unordered_map<int, int> test_t;
  521. for (unsigned int k = 0; k < kLoop; k++) {
  522. test_t v1;
  523. for (unsigned int i = 0; i < kElements; i++)
  524. v1[rand()] = rand();
  525. msgpack::zone z;
  526. msgpack::object obj(v1, z);
  527. test_t v2 = obj.as<test_t>();
  528. EXPECT_EQ(v1.size(), v2.size());
  529. test_t::const_iterator it;
  530. for (it = v1.begin(); it != v1.end(); ++it) {
  531. EXPECT_TRUE(v2.find(it->first) != v2.end());
  532. EXPECT_EQ(it->second, v2.find(it->first)->second);
  533. }
  534. }
  535. }
  536. TEST(object_with_zone, unordered_multimap)
  537. {
  538. typedef unordered_multimap<int, int> test_t;
  539. for (unsigned int k = 0; k < kLoop; k++) {
  540. test_t v1;
  541. for (unsigned int i = 0; i < kElements; i++) {
  542. int i1 = rand();
  543. v1.insert(make_pair(i1, rand()));
  544. v1.insert(make_pair(i1, rand()));
  545. }
  546. msgpack::zone z;
  547. msgpack::object obj(v1, z);
  548. test_t v2 = obj.as<test_t>();
  549. vector<pair<int, int> > vec1, vec2;
  550. unordered_multimap<int, int>::const_iterator it;
  551. for (it = v1.begin(); it != v1.end(); ++it)
  552. vec1.push_back(make_pair(it->first, it->second));
  553. for (it = v2.begin(); it != v2.end(); ++it)
  554. vec2.push_back(make_pair(it->first, it->second));
  555. EXPECT_EQ(v1.size(), v2.size());
  556. EXPECT_EQ(vec1.size(), vec2.size());
  557. sort(vec1.begin(), vec1.end());
  558. sort(vec2.begin(), vec2.end());
  559. EXPECT_TRUE(vec1 == vec2);
  560. }
  561. }
  562. #endif
  563. #ifdef MSGPACK_HAS_STD_UNORDERED_SET
  564. #include <unordered_set>
  565. #include "msgpack/adaptor/tr1/unordered_set.hpp"
  566. TEST(object_with_zone, unordered_set)
  567. {
  568. typedef unordered_set<int> test_t;
  569. for (unsigned int k = 0; k < kLoop; k++) {
  570. test_t v1;
  571. for (unsigned int i = 0; i < kElements; i++)
  572. v1.insert(rand());
  573. msgpack::zone z;
  574. msgpack::object obj(v1, z);
  575. test_t v2 = obj.as<test_t>();
  576. EXPECT_EQ(v1.size(), v2.size());
  577. unordered_set<int>::const_iterator it;
  578. for (it = v1.begin(); it != v1.end(); ++it)
  579. EXPECT_TRUE(v2.find(*it) != v2.end());
  580. }
  581. }
  582. TEST(object_with_zone, unordered_multiset)
  583. {
  584. typedef unordered_set<int> test_t;
  585. for (unsigned int k = 0; k < kLoop; k++) {
  586. test_t v1;
  587. for (unsigned int i = 0; i < kElements; i++) {
  588. int i1 = rand();
  589. v1.insert(i1);
  590. v1.insert(i1);
  591. }
  592. msgpack::zone z;
  593. msgpack::object obj(v1, z);
  594. test_t v2 = obj.as<test_t>();
  595. vector<int> vec1, vec2;
  596. unordered_multiset<int>::const_iterator it;
  597. for (it = v1.begin(); it != v1.end(); ++it)
  598. vec1.push_back(*it);
  599. for (it = v2.begin(); it != v2.end(); ++it)
  600. vec2.push_back(*it);
  601. EXPECT_EQ(v1.size(), v2.size());
  602. EXPECT_EQ(vec1.size(), vec2.size());
  603. sort(vec1.begin(), vec1.end());
  604. sort(vec2.begin(), vec2.end());
  605. EXPECT_TRUE(vec1 == vec2);
  606. }
  607. }
  608. #endif
  609. // User defined class
  610. class TestClass
  611. {
  612. public:
  613. TestClass() : i(0), s("kzk") {}
  614. int i;
  615. string s;
  616. MSGPACK_DEFINE(i, s);
  617. };
  618. TEST(object_with_zone, user_defined)
  619. {
  620. TestClass v1;
  621. msgpack::zone z;
  622. msgpack::object obj(v1, z);
  623. TestClass v2 = obj.as<TestClass>();
  624. EXPECT_EQ(v1.i, v2.i);
  625. EXPECT_EQ(v1.s, v2.s);
  626. }
  627. TEST(object_with_zone, construct_enum)
  628. {
  629. msgpack::zone z;
  630. msgpack::object obj(elem, z);
  631. EXPECT_EQ(msgpack::type::POSITIVE_INTEGER, obj.type);
  632. EXPECT_EQ(static_cast<uint64_t>(elem), obj.via.u64);
  633. }
  634. #if !defined(MSGPACK_USE_CPP03)
  635. TEST(object_with_zone, construct_enum_newstyle)
  636. {
  637. msgpack::zone z;
  638. msgpack::object obj(enum_test::elem, z);
  639. EXPECT_EQ(msgpack::type::POSITIVE_INTEGER, obj.type);
  640. EXPECT_EQ(elem, obj.via.u64);
  641. }
  642. #endif // !defined(MSGPACK_USE_CPP03)
  643. TEST(object_with_zone, construct_enum_outer)
  644. {
  645. msgpack::zone z;
  646. msgpack::object obj(outer_enum::elem, z);
  647. EXPECT_EQ(msgpack::type::POSITIVE_INTEGER, obj.type);
  648. EXPECT_EQ(static_cast<uint64_t>(elem), obj.via.u64);
  649. }
  650. // User defined inheriting classes
  651. struct top {
  652. int t;
  653. MSGPACK_DEFINE(t);
  654. };
  655. struct mid1 : top {
  656. int m1;
  657. MSGPACK_DEFINE(MSGPACK_BASE(top), m1);
  658. };
  659. struct mid2 : top {
  660. int m2;
  661. MSGPACK_DEFINE(m2, MSGPACK_BASE(top));
  662. };
  663. struct bottom : mid1, mid2 {
  664. int b;
  665. MSGPACK_DEFINE(MSGPACK_BASE(mid1), MSGPACK_BASE(mid2), b);
  666. };
  667. TEST(object_with_zone, user_defined_non_virtual)
  668. {
  669. bottom b;
  670. b.b = 1;
  671. b.m1 = 2;
  672. b.m2 = 3;
  673. b.mid1::t = 4;
  674. b.mid2::t = 5;
  675. msgpack::zone z;
  676. msgpack::object obj(b, z);
  677. #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
  678. #pragma GCC diagnostic push
  679. #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
  680. #endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
  681. bottom br = obj.as<bottom>();
  682. #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
  683. #pragma GCC diagnostic pop
  684. #endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
  685. EXPECT_EQ(b.b, br.b);
  686. EXPECT_EQ(b.m1, br.m1);
  687. EXPECT_EQ(b.m2, br.m2);
  688. EXPECT_EQ(b.mid1::t, br.mid1::t);
  689. EXPECT_EQ(b.mid2::t, br.mid2::t);
  690. }
  691. struct v_top {
  692. int t;
  693. MSGPACK_DEFINE(t);
  694. };
  695. struct v_mid1 : virtual v_top {
  696. int m1;
  697. MSGPACK_DEFINE(m1);
  698. };
  699. struct v_mid2 : virtual v_top {
  700. int m2;
  701. MSGPACK_DEFINE(m2);
  702. };
  703. struct v_bottom : v_mid1, v_mid2 {
  704. int b;
  705. MSGPACK_DEFINE(MSGPACK_BASE(v_mid1), MSGPACK_BASE(v_mid2), MSGPACK_BASE(v_top), b);
  706. };
  707. TEST(object_with_zone, user_defined_virtual)
  708. {
  709. v_bottom b;
  710. b.b = 1;
  711. b.m1 = 2;
  712. b.m2 = 3;
  713. b.t = 4;
  714. msgpack::zone z;
  715. msgpack::object obj(b, z);
  716. #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
  717. #pragma GCC diagnostic push
  718. #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
  719. #endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
  720. v_bottom br = obj.as<v_bottom>();
  721. #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
  722. #pragma GCC diagnostic pop
  723. #endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
  724. EXPECT_EQ(b.b, br.b);
  725. EXPECT_EQ(b.m1, br.m1);
  726. EXPECT_EQ(b.m2, br.m2);
  727. EXPECT_EQ(b.t, br.t);
  728. }
  729. #if !defined(MSGPACK_USE_CPP03)
  730. TEST(object_with_zone, construct_enum_outer_newstyle)
  731. {
  732. msgpack::zone z;
  733. msgpack::object obj(outer_enum::enum_test::elem, z);
  734. EXPECT_EQ(msgpack::type::POSITIVE_INTEGER, obj.type);
  735. EXPECT_EQ(elem, obj.via.u64);
  736. }
  737. TEST(object_with_zone, construct_class_enum)
  738. {
  739. msgpack::zone z;
  740. msgpack::object obj(enum_class_test::elem, z);
  741. EXPECT_EQ(msgpack::type::POSITIVE_INTEGER, obj.type);
  742. EXPECT_EQ(elem, obj.via.u64);
  743. }
  744. TEST(object_with_zone, construct_class_enum_outer)
  745. {
  746. msgpack::zone z;
  747. msgpack::object obj(outer_enum_class::enum_class_test::elem, z);
  748. EXPECT_EQ(msgpack::type::POSITIVE_INTEGER, obj.type);
  749. EXPECT_EQ(elem, obj.via.u64);
  750. }
  751. TEST(object_with_zone, array)
  752. {
  753. typedef array<int, kElements> test_t;
  754. for (unsigned int k = 0; k < kLoop; k++) {
  755. test_t v1;
  756. v1[0] = 1;
  757. for (unsigned int i = 1; i < kElements; i++)
  758. v1[i] = rand();
  759. msgpack::zone z;
  760. msgpack::object obj(v1, z);
  761. EXPECT_TRUE(obj.as<test_t>() == v1);
  762. v1.front() = 42;
  763. EXPECT_EQ(obj.as<test_t>().front(), 1);
  764. }
  765. }
  766. TEST(object_with_zone, array_char)
  767. {
  768. typedef array<char, kElements> test_t;
  769. for (unsigned int k = 0; k < kLoop; k++) {
  770. test_t v1;
  771. v1[0] = 1;
  772. for (unsigned int i = 1; i < kElements; i++)
  773. v1[i] = rand();
  774. msgpack::zone z;
  775. msgpack::object obj(v1, z);
  776. EXPECT_TRUE(obj.as<test_t>() == v1);
  777. v1.front() = 42;
  778. EXPECT_EQ(obj.as<test_t>().front(), 1);
  779. }
  780. }
  781. TEST(object_without_zone, array_char)
  782. {
  783. typedef array<char, kElements> test_t;
  784. for (unsigned int k = 0; k < kLoop; k++) {
  785. test_t v1;
  786. v1[0] = 1;
  787. for (unsigned int i = 1; i < kElements; i++)
  788. v1[i] = rand();
  789. msgpack::object obj(v1);
  790. EXPECT_TRUE(obj.as<test_t>() == v1);
  791. v1.front() = 42;
  792. // obj refer to v1
  793. EXPECT_EQ(obj.as<test_t>().front(), 42);
  794. }
  795. }
  796. TEST(object_with_zone, array_unsigned_char)
  797. {
  798. if (!msgpack::is_same<uint8_t, unsigned char>::value) return;
  799. typedef array<unsigned char, kElements> test_t;
  800. for (unsigned int k = 0; k < kLoop; k++) {
  801. test_t v1;
  802. v1[0] = 1;
  803. for (unsigned int i = 1; i < kElements; i++)
  804. v1[i] = rand();
  805. msgpack::zone z;
  806. msgpack::object obj(v1, z);
  807. EXPECT_TRUE(obj.as<test_t>() == v1);
  808. v1.front() = 42;
  809. EXPECT_EQ(obj.as<test_t>().front(), 1);
  810. }
  811. }
  812. TEST(object_without_zone, array_unsigned_char)
  813. {
  814. if (!msgpack::is_same<uint8_t, unsigned char>::value) return;
  815. typedef array<unsigned char, kElements> test_t;
  816. for (unsigned int k = 0; k < kLoop; k++) {
  817. test_t v1;
  818. v1[0] = 1;
  819. for (unsigned int i = 1; i < kElements; i++)
  820. v1[i] = rand();
  821. msgpack::object obj(v1);
  822. EXPECT_TRUE(obj.as<test_t>() == v1);
  823. v1.front() = 42;
  824. // obj refer to v1
  825. EXPECT_EQ(obj.as<test_t>().front(), 42);
  826. }
  827. }
  828. TEST(object_with_zone, forward_list)
  829. {
  830. for (unsigned int k = 0; k < kLoop; k++) {
  831. forward_list<int> v1;
  832. for (unsigned int i = 0; i < kElements; i++)
  833. v1.push_front(i);
  834. msgpack::zone z;
  835. msgpack::object obj(v1, z);
  836. EXPECT_TRUE(obj.as<forward_list<int> >() == v1);
  837. v1.front() = 42;
  838. EXPECT_EQ(obj.as<forward_list<int> >().front(), static_cast<int>(kElements - 1));
  839. }
  840. }
  841. TEST(object_with_zone, tuple)
  842. {
  843. typedef tuple<int, string, bool> test_t;
  844. test_t v(1, "abc", true);
  845. msgpack::zone z;
  846. msgpack::object obj(v, z);
  847. EXPECT_TRUE(obj.as<test_t>() == v);
  848. }
  849. TEST(object_with_zone, tuple_empty)
  850. {
  851. typedef tuple<> test_t;
  852. test_t v;
  853. msgpack::zone z;
  854. msgpack::object obj(v, z);
  855. EXPECT_TRUE(obj.as<test_t>() == v);
  856. }
  857. TEST(object_with_zone, system_clock)
  858. {
  859. std::chrono::system_clock::time_point v;
  860. msgpack::zone z;
  861. msgpack::object obj(v, z);
  862. EXPECT_TRUE(obj.as<std::chrono::system_clock::time_point>() == v);
  863. }
  864. TEST(object_with_zone, system_clock_32)
  865. {
  866. std::chrono::system_clock::time_point v(std::chrono::seconds(0x12345678L));
  867. msgpack::zone z;
  868. msgpack::object obj(v, z);
  869. EXPECT_TRUE(obj.as<std::chrono::system_clock::time_point>() == v);
  870. }
  871. TEST(object_with_zone, system_clock_32_max)
  872. {
  873. std::chrono::system_clock::time_point v(std::chrono::seconds(0xffffffffL));
  874. msgpack::zone z;
  875. msgpack::object obj(v, z);
  876. EXPECT_TRUE(obj.as<std::chrono::system_clock::time_point>() == v);
  877. }
  878. TEST(object_with_zone, system_clock_64)
  879. {
  880. std::chrono::system_clock::time_point v(std::chrono::seconds(0x31234567L));
  881. v +=
  882. std::chrono::duration_cast<std::chrono::system_clock::duration>(
  883. std::chrono::nanoseconds(0x312345678L)
  884. );
  885. msgpack::zone z;
  886. msgpack::object obj(v, z);
  887. EXPECT_TRUE(obj.as<std::chrono::system_clock::time_point>() == v);
  888. }
  889. TEST(object_with_zone, system_clock_64_max)
  890. {
  891. std::chrono::system_clock::time_point v(std::chrono::seconds(0xffffffffL));
  892. v +=
  893. std::chrono::duration_cast<std::chrono::system_clock::duration>(
  894. std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999
  895. );
  896. msgpack::zone z;
  897. msgpack::object obj(v, z);
  898. EXPECT_TRUE(obj.as<std::chrono::system_clock::time_point>() == v);
  899. }
  900. TEST(object_with_zone, system_clock_impl_min)
  901. {
  902. std::chrono::system_clock::time_point v(std::chrono::system_clock::time_point::min());
  903. msgpack::zone z;
  904. msgpack::object obj(v, z);
  905. EXPECT_TRUE(obj.as<std::chrono::system_clock::time_point>() == v);
  906. }
  907. TEST(object_with_zone, system_clock_impl_max)
  908. {
  909. std::chrono::system_clock::time_point v(std::chrono::system_clock::time_point::max());
  910. msgpack::zone z;
  911. msgpack::object obj(v, z);
  912. EXPECT_TRUE(obj.as<std::chrono::system_clock::time_point>() == v);
  913. }
  914. #endif // !defined(MSGPACK_USE_CPP03)
  915. TEST(object_with_zone, ext_empty)
  916. {
  917. msgpack::type::ext v;
  918. msgpack::zone z;
  919. msgpack::object obj(v, z);
  920. EXPECT_TRUE(obj.as<msgpack::type::ext>() == v);
  921. EXPECT_TRUE(obj.as<msgpack::type::ext_ref>() == v);
  922. }
  923. TEST(object_with_zone, ext)
  924. {
  925. msgpack::type::ext v(42, 10);
  926. for (int i = 0; i < 10; ++i) v.data()[i] = i;
  927. msgpack::zone z;
  928. msgpack::object obj(v, z);
  929. EXPECT_TRUE(obj.as<msgpack::type::ext>() == v);
  930. EXPECT_TRUE(obj.as<msgpack::type::ext_ref>() == v);
  931. }
  932. TEST(object_with_zone, ext_from_buf)
  933. {
  934. char const buf[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  935. msgpack::type::ext v(42, buf, sizeof(buf));
  936. msgpack::zone z;
  937. msgpack::object obj(v, z);
  938. EXPECT_TRUE(obj.as<msgpack::type::ext>() == v);
  939. EXPECT_TRUE(obj.as<msgpack::type::ext_ref>() == v);
  940. }
  941. TEST(object_with_zone, ext_ref_empty)
  942. {
  943. msgpack::type::ext_ref v;
  944. msgpack::zone z;
  945. msgpack::object obj(v, z);
  946. EXPECT_TRUE(obj.as<msgpack::type::ext>() == v);
  947. EXPECT_TRUE(obj.as<msgpack::type::ext_ref>() == v);
  948. }
  949. TEST(object_with_zone, ext_ref_from_buf)
  950. {
  951. char const buf[] = { 77, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  952. msgpack::type::ext_ref v(buf, sizeof(buf));
  953. msgpack::zone z;
  954. msgpack::object obj(v, z);
  955. EXPECT_TRUE(obj.as<msgpack::type::ext>() == v);
  956. EXPECT_TRUE(obj.as<msgpack::type::ext_ref>() == v);
  957. }