boost_variant.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. #include <cmath>
  2. #include <msgpack.hpp>
  3. #include <sstream>
  4. #include <iterator>
  5. #include <gtest/gtest.h>
  6. #ifdef HAVE_CONFIG_H
  7. #include "config.h"
  8. #endif
  9. #if defined(MSGPACK_USE_BOOST)
  10. const double kEPS = 1e-10;
  11. // nil
  12. TEST(MSGPACK_BOOST, pack_convert_variant_nil)
  13. {
  14. std::stringstream ss;
  15. msgpack::type::variant val1 = msgpack::type::nil_t();
  16. EXPECT_TRUE(val1.is_nil());
  17. msgpack::pack(ss, val1);
  18. msgpack::object_handle oh =
  19. msgpack::unpack(ss.str().data(), ss.str().size());
  20. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  21. EXPECT_TRUE(val2.is_nil());
  22. EXPECT_NO_THROW(boost::get<msgpack::type::nil_t>(val2));
  23. }
  24. TEST(MSGPACK_BOOST, object_variant_nil)
  25. {
  26. msgpack::type::variant val1 = msgpack::type::nil_t();
  27. EXPECT_TRUE(val1.is_nil());
  28. msgpack::object obj(val1);
  29. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  30. EXPECT_TRUE(val2.is_nil());
  31. EXPECT_NO_THROW(boost::get<msgpack::type::nil_t>(val2));
  32. }
  33. TEST(MSGPACK_BOOST, object_with_zone_variant_nil)
  34. {
  35. msgpack::zone z;
  36. msgpack::type::variant val1 = msgpack::type::nil_t();
  37. EXPECT_TRUE(val1.is_nil());
  38. msgpack::object obj(val1, z);
  39. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  40. EXPECT_TRUE(val2.is_nil());
  41. EXPECT_NO_THROW(boost::get<msgpack::type::nil_t>(val2));
  42. }
  43. // nil (default constructor)
  44. TEST(MSGPACK_BOOST, pack_convert_variant_nil_default)
  45. {
  46. std::stringstream ss;
  47. msgpack::type::variant val1;
  48. EXPECT_TRUE(val1.is_nil());
  49. msgpack::pack(ss, val1);
  50. msgpack::object_handle oh =
  51. msgpack::unpack(ss.str().data(), ss.str().size());
  52. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  53. EXPECT_TRUE(val2.is_nil());
  54. EXPECT_NO_THROW(boost::get<msgpack::type::nil_t>(val2));
  55. }
  56. TEST(MSGPACK_BOOST, object_variant_nil_default)
  57. {
  58. msgpack::type::variant val1;
  59. EXPECT_TRUE(val1.is_nil());
  60. msgpack::object obj(val1);
  61. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  62. EXPECT_TRUE(val2.is_nil());
  63. EXPECT_NO_THROW(boost::get<msgpack::type::nil_t>(val2));
  64. }
  65. TEST(MSGPACK_BOOST, object_with_zone_variant_nil_default)
  66. {
  67. msgpack::zone z;
  68. msgpack::type::variant val1;
  69. EXPECT_TRUE(val1.is_nil());
  70. msgpack::object obj(val1, z);
  71. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  72. EXPECT_TRUE(val2.is_nil());
  73. EXPECT_NO_THROW(boost::get<msgpack::type::nil_t>(val2));
  74. }
  75. // bool
  76. TEST(MSGPACK_BOOST, pack_convert_variant_bool)
  77. {
  78. std::stringstream ss;
  79. msgpack::type::variant val1 = true;
  80. EXPECT_TRUE(val1.is_bool());
  81. EXPECT_TRUE(val1.as_bool());
  82. msgpack::pack(ss, val1);
  83. msgpack::object_handle oh =
  84. msgpack::unpack(ss.str().data(), ss.str().size());
  85. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  86. EXPECT_TRUE(val2.is_bool());
  87. EXPECT_TRUE(val2.as_bool());
  88. EXPECT_NO_THROW(boost::get<bool>(val2));
  89. EXPECT_TRUE(val1 == val2);
  90. // Tests for totally ordered
  91. EXPECT_FALSE(val1 != val2);
  92. EXPECT_FALSE(val1 < val2);
  93. EXPECT_FALSE(val1 > val2);
  94. EXPECT_TRUE(val1 <= val2);
  95. EXPECT_TRUE(val1 >= val2);
  96. }
  97. TEST(MSGPACK_BOOST, object_variant_bool)
  98. {
  99. msgpack::type::variant val1 = true;
  100. EXPECT_TRUE(val1.is_bool());
  101. EXPECT_TRUE(val1.as_bool());
  102. msgpack::object obj(val1);
  103. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  104. EXPECT_TRUE(val2.is_bool());
  105. EXPECT_TRUE(val2.as_bool());
  106. EXPECT_NO_THROW(boost::get<bool>(val2));
  107. EXPECT_TRUE(val1 == val2);
  108. }
  109. TEST(MSGPACK_BOOST, object_with_zone_variant_bool)
  110. {
  111. msgpack::zone z;
  112. msgpack::type::variant val1 = true;
  113. EXPECT_TRUE(val1.is_bool());
  114. EXPECT_TRUE(val1.as_bool());
  115. msgpack::object obj(val1, z);
  116. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  117. EXPECT_TRUE(val2.is_bool());
  118. EXPECT_TRUE(val2.as_bool());
  119. EXPECT_NO_THROW(boost::get<bool>(val2));
  120. EXPECT_TRUE(val1 == val2);
  121. }
  122. // positive integer
  123. TEST(MSGPACK_BOOST, pack_convert_variant_positive_integer)
  124. {
  125. std::stringstream ss;
  126. msgpack::type::variant val1 = 123;
  127. EXPECT_TRUE(val1.is_uint64_t());
  128. EXPECT_EQ(val1.as_uint64_t(), 123U);
  129. msgpack::pack(ss, val1);
  130. msgpack::object_handle oh =
  131. msgpack::unpack(ss.str().data(), ss.str().size());
  132. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  133. EXPECT_TRUE(val2.is_uint64_t());
  134. EXPECT_EQ(val2.as_uint64_t(), 123U);
  135. EXPECT_NO_THROW(boost::get<uint64_t>(val2));
  136. EXPECT_TRUE(val1 == val2);
  137. }
  138. TEST(MSGPACK_BOOST, object_variant_positive_integer)
  139. {
  140. msgpack::type::variant val1 = 123;
  141. EXPECT_TRUE(val1.is_uint64_t());
  142. EXPECT_EQ(val1.as_uint64_t(), 123U);
  143. msgpack::object obj(val1);
  144. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  145. EXPECT_TRUE(val2.is_uint64_t());
  146. EXPECT_EQ(val2.as_uint64_t(), 123U);
  147. EXPECT_NO_THROW(boost::get<uint64_t>(val2));
  148. EXPECT_TRUE(val1 == val2);
  149. }
  150. TEST(MSGPACK_BOOST, object_with_zone_variant_positive_integer)
  151. {
  152. msgpack::zone z;
  153. msgpack::type::variant val1 = 123;
  154. EXPECT_TRUE(val1.is_uint64_t());
  155. EXPECT_EQ(val1.as_uint64_t(), 123U);
  156. msgpack::object obj(val1, z);
  157. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  158. EXPECT_TRUE(val2.is_uint64_t());
  159. EXPECT_EQ(val2.as_uint64_t(), 123U);
  160. EXPECT_NO_THROW(boost::get<uint64_t>(val2));
  161. EXPECT_TRUE(val1 == val2);
  162. }
  163. // negative integer
  164. TEST(MSGPACK_BOOST, pack_convert_variant_negative_integer)
  165. {
  166. std::stringstream ss;
  167. msgpack::type::variant val1 = -123;
  168. EXPECT_TRUE(val1.is_int64_t());
  169. EXPECT_EQ(val1.as_int64_t(), -123);
  170. msgpack::pack(ss, val1);
  171. msgpack::object_handle oh =
  172. msgpack::unpack(ss.str().data(), ss.str().size());
  173. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  174. EXPECT_TRUE(val2.is_int64_t());
  175. EXPECT_EQ(val2.as_int64_t(), -123);
  176. EXPECT_NO_THROW(boost::get<int64_t>(val2));
  177. EXPECT_TRUE(val1 == val2);
  178. }
  179. TEST(MSGPACK_BOOST, object_variant_negative_integer)
  180. {
  181. msgpack::type::variant val1 = -123;
  182. EXPECT_TRUE(val1.is_int64_t());
  183. EXPECT_EQ(val1.as_int64_t(), -123);
  184. msgpack::object obj(val1);
  185. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  186. EXPECT_TRUE(val2.is_int64_t());
  187. EXPECT_EQ(val2.as_int64_t(), -123);
  188. EXPECT_NO_THROW(boost::get<int64_t>(val2));
  189. EXPECT_TRUE(val1 == val2);
  190. }
  191. TEST(MSGPACK_BOOST, object_with_zone_variant_negative_integer)
  192. {
  193. msgpack::zone z;
  194. msgpack::type::variant val1 = -123;
  195. EXPECT_TRUE(val1.is_int64_t());
  196. EXPECT_EQ(val1.as_int64_t(), -123);
  197. msgpack::object obj(val1, z);
  198. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  199. EXPECT_TRUE(val2.is_int64_t());
  200. EXPECT_EQ(val2.as_int64_t(), -123);
  201. EXPECT_NO_THROW(boost::get<int64_t>(val2));
  202. EXPECT_TRUE(val1 == val2);
  203. }
  204. // float
  205. TEST(MSGPACK_BOOST, pack_convert_variant_float)
  206. {
  207. std::stringstream ss;
  208. msgpack::type::variant val1 = 12.34;
  209. EXPECT_TRUE(val1.is_double());
  210. EXPECT_TRUE(fabs(12.34 - val1.as_double()) <= kEPS);
  211. msgpack::pack(ss, val1);
  212. msgpack::object_handle oh =
  213. msgpack::unpack(ss.str().data(), ss.str().size());
  214. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  215. EXPECT_TRUE(val2.is_double());
  216. EXPECT_TRUE(fabs(12.34 - val2.as_double()) <= kEPS);
  217. EXPECT_NO_THROW(boost::get<double>(val2));
  218. EXPECT_TRUE(fabs(val2.as_double() - val2.as_double()) <= kEPS);
  219. }
  220. TEST(MSGPACK_BOOST, object_variant_float)
  221. {
  222. msgpack::type::variant val1 = 12.34;
  223. EXPECT_TRUE(val1.is_double());
  224. EXPECT_TRUE(fabs(12.34 - val1.as_double()) <= kEPS);
  225. msgpack::object obj(val1);
  226. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  227. EXPECT_TRUE(val2.is_double());
  228. EXPECT_TRUE(fabs(12.34 - val2.as_double()) <= kEPS);
  229. EXPECT_NO_THROW(boost::get<double>(val2));
  230. EXPECT_TRUE(fabs(val2.as_double() - val2.as_double()) <= kEPS);
  231. }
  232. TEST(MSGPACK_BOOST, object_with_zone_variant_float)
  233. {
  234. msgpack::zone z;
  235. msgpack::type::variant val1 = 12.34;
  236. EXPECT_TRUE(val1.is_double());
  237. EXPECT_TRUE(fabs(12.34 - val1.as_double()) <= kEPS);
  238. msgpack::object obj(val1, z);
  239. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  240. EXPECT_TRUE(val2.is_double());
  241. EXPECT_TRUE(fabs(12.34 - val2.as_double()) <= kEPS);
  242. EXPECT_NO_THROW(boost::get<double>(val2));
  243. EXPECT_TRUE(fabs(val2.as_double() - val2.as_double()) <= kEPS);
  244. }
  245. // str
  246. TEST(MSGPACK_BOOST, pack_convert_variant_str)
  247. {
  248. std::stringstream ss;
  249. msgpack::type::variant val1 = "ABC";
  250. EXPECT_TRUE(val1.is_string());
  251. EXPECT_EQ(val1.as_string(), "ABC");
  252. msgpack::pack(ss, val1);
  253. msgpack::object_handle oh =
  254. msgpack::unpack(ss.str().data(), ss.str().size());
  255. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  256. EXPECT_TRUE(val2.is_string());
  257. EXPECT_EQ(val2.as_string(), "ABC");
  258. EXPECT_NO_THROW(boost::get<std::string>(val2));
  259. EXPECT_TRUE(val1 == val2);
  260. }
  261. TEST(MSGPACK_BOOST, object_with_zone_variant_str)
  262. {
  263. msgpack::zone z;
  264. msgpack::type::variant val1 = "ABC";
  265. EXPECT_TRUE(val1.is_string());
  266. EXPECT_EQ(val1.as_string(), "ABC");
  267. msgpack::object obj(val1, z);
  268. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  269. EXPECT_TRUE(val2.is_string());
  270. EXPECT_EQ(val2.as_string(), "ABC");
  271. EXPECT_NO_THROW(boost::get<std::string>(val2));
  272. EXPECT_TRUE(val1 == val2);
  273. }
  274. #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  275. TEST(MSGPACK_BOOST, object_with_zone_variant_str_ref)
  276. {
  277. // You can use boost::string_ref with msgpack::type::variant.
  278. msgpack::zone z;
  279. std::string s = "ABC";
  280. boost::string_ref sr(s);
  281. msgpack::type::variant val1(sr);
  282. EXPECT_TRUE(val1.is_boost_string_ref());
  283. EXPECT_EQ(val1.as_boost_string_ref(), "ABC");
  284. msgpack::object obj(val1, z);
  285. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  286. // Converted as std::string.
  287. EXPECT_TRUE(val2.is_string());
  288. EXPECT_EQ(val2.as_string(), "ABC");
  289. EXPECT_NO_THROW(boost::get<std::string>(val2));
  290. // boost::string_ref and std::string are different.
  291. EXPECT_FALSE(val1 == val2);
  292. }
  293. #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  294. // bin
  295. TEST(MSGPACK_BOOST, pack_convert_variant_bin)
  296. {
  297. std::stringstream ss;
  298. std::vector<char> v;
  299. v.push_back('a');
  300. v.push_back('b');
  301. v.push_back('c');
  302. msgpack::type::variant val1 = v;
  303. EXPECT_TRUE(val1.is_vector_char());
  304. EXPECT_EQ(val1.as_vector_char(), v);
  305. msgpack::pack(ss, val1);
  306. msgpack::object_handle oh =
  307. msgpack::unpack(ss.str().data(), ss.str().size());
  308. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  309. EXPECT_TRUE(val2.is_vector_char());
  310. EXPECT_EQ(val2.as_vector_char(), v);
  311. EXPECT_NO_THROW(boost::get<std::vector<char> >(val2));
  312. EXPECT_TRUE(val1 == val2);
  313. }
  314. TEST(MSGPACK_BOOST, object_with_zone_variant_bin)
  315. {
  316. msgpack::zone z;
  317. std::vector<char> v;
  318. v.push_back('a');
  319. v.push_back('b');
  320. v.push_back('c');
  321. msgpack::type::variant val1 = v;
  322. EXPECT_TRUE(val1.is_vector_char());
  323. EXPECT_EQ(val1.as_vector_char(), v);
  324. msgpack::object obj(val1, z);
  325. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  326. EXPECT_TRUE(val2.is_vector_char());
  327. EXPECT_EQ(val2.as_vector_char(), v);
  328. EXPECT_NO_THROW(boost::get<std::vector<char> >(val2));
  329. EXPECT_TRUE(val1 == val2);
  330. }
  331. #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  332. TEST(MSGPACK_BOOST, object_with_zone_variant_raw_ref)
  333. {
  334. // You can use boost::string_ref with msgpack::type::variant.
  335. msgpack::zone z;
  336. std::vector<char> v;
  337. v.push_back('a');
  338. v.push_back('b');
  339. v.push_back('c');
  340. msgpack::type::raw_ref rr(&v.front(), v.size());
  341. msgpack::type::variant val1 = rr;
  342. EXPECT_TRUE(val1.is_raw_ref());
  343. EXPECT_EQ(val1.as_raw_ref(), msgpack::type::raw_ref(&v.front(), v.size()));
  344. msgpack::object obj(val1, z);
  345. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  346. // Converted as std::vector<char>.
  347. EXPECT_TRUE(val2.is_vector_char());
  348. EXPECT_EQ(val2.as_vector_char(), v);
  349. EXPECT_NO_THROW(boost::get<std::vector<char> >(val2));
  350. // msgpack::type::raw_ref and std::vector<char> are different.
  351. EXPECT_FALSE(val1 == val2);
  352. }
  353. #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  354. // ext
  355. TEST(MSGPACK_BOOST, pack_convert_variant_ext)
  356. {
  357. std::stringstream ss;
  358. std::vector<char> v;
  359. v.push_back('a');
  360. v.push_back('b');
  361. v.push_back('c');
  362. msgpack::type::ext e(42, v.data(), v.size());
  363. msgpack::type::variant val1(e);
  364. EXPECT_TRUE(val1.is_ext());
  365. EXPECT_EQ(val1.as_ext(), e);
  366. msgpack::pack(ss, val1);
  367. msgpack::object_handle oh =
  368. msgpack::unpack(ss.str().data(), ss.str().size());
  369. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  370. EXPECT_TRUE(val2.is_ext());
  371. EXPECT_EQ(val2.as_ext(), e);
  372. EXPECT_NO_THROW(boost::get<msgpack::type::ext>(val2));
  373. EXPECT_TRUE(val1 == val2);
  374. }
  375. TEST(MSGPACK_BOOST, object_with_zone_variant_ext)
  376. {
  377. msgpack::zone z;
  378. std::vector<char> v;
  379. v.push_back('a');
  380. v.push_back('b');
  381. v.push_back('c');
  382. msgpack::type::ext e(42, v.data(), v.size());
  383. msgpack::type::variant val1(e);
  384. EXPECT_TRUE(val1.is_ext());
  385. EXPECT_EQ(val1.as_ext(), e);
  386. msgpack::object obj(val1, z);
  387. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  388. EXPECT_TRUE(val2.is_ext());
  389. EXPECT_EQ(val2.as_ext(), e);
  390. EXPECT_NO_THROW(boost::get<msgpack::type::ext>(val2));
  391. EXPECT_TRUE(val1 == val2);
  392. }
  393. TEST(MSGPACK_BOOST, object_with_zone_variant_ext_ref)
  394. {
  395. // You can use msgpack::type::ext_ref with msgpack::type::variant.
  396. msgpack::zone z;
  397. std::vector<char> v;
  398. v.push_back('a');
  399. v.push_back('b');
  400. v.push_back('c');
  401. msgpack::type::ext_ref e(v.data(), v.size());
  402. msgpack::type::variant val1(e);
  403. EXPECT_TRUE(val1.is_ext_ref());
  404. EXPECT_EQ(val1.as_ext_ref(), e);
  405. msgpack::object obj(val1, z);
  406. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  407. // Converted as msgpack::type::ext.
  408. EXPECT_TRUE(val2.is_ext());
  409. EXPECT_EQ(val2.as_ext(), e);
  410. EXPECT_NO_THROW(boost::get<msgpack::type::ext>(val2));
  411. // msgpack::type::ext_ref and msgpack::type::ext are different.
  412. EXPECT_FALSE(val1 == val2);
  413. }
  414. // array
  415. TEST(MSGPACK_BOOST, pack_convert_variant_array)
  416. {
  417. std::stringstream ss;
  418. std::vector<msgpack::type::variant> v;
  419. v.push_back(msgpack::type::variant(1));
  420. v.push_back(msgpack::type::variant(-1));
  421. v.push_back(msgpack::type::variant("ABC"));
  422. msgpack::type::variant val1 = v;
  423. EXPECT_TRUE(val1.is_vector());
  424. EXPECT_EQ(val1.as_vector(), v);
  425. msgpack::pack(ss, val1);
  426. msgpack::object_handle oh =
  427. msgpack::unpack(ss.str().data(), ss.str().size());
  428. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  429. EXPECT_TRUE(val2.is_vector());
  430. EXPECT_EQ(val2.as_vector(), v);
  431. EXPECT_NO_THROW(boost::get<std::vector<msgpack::type::variant> >(val2));
  432. EXPECT_TRUE(val1 == val2);
  433. }
  434. TEST(MSGPACK_BOOST, object_with_zone_variant_array)
  435. {
  436. msgpack::zone z;
  437. std::vector<msgpack::type::variant> v;
  438. v.push_back(msgpack::type::variant(1));
  439. v.push_back(msgpack::type::variant(-1));
  440. v.push_back(msgpack::type::variant("ABC"));
  441. msgpack::type::variant val1 = v;
  442. EXPECT_TRUE(val1.is_vector());
  443. EXPECT_EQ(val1.as_vector(), v);
  444. msgpack::object obj(val1, z);
  445. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  446. EXPECT_TRUE(val2.is_vector());
  447. EXPECT_EQ(val2.as_vector(), v);
  448. EXPECT_NO_THROW(boost::get<std::vector<msgpack::type::variant> >(val2));
  449. EXPECT_TRUE(val1 == val2);
  450. }
  451. // multimap
  452. TEST(MSGPACK_BOOST, pack_convert_variant_map)
  453. {
  454. std::stringstream ss;
  455. typedef std::multimap<msgpack::type::variant, msgpack::type::variant> multimap_t;
  456. multimap_t v;
  457. v.insert(multimap_t::value_type(msgpack::type::variant(1), msgpack::type::variant(-1)));
  458. v.insert(multimap_t::value_type(msgpack::type::variant("ABC"), msgpack::type::variant("DEF")));
  459. msgpack::type::variant val1 = v;
  460. EXPECT_TRUE(val1.is_multimap());
  461. EXPECT_EQ(val1.as_multimap(), v);
  462. msgpack::pack(ss, val1);
  463. msgpack::object_handle oh =
  464. msgpack::unpack(ss.str().data(), ss.str().size());
  465. msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
  466. EXPECT_TRUE(val2.is_multimap());
  467. EXPECT_EQ(val2.as_multimap(), v);
  468. EXPECT_NO_THROW(boost::get<multimap_t>(val2));
  469. EXPECT_TRUE(val1 == val2);
  470. }
  471. TEST(MSGPACK_BOOST, object_with_zone_variant_map)
  472. {
  473. msgpack::zone z;
  474. typedef std::multimap<msgpack::type::variant, msgpack::type::variant> multimap_t;
  475. multimap_t v;
  476. v.insert(multimap_t::value_type(msgpack::type::variant(1), msgpack::type::variant(-1)));
  477. v.insert(multimap_t::value_type(msgpack::type::variant("ABC"), msgpack::type::variant("DEF")));
  478. msgpack::type::variant val1 = v;
  479. EXPECT_TRUE(val1.is_multimap());
  480. EXPECT_EQ(val1.as_multimap(), v);
  481. msgpack::object obj(val1, z);
  482. msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
  483. EXPECT_TRUE(val2.is_multimap());
  484. EXPECT_EQ(val2.as_multimap(), v);
  485. EXPECT_NO_THROW(boost::get<multimap_t>(val2));
  486. EXPECT_TRUE(val1 == val2);
  487. }
  488. // variant_ref
  489. // str
  490. #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  491. TEST(MSGPACK_BOOST, pack_convert_variant_ref_str)
  492. {
  493. std::stringstream ss;
  494. std::string s("ABC");
  495. boost::string_ref sr(s);
  496. msgpack::type::variant_ref val1 = sr;
  497. EXPECT_TRUE(val1.is_boost_string_ref());
  498. EXPECT_EQ(val1.as_boost_string_ref(), sr);
  499. msgpack::pack(ss, val1);
  500. msgpack::object_handle oh =
  501. msgpack::unpack(ss.str().data(), ss.str().size());
  502. msgpack::type::variant_ref val2 = oh.get().as<msgpack::type::variant_ref>();
  503. EXPECT_TRUE(val2.is_boost_string_ref());
  504. EXPECT_EQ(val2.as_boost_string_ref(), sr);
  505. EXPECT_NO_THROW(boost::get<boost::string_ref>(val2));
  506. EXPECT_TRUE(val1 == val2);
  507. }
  508. TEST(MSGPACK_BOOST, object_with_zone_variant_ref_str)
  509. {
  510. msgpack::zone z;
  511. std::string s("ABC");
  512. boost::string_ref sr(s);
  513. msgpack::type::variant_ref val1 = sr;
  514. EXPECT_TRUE(val1.is_boost_string_ref());
  515. EXPECT_EQ(val1.as_boost_string_ref(), sr);
  516. msgpack::object obj(val1, z);
  517. msgpack::type::variant_ref val2 = obj.as<msgpack::type::variant_ref>();
  518. EXPECT_TRUE(val2.is_boost_string_ref());
  519. EXPECT_EQ(val2.as_boost_string_ref(), sr);
  520. EXPECT_NO_THROW(boost::get<boost::string_ref>(val2));
  521. EXPECT_TRUE(val1 == val2);
  522. }
  523. #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  524. // bin
  525. TEST(MSGPACK_BOOST, pack_convert_variant_ref_bin)
  526. {
  527. std::stringstream ss;
  528. std::vector<char> v;
  529. v.push_back('a');
  530. v.push_back('b');
  531. v.push_back('c');
  532. msgpack::type::raw_ref rr(v.data(), v.size());
  533. msgpack::type::variant_ref val1 = rr;
  534. EXPECT_TRUE(val1.is_raw_ref());
  535. EXPECT_EQ(val1.as_raw_ref(), rr);
  536. msgpack::pack(ss, val1);
  537. msgpack::object_handle oh =
  538. msgpack::unpack(ss.str().data(), ss.str().size());
  539. msgpack::type::variant_ref val2 = oh.get().as<msgpack::type::variant_ref>();
  540. EXPECT_TRUE(val2.is_raw_ref());
  541. EXPECT_EQ(val2.as_raw_ref(), rr);
  542. EXPECT_NO_THROW(boost::get<msgpack::type::raw_ref>(val2));
  543. EXPECT_TRUE(val1 == val2);
  544. }
  545. TEST(MSGPACK_BOOST, object_with_zone_variant_ref_bin)
  546. {
  547. msgpack::zone z;
  548. std::vector<char> v;
  549. v.push_back('a');
  550. v.push_back('b');
  551. v.push_back('c');
  552. msgpack::type::raw_ref rr(v.data(), v.size());
  553. msgpack::type::variant_ref val1 = rr;
  554. EXPECT_TRUE(val1.is_raw_ref());
  555. EXPECT_EQ(val1.as_raw_ref(), rr);
  556. msgpack::object obj(val1, z);
  557. msgpack::type::variant_ref val2 = obj.as<msgpack::type::variant_ref>();
  558. EXPECT_TRUE(val2.is_raw_ref());
  559. EXPECT_EQ(val2.as_raw_ref(), rr);
  560. EXPECT_NO_THROW(boost::get<msgpack::type::raw_ref>(val2));
  561. EXPECT_TRUE(val1 == val2);
  562. }
  563. // ext
  564. TEST(MSGPACK_BOOST, pack_convert_variant_ref_ext)
  565. {
  566. std::stringstream ss;
  567. std::vector<char> v;
  568. v.push_back(static_cast<char>(42));
  569. v.push_back('a');
  570. v.push_back('b');
  571. v.push_back('c');
  572. msgpack::type::ext_ref er(v.data(), v.size());
  573. msgpack::type::variant_ref val1(er);
  574. EXPECT_TRUE(val1.is_ext_ref());
  575. EXPECT_EQ(val1.as_ext_ref(), er);
  576. msgpack::pack(ss, val1);
  577. msgpack::object_handle oh =
  578. msgpack::unpack(ss.str().data(), ss.str().size());
  579. msgpack::type::variant_ref val2 = oh.get().as<msgpack::type::variant_ref>();
  580. EXPECT_NO_THROW(boost::get<msgpack::type::ext_ref>(val2));
  581. EXPECT_TRUE(val2.is_ext_ref());
  582. EXPECT_EQ(val2.as_ext_ref(), er);
  583. EXPECT_TRUE(val1 == val2);
  584. }
  585. TEST(MSGPACK_BOOST, object_with_zone_variant_ref_ext)
  586. {
  587. msgpack::zone z;
  588. std::vector<char> v;
  589. v.push_back(static_cast<char>(42));
  590. v.push_back('a');
  591. v.push_back('b');
  592. v.push_back('c');
  593. msgpack::type::ext_ref er(v.data(), v.size());
  594. msgpack::type::variant_ref val1(er);
  595. EXPECT_TRUE(val1.is_ext_ref());
  596. EXPECT_EQ(val1.as_ext_ref(), er);
  597. msgpack::object obj(val1, z);
  598. msgpack::type::variant_ref val2 = obj.as<msgpack::type::variant_ref>();
  599. EXPECT_TRUE(val2.is_ext_ref());
  600. EXPECT_EQ(val2.as_ext_ref(), er);
  601. EXPECT_NO_THROW(boost::get<msgpack::type::ext_ref>(val2));
  602. EXPECT_TRUE(val1 == val2);
  603. }
  604. // array
  605. TEST(MSGPACK_BOOST, pack_convert_variant_ref_array)
  606. {
  607. std::stringstream ss;
  608. std::vector<msgpack::type::variant_ref> v;
  609. v.push_back(msgpack::type::variant_ref(1));
  610. v.push_back(msgpack::type::variant_ref(-1));
  611. std::string s("ABC");
  612. #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  613. v.push_back(msgpack::type::variant_ref(boost::string_ref(s)));
  614. #else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  615. v.push_back(msgpack::type::variant_ref(s));
  616. #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  617. msgpack::type::variant_ref val1 = v;
  618. EXPECT_TRUE(val1.is_vector());
  619. EXPECT_EQ(val1.as_vector(), v);
  620. msgpack::pack(ss, val1);
  621. msgpack::object_handle oh =
  622. msgpack::unpack(ss.str().data(), ss.str().size());
  623. msgpack::type::variant_ref val2 = oh.get().as<msgpack::type::variant_ref>();
  624. EXPECT_TRUE(val2.is_vector());
  625. EXPECT_EQ(val2.as_vector(), v);
  626. EXPECT_NO_THROW(boost::get<std::vector<msgpack::type::variant_ref> >(val2));
  627. EXPECT_TRUE(val1 == val2);
  628. }
  629. TEST(MSGPACK_BOOST, object_with_zone_variant_ref_array)
  630. {
  631. msgpack::zone z;
  632. std::vector<msgpack::type::variant_ref> v;
  633. v.push_back(msgpack::type::variant_ref(1));
  634. v.push_back(msgpack::type::variant_ref(-1));
  635. std::string s("ABC");
  636. #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  637. v.push_back(msgpack::type::variant_ref(boost::string_ref(s)));
  638. #else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  639. v.push_back(msgpack::type::variant_ref(s));
  640. #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  641. msgpack::type::variant_ref val1 = v;
  642. EXPECT_TRUE(val1.is_vector());
  643. EXPECT_EQ(val1.as_vector(), v);
  644. msgpack::object obj(val1, z);
  645. msgpack::type::variant_ref val2 = obj.as<msgpack::type::variant_ref>();
  646. EXPECT_TRUE(val2.is_vector());
  647. EXPECT_EQ(val2.as_vector(), v);
  648. EXPECT_NO_THROW(boost::get<std::vector<msgpack::type::variant_ref> >(val2));
  649. EXPECT_TRUE(val1 == val2);
  650. }
  651. // multimap
  652. TEST(MSGPACK_BOOST, pack_convert_variant_ref_map)
  653. {
  654. std::stringstream ss;
  655. typedef std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref> multimap_t;
  656. multimap_t v;
  657. v.insert(multimap_t::value_type(msgpack::type::variant_ref(1), msgpack::type::variant_ref(-1)));
  658. std::string s1("ABC");
  659. std::string s2("DEF");
  660. #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  661. v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), msgpack::type::variant_ref(boost::string_ref(s2))));
  662. #else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  663. v.insert(multimap_t::value_type(msgpack::type::variant_ref(s1), msgpack::type::variant_ref(s2)));
  664. #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  665. msgpack::type::variant_ref val1 = v;
  666. EXPECT_TRUE(val1.is_multimap());
  667. EXPECT_EQ(val1.as_multimap(), v);
  668. msgpack::pack(ss, val1);
  669. msgpack::object_handle oh =
  670. msgpack::unpack(ss.str().data(), ss.str().size());
  671. msgpack::type::variant_ref val2 = oh.get().as<msgpack::type::variant_ref>();
  672. EXPECT_TRUE(val2.is_multimap());
  673. EXPECT_EQ(val2.as_multimap(), v);
  674. EXPECT_NO_THROW(boost::get<multimap_t>(val2));
  675. EXPECT_TRUE(val1 == val2);
  676. }
  677. TEST(MSGPACK_BOOST, object_with_zone_variant_ref_map)
  678. {
  679. msgpack::zone z;
  680. typedef std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref> multimap_t;
  681. multimap_t v;
  682. v.insert(multimap_t::value_type(msgpack::type::variant_ref(1), msgpack::type::variant_ref(-1)));
  683. std::string s1("ABC");
  684. std::string s2("DEF");
  685. #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  686. v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), msgpack::type::variant_ref(boost::string_ref(s2))));
  687. #else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  688. v.insert(multimap_t::value_type(msgpack::type::variant_ref(s1), msgpack::type::variant_ref(s2)));
  689. #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
  690. msgpack::type::variant_ref val1 = v;
  691. EXPECT_TRUE(val1.is_multimap());
  692. EXPECT_EQ(val1.as_multimap(), v);
  693. msgpack::object obj(val1, z);
  694. msgpack::type::variant_ref val2 = obj.as<msgpack::type::variant_ref>();
  695. EXPECT_TRUE(val2.is_multimap());
  696. EXPECT_EQ(val2.as_multimap(), v);
  697. EXPECT_NO_THROW(boost::get<multimap_t>(val2));
  698. EXPECT_TRUE(val1 == val2);
  699. }
  700. #endif // defined(MSGPACK_USE_BOOST)