unique_ptr_test.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <string>
  5. #include <type_traits>
  6. #include <utility>
  7. #include "opentelemetry/nostd/unique_ptr.h"
  8. using opentelemetry::nostd::unique_ptr;
  9. class A
  10. {
  11. public:
  12. explicit A(bool &destructed) noexcept : destructed_{destructed} { destructed_ = false; }
  13. ~A() { destructed_ = true; }
  14. private:
  15. bool &destructed_;
  16. };
  17. class B
  18. {
  19. public:
  20. int f() const { return 123; }
  21. };
  22. TEST(UniquePtrTest, DefaultConstruction)
  23. {
  24. unique_ptr<int> ptr1;
  25. EXPECT_EQ(ptr1.get(), nullptr);
  26. unique_ptr<int> ptr2{nullptr};
  27. EXPECT_EQ(ptr2.get(), nullptr);
  28. }
  29. TEST(UniquePtrTest, ExplicitConstruction)
  30. {
  31. auto value = new int{123};
  32. unique_ptr<int> ptr1{value};
  33. EXPECT_EQ(ptr1.get(), value);
  34. auto array = new int[5];
  35. unique_ptr<int[]> ptr2{array};
  36. EXPECT_EQ(ptr2.get(), array);
  37. }
  38. TEST(UniquePtrTest, MoveConstruction)
  39. {
  40. auto value = new int{123};
  41. unique_ptr<int> ptr1{value};
  42. unique_ptr<int> ptr2{std::move(ptr1)};
  43. EXPECT_EQ(ptr1.get(), nullptr); // NOLINT
  44. EXPECT_EQ(ptr2.get(), value);
  45. }
  46. TEST(UniquePtrTest, MoveConstructionFromDifferentType)
  47. {
  48. auto value = new int{123};
  49. unique_ptr<int> ptr1{value};
  50. unique_ptr<const int> ptr2{std::move(ptr1)};
  51. EXPECT_EQ(ptr1.get(), nullptr); // NOLINT
  52. EXPECT_EQ(ptr2.get(), value);
  53. }
  54. TEST(UniquePtrTest, MoveConstructionFromStdUniquePtr)
  55. {
  56. auto value = new int{123};
  57. std::unique_ptr<int> ptr1{value};
  58. unique_ptr<int> ptr2{std::move(ptr1)};
  59. EXPECT_EQ(ptr1.get(), nullptr); // NOLINT
  60. EXPECT_EQ(ptr2.get(), value);
  61. }
  62. TEST(UniquePtrTest, Destruction)
  63. {
  64. bool was_destructed;
  65. unique_ptr<A>{new A{was_destructed}}; // NOLINT
  66. EXPECT_TRUE(was_destructed);
  67. }
  68. TEST(UniquePtrTest, StdUniquePtrConversionOperator)
  69. {
  70. auto value = new int{123};
  71. unique_ptr<int> ptr1{value};
  72. std::unique_ptr<int> ptr2{std::move(ptr1)};
  73. EXPECT_EQ(ptr1.get(), nullptr); // NOLINT
  74. EXPECT_EQ(ptr2.get(), value);
  75. value = new int{456};
  76. ptr1 = unique_ptr<int>{value};
  77. ptr2 = std::move(ptr1);
  78. EXPECT_EQ(ptr1.get(), nullptr); // NOLINT
  79. EXPECT_EQ(ptr2.get(), value);
  80. ptr2 = nullptr;
  81. EXPECT_EQ(ptr2.get(), nullptr);
  82. EXPECT_TRUE((std::is_assignable<std::unique_ptr<int>, unique_ptr<int> &&>::value));
  83. EXPECT_FALSE((std::is_assignable<std::unique_ptr<int>, unique_ptr<int> &>::value));
  84. }
  85. TEST(UniquePtrTest, BoolConversionOpertor)
  86. {
  87. auto value = new int{123};
  88. unique_ptr<int> ptr1{value};
  89. EXPECT_TRUE(ptr1);
  90. EXPECT_FALSE(unique_ptr<int>{});
  91. }
  92. TEST(UniquePtrTest, PointerOperators)
  93. {
  94. auto value = new int{123};
  95. unique_ptr<int> ptr1{value};
  96. EXPECT_EQ(&*ptr1, value);
  97. EXPECT_EQ(unique_ptr<B> { new B } -> f(), 123);
  98. }
  99. TEST(UniquePtrTest, Reset)
  100. {
  101. bool was_destructed1;
  102. unique_ptr<A> ptr{new A{was_destructed1}};
  103. bool was_destructed2 = true;
  104. ptr.reset(new A{was_destructed2});
  105. EXPECT_TRUE(was_destructed1);
  106. EXPECT_FALSE(was_destructed2);
  107. ptr.reset();
  108. EXPECT_TRUE(was_destructed2);
  109. }
  110. TEST(UniquePtrTest, Release)
  111. {
  112. auto value = new int{123};
  113. unique_ptr<int> ptr{value};
  114. EXPECT_EQ(ptr.release(), value);
  115. EXPECT_EQ(ptr.get(), nullptr);
  116. delete value;
  117. }
  118. TEST(UniquePtrTest, Swap)
  119. {
  120. auto value1 = new int{123};
  121. unique_ptr<int> ptr1{value1};
  122. auto value2 = new int{456};
  123. unique_ptr<int> ptr2{value2};
  124. ptr1.swap(ptr2);
  125. EXPECT_EQ(ptr1.get(), value2);
  126. EXPECT_EQ(ptr2.get(), value1);
  127. }
  128. TEST(UniquePtrTest, Comparison)
  129. {
  130. unique_ptr<int> ptr1{new int{123}};
  131. unique_ptr<int> ptr2{new int{456}};
  132. unique_ptr<int> ptr3{};
  133. EXPECT_EQ(ptr1, ptr1);
  134. EXPECT_NE(ptr1, ptr2);
  135. EXPECT_NE(ptr1, nullptr);
  136. EXPECT_NE(nullptr, ptr1);
  137. EXPECT_EQ(ptr3, nullptr);
  138. EXPECT_EQ(nullptr, ptr3);
  139. }