unique_ptr_cpp11.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include <msgpack.hpp>
  2. #include <sstream>
  3. #include <iterator>
  4. #include <gtest/gtest.h>
  5. #ifdef HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #if !defined(MSGPACK_USE_CPP03)
  9. TEST(UNIQUE_PTR, pack_convert_nil)
  10. {
  11. std::stringstream ss;
  12. std::unique_ptr<int> val1;
  13. msgpack::pack(ss, val1);
  14. msgpack::object_handle oh =
  15. msgpack::unpack(ss.str().data(), ss.str().size());
  16. std::unique_ptr<int> val2 = oh.get().as<std::unique_ptr<int>>();
  17. EXPECT_TRUE(val1 == val2);
  18. }
  19. TEST(UNIQUE_PTR, pack_convert_int)
  20. {
  21. std::stringstream ss;
  22. std::unique_ptr<int> val1(new int(1));
  23. msgpack::pack(ss, val1);
  24. msgpack::object_handle oh =
  25. msgpack::unpack(ss.str().data(), ss.str().size());
  26. std::unique_ptr<int> val2 = oh.get().as<std::unique_ptr<int>>();
  27. EXPECT_TRUE(*val1 == *val2);
  28. }
  29. TEST(UNIQUE_PTR, object_nil)
  30. {
  31. std::unique_ptr<int> val1;
  32. msgpack::object obj(val1);
  33. std::unique_ptr<int> val2 = obj.as<std::unique_ptr<int>>();
  34. EXPECT_TRUE(val1 == val2);
  35. }
  36. TEST(UNIQUE_PTR, object_int)
  37. {
  38. std::unique_ptr<int> val1(new int(1));
  39. msgpack::object obj(val1);
  40. std::unique_ptr<int> val2 = obj.as<std::unique_ptr<int>>();
  41. EXPECT_TRUE(*val1 == *val2);
  42. }
  43. // Compile error as expected
  44. // object::with_zone is required not object
  45. /*
  46. TEST(UNIQUE_PTR, object_vector)
  47. {
  48. typedef std::unique_ptr<std::vector<int>> ovi_t;
  49. ovi_t val1(new std::vector<int>());
  50. msgpack::object obj(val1);
  51. ovi_t val2 = obj.as<ovi_t>();
  52. EXPECT_TRUE(val1 == val2);
  53. }
  54. */
  55. TEST(UNIQUE_PTR, object_with_zone_nil)
  56. {
  57. msgpack::zone z;
  58. std::unique_ptr<int> val1;
  59. msgpack::object obj(val1, z);
  60. std::unique_ptr<int> val2 = obj.as<std::unique_ptr<int>>();
  61. EXPECT_TRUE(val1 == val2);
  62. }
  63. TEST(UNIQUE_PTR, object_with_zone_int)
  64. {
  65. msgpack::zone z;
  66. std::unique_ptr<int> val1(new int(1));
  67. msgpack::object obj(val1, z);
  68. std::unique_ptr<int> val2 = obj.as<std::unique_ptr<int>>();
  69. EXPECT_TRUE(*val1 == *val2);
  70. }
  71. struct no_def_con {
  72. no_def_con() = delete;
  73. no_def_con(int i):i(i) {}
  74. int i;
  75. MSGPACK_DEFINE(i);
  76. };
  77. inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) {
  78. return lhs.i == rhs.i;
  79. }
  80. inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) {
  81. return !(lhs == rhs);
  82. }
  83. namespace msgpack {
  84. MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) {
  85. namespace adaptor {
  86. template <>
  87. struct as<no_def_con> {
  88. no_def_con operator()(msgpack::object const& o) const {
  89. if (o.type != msgpack::type::ARRAY) throw msgpack::type_error();
  90. if (o.via.array.size != 1) throw msgpack::type_error();
  91. return no_def_con(o.via.array.ptr[0].as<int>());
  92. }
  93. };
  94. } // adaptor
  95. } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS)
  96. } // msgpack
  97. TEST(UNIQUE_PTR, pack_convert_nil_no_def_con)
  98. {
  99. std::stringstream ss;
  100. std::unique_ptr<no_def_con> val1(new no_def_con(1));
  101. msgpack::pack(ss, val1);
  102. msgpack::object_handle oh =
  103. msgpack::unpack(ss.str().data(), ss.str().size());
  104. std::unique_ptr<no_def_con> val2 = oh.get().as<std::unique_ptr<no_def_con>>();
  105. EXPECT_TRUE(*val1 == *val2);
  106. }
  107. #endif // !defined(MSGPACK_USE_CPP03)