msgpack_cpp17.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. #include <msgpack.hpp>
  2. #include <gtest/gtest.h>
  3. #ifdef HAVE_CONFIG_H
  4. #include "config.h"
  5. #endif
  6. // To avoid link error
  7. TEST(MSGPACK_CPP17, dummy)
  8. {
  9. }
  10. #if !defined(MSGPACK_USE_CPP03) && __cplusplus >= 201703
  11. // C++17
  12. #if MSGPACK_HAS_INCLUDE(<optional>)
  13. TEST(MSGPACK_CPP17, optional_pack_convert_nil)
  14. {
  15. std::stringstream ss;
  16. std::optional<int> val1;
  17. msgpack::pack(ss, val1);
  18. msgpack::object_handle oh =
  19. msgpack::unpack(ss.str().data(), ss.str().size());
  20. std::optional<int> val2 = oh.get().as<std::optional<int> >();
  21. EXPECT_TRUE(val1 == val2);
  22. }
  23. TEST(MSGPACK_CPP17, optional_pack_convert_int)
  24. {
  25. std::stringstream ss;
  26. std::optional<int> val1 = 1;
  27. msgpack::pack(ss, val1);
  28. msgpack::object_handle oh =
  29. msgpack::unpack(ss.str().data(), ss.str().size());
  30. std::optional<int> val2 = oh.get().as<std::optional<int> >();
  31. EXPECT_TRUE(val1 == val2);
  32. }
  33. TEST(MSGPACK_CPP17, optional_pack_convert_vector)
  34. {
  35. typedef std::optional<std::vector<int> > ovi_t;
  36. std::stringstream ss;
  37. ovi_t val1;
  38. std::vector<int> v;
  39. v.push_back(1);
  40. v.push_back(2);
  41. v.push_back(3);
  42. val1 = v;
  43. msgpack::pack(ss, val1);
  44. msgpack::object_handle oh =
  45. msgpack::unpack(ss.str().data(), ss.str().size());
  46. ovi_t val2 = oh.get().as<ovi_t>();
  47. EXPECT_TRUE(val1 == val2);
  48. }
  49. TEST(MSGPACK_CPP17, optional_pack_convert_vector_optional)
  50. {
  51. typedef std::vector<std::optional<int> > voi_t;
  52. std::stringstream ss;
  53. voi_t val1;
  54. val1.resize(3);
  55. val1[0] = 1;
  56. val1[2] = 3;
  57. msgpack::pack(ss, val1);
  58. msgpack::object_handle oh =
  59. msgpack::unpack(ss.str().data(), ss.str().size());
  60. voi_t val2 = oh.get().as<voi_t>();
  61. EXPECT_TRUE(val1 == val2);
  62. }
  63. TEST(MSGPACK_CPP17, optional_object_nil)
  64. {
  65. std::optional<int> val1;
  66. msgpack::object obj(val1);
  67. std::optional<int> val2 = obj.as<std::optional<int> >();
  68. EXPECT_TRUE(val1 == val2);
  69. }
  70. TEST(MSGPACK_CPP17, optional_object_int)
  71. {
  72. std::optional<int> val1 = 1;
  73. msgpack::object obj(val1);
  74. std::optional<int> val2 = obj.as<std::optional<int> >();
  75. EXPECT_TRUE(val1 == val2);
  76. }
  77. // Compile error as expected
  78. /*
  79. TEST(MSGPACK_CPP17, optional_object_vector)
  80. {
  81. typedef std::optional<std::vector<int> > ovi_t;
  82. ovi_t val1;
  83. std::vector<int> v;
  84. v.push_back(1);
  85. v.push_back(2);
  86. v.push_back(3);
  87. val1 = v;
  88. msgpack::object obj(val1);
  89. ovi_t val2 = obj.as<ovi_t>();
  90. EXPECT_TRUE(val1 == val2);
  91. }
  92. */
  93. TEST(MSGPACK_CPP17, optional_object_with_zone_nil)
  94. {
  95. msgpack::zone z;
  96. std::optional<int> val1;
  97. msgpack::object obj(val1, z);
  98. std::optional<int> val2 = obj.as<std::optional<int> >();
  99. EXPECT_TRUE(val1 == val2);
  100. }
  101. TEST(MSGPACK_CPP17, optional_object_with_zone_int)
  102. {
  103. msgpack::zone z;
  104. std::optional<int> val1 = 1;
  105. msgpack::object obj(val1, z);
  106. std::optional<int> val2 = obj.as<std::optional<int> >();
  107. EXPECT_TRUE(val1 == val2);
  108. }
  109. TEST(MSGPACK_CPP17, optional_object_with_zone_vector_optional)
  110. {
  111. typedef std::vector<std::optional<int> > voi_t;
  112. msgpack::zone z;
  113. voi_t val1;
  114. val1.resize(3);
  115. val1[0] = 1;
  116. val1[2] = 3;
  117. msgpack::object obj(val1, z);
  118. voi_t val2 = obj.as<voi_t>();
  119. EXPECT_TRUE(val1 == val2);
  120. }
  121. struct no_def_con {
  122. no_def_con() = delete;
  123. no_def_con(int i):i(i) {}
  124. int i;
  125. MSGPACK_DEFINE(i);
  126. };
  127. inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) {
  128. return lhs.i == rhs.i;
  129. }
  130. inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) {
  131. return !(lhs == rhs);
  132. }
  133. namespace msgpack {
  134. MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) {
  135. namespace adaptor {
  136. template <>
  137. struct as<no_def_con> {
  138. no_def_con operator()(msgpack::object const& o) const {
  139. if (o.type != msgpack::type::ARRAY) throw msgpack::type_error();
  140. if (o.via.array.size != 1) throw msgpack::type_error();
  141. return no_def_con(o.via.array.ptr[0].as<int>());
  142. }
  143. };
  144. } // adaptor
  145. } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS)
  146. } // msgpack
  147. TEST(MSGPACK_CPP17, optional_pack_convert_no_def_con)
  148. {
  149. std::stringstream ss;
  150. std::optional<no_def_con> val1 = no_def_con(1);
  151. msgpack::pack(ss, val1);
  152. msgpack::object_handle oh =
  153. msgpack::unpack(ss.str().data(), ss.str().size());
  154. std::optional<no_def_con> val2 = oh.get().as<std::optional<no_def_con>>();
  155. EXPECT_TRUE(val1 == val2);
  156. }
  157. #endif // MSGPACK_HAS_INCLUDE(<optional>)
  158. #if MSGPACK_HAS_INCLUDE(<string_view>)
  159. TEST(MSGPACK_CPP17, string_view_pack_convert)
  160. {
  161. std::stringstream ss;
  162. std::string s = "ABC";
  163. std::string_view val1(s);
  164. msgpack::pack(ss, val1);
  165. msgpack::object_handle oh;
  166. msgpack::unpack(oh, ss.str().data(), ss.str().size());
  167. std::string_view val2 = oh.get().as<std::string_view>();
  168. EXPECT_TRUE(val1 == val2);
  169. }
  170. TEST(MSGPACK_CPP17, string_view_object)
  171. {
  172. std::string s = "ABC";
  173. std::string_view val1(s);
  174. msgpack::object obj(val1);
  175. std::string_view val2 = obj.as<std::string_view>();
  176. EXPECT_TRUE(val1 == val2);
  177. }
  178. TEST(MSGPACK_CPP17, string_view_object_with_zone)
  179. {
  180. msgpack::zone z;
  181. std::string s = "ABC";
  182. std::string_view val1(s);
  183. msgpack::object obj(val1, z);
  184. std::string_view val2 = obj.as<std::string_view>();
  185. EXPECT_TRUE(val1 == val2);
  186. }
  187. #endif // MSGPACK_HAS_INCLUDE(<string_view>)
  188. TEST(MSGPACK_CPP17, byte_pack_convert)
  189. {
  190. std::stringstream ss;
  191. std::byte val1{0xff};
  192. msgpack::pack(ss, val1);
  193. msgpack::object_handle oh;
  194. msgpack::unpack(oh, ss.str().data(), ss.str().size());
  195. std::byte val2 = oh.get().as<std::byte>();
  196. EXPECT_EQ(val1, val2);
  197. }
  198. TEST(MSGPACK_CPP17, byte_object)
  199. {
  200. std::byte val1{0x00};
  201. msgpack::object obj(val1);
  202. std::byte val2 = obj.as<std::byte>();
  203. EXPECT_EQ(val1, val2);
  204. }
  205. TEST(MSGPACK_CPP17, byte_object_with_zone)
  206. {
  207. msgpack::zone z;
  208. std::byte val1{80};
  209. msgpack::object obj(val1, z);
  210. std::byte val2 = obj.as<std::byte>();
  211. EXPECT_EQ(val1, val2);
  212. }
  213. TEST(MSGPACK_CPP17, vector_byte_pack_convert)
  214. {
  215. std::stringstream ss;
  216. std::vector<std::byte> val1{
  217. std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff}
  218. };
  219. msgpack::pack(ss, val1);
  220. char packed[] = { char(0xc4), char(0x05), char(0x01), char(0x02), char(0x7f), char(0x80), char(0xff) };
  221. for (size_t i = 0; i != sizeof(packed); ++i) {
  222. EXPECT_EQ(ss.str()[i], packed[i]);
  223. }
  224. msgpack::object_handle oh;
  225. msgpack::unpack(oh, ss.str().data(), ss.str().size());
  226. std::vector<std::byte> val2 = oh.get().as<std::vector<std::byte>>();
  227. EXPECT_EQ(val1, val2);
  228. }
  229. TEST(MSGPACK_CPP17, vector_byte_object)
  230. {
  231. std::vector<std::byte> val1{
  232. std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff}
  233. };
  234. // Caller need to manage val1's lifetime. The Data is not copied.
  235. msgpack::object obj(val1);
  236. std::vector<std::byte> val2 = obj.as<std::vector<std::byte>>();
  237. EXPECT_EQ(val1, val2);
  238. }
  239. TEST(MSGPACK_CPP17, vector_byte_object_with_zone)
  240. {
  241. msgpack::zone z;
  242. std::vector<std::byte> val1{
  243. std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff}
  244. };
  245. msgpack::object obj(val1, z);
  246. std::vector<std::byte> val2 = obj.as<std::vector<std::byte>>();
  247. EXPECT_EQ(val1, val2);
  248. }
  249. TEST(MSGPACK_CPP17, carray_byte_pack_convert)
  250. {
  251. std::stringstream ss;
  252. std::byte val1[] = {
  253. std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff}
  254. };
  255. msgpack::pack(ss, val1);
  256. char packed[] = { char(0xc4), char(0x05), char(0x01), char(0x02), char(0x7f), char(0x80), char(0xff) };
  257. for (size_t i = 0; i != sizeof(packed); ++i) {
  258. EXPECT_EQ(ss.str()[i], packed[i]);
  259. }
  260. msgpack::object_handle oh;
  261. msgpack::unpack(oh, ss.str().data(), ss.str().size());
  262. std::byte val2[sizeof(val1)];
  263. oh.get().convert(val2);
  264. for (size_t i = 0; i != sizeof(val1); ++i) {
  265. EXPECT_EQ(val1[i], val2[i]);
  266. }
  267. }
  268. TEST(MSGPACK_CPP17, carray_byte_object_with_zone)
  269. {
  270. msgpack::zone z;
  271. std::byte val1[] = {
  272. std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff}
  273. };
  274. msgpack::object obj(val1, z);
  275. std::byte val2[sizeof(val1)];
  276. obj.convert(val2);
  277. for (size_t i = 0; i != sizeof(val1); ++i) {
  278. EXPECT_EQ(val1[i], val2[i]);
  279. }
  280. }
  281. #endif // !defined(MSGPACK_USE_CPP03) && __cplusplus >= 201703