test_instance_tracker_test.cc 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // Copyright 2017 The Abseil Authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "absl/container/internal/test_instance_tracker.h"
  15. #include "gtest/gtest.h"
  16. namespace {
  17. using absl::test_internal::CopyableMovableInstance;
  18. using absl::test_internal::CopyableOnlyInstance;
  19. using absl::test_internal::InstanceTracker;
  20. using absl::test_internal::MovableOnlyInstance;
  21. TEST(TestInstanceTracker, CopyableMovable) {
  22. InstanceTracker tracker;
  23. CopyableMovableInstance src(1);
  24. EXPECT_EQ(1, src.value()) << src;
  25. CopyableMovableInstance copy(src);
  26. CopyableMovableInstance move(std::move(src));
  27. EXPECT_EQ(1, tracker.copies());
  28. EXPECT_EQ(1, tracker.moves());
  29. EXPECT_EQ(0, tracker.swaps());
  30. EXPECT_EQ(3, tracker.instances());
  31. EXPECT_EQ(2, tracker.live_instances());
  32. tracker.ResetCopiesMovesSwaps();
  33. CopyableMovableInstance copy_assign(1);
  34. copy_assign = copy;
  35. CopyableMovableInstance move_assign(1);
  36. move_assign = std::move(move);
  37. EXPECT_EQ(1, tracker.copies());
  38. EXPECT_EQ(1, tracker.moves());
  39. EXPECT_EQ(0, tracker.swaps());
  40. EXPECT_EQ(5, tracker.instances());
  41. EXPECT_EQ(3, tracker.live_instances());
  42. tracker.ResetCopiesMovesSwaps();
  43. {
  44. using std::swap;
  45. swap(move_assign, copy);
  46. swap(copy, move_assign);
  47. EXPECT_EQ(2, tracker.swaps());
  48. EXPECT_EQ(0, tracker.copies());
  49. EXPECT_EQ(0, tracker.moves());
  50. EXPECT_EQ(5, tracker.instances());
  51. EXPECT_EQ(3, tracker.live_instances());
  52. }
  53. }
  54. TEST(TestInstanceTracker, CopyableOnly) {
  55. InstanceTracker tracker;
  56. CopyableOnlyInstance src(1);
  57. EXPECT_EQ(1, src.value()) << src;
  58. CopyableOnlyInstance copy(src);
  59. CopyableOnlyInstance copy2(std::move(src)); // NOLINT
  60. EXPECT_EQ(2, tracker.copies());
  61. EXPECT_EQ(0, tracker.moves());
  62. EXPECT_EQ(3, tracker.instances());
  63. EXPECT_EQ(3, tracker.live_instances());
  64. tracker.ResetCopiesMovesSwaps();
  65. CopyableOnlyInstance copy_assign(1);
  66. copy_assign = copy;
  67. CopyableOnlyInstance copy_assign2(1);
  68. copy_assign2 = std::move(copy2); // NOLINT
  69. EXPECT_EQ(2, tracker.copies());
  70. EXPECT_EQ(0, tracker.moves());
  71. EXPECT_EQ(5, tracker.instances());
  72. EXPECT_EQ(5, tracker.live_instances());
  73. tracker.ResetCopiesMovesSwaps();
  74. {
  75. using std::swap;
  76. swap(src, copy);
  77. swap(copy, src);
  78. EXPECT_EQ(2, tracker.swaps());
  79. EXPECT_EQ(0, tracker.copies());
  80. EXPECT_EQ(0, tracker.moves());
  81. EXPECT_EQ(5, tracker.instances());
  82. EXPECT_EQ(5, tracker.live_instances());
  83. }
  84. }
  85. TEST(TestInstanceTracker, MovableOnly) {
  86. InstanceTracker tracker;
  87. MovableOnlyInstance src(1);
  88. EXPECT_EQ(1, src.value()) << src;
  89. MovableOnlyInstance move(std::move(src));
  90. MovableOnlyInstance move_assign(2);
  91. move_assign = std::move(move);
  92. EXPECT_EQ(3, tracker.instances());
  93. EXPECT_EQ(1, tracker.live_instances());
  94. EXPECT_EQ(2, tracker.moves());
  95. EXPECT_EQ(0, tracker.copies());
  96. tracker.ResetCopiesMovesSwaps();
  97. {
  98. using std::swap;
  99. MovableOnlyInstance other(2);
  100. swap(move_assign, other);
  101. swap(other, move_assign);
  102. EXPECT_EQ(2, tracker.swaps());
  103. EXPECT_EQ(0, tracker.copies());
  104. EXPECT_EQ(0, tracker.moves());
  105. EXPECT_EQ(4, tracker.instances());
  106. EXPECT_EQ(2, tracker.live_instances());
  107. }
  108. }
  109. TEST(TestInstanceTracker, ExistingInstances) {
  110. CopyableMovableInstance uncounted_instance(1);
  111. CopyableMovableInstance uncounted_live_instance(
  112. std::move(uncounted_instance));
  113. InstanceTracker tracker;
  114. EXPECT_EQ(0, tracker.instances());
  115. EXPECT_EQ(0, tracker.live_instances());
  116. EXPECT_EQ(0, tracker.copies());
  117. {
  118. CopyableMovableInstance instance1(1);
  119. EXPECT_EQ(1, tracker.instances());
  120. EXPECT_EQ(1, tracker.live_instances());
  121. EXPECT_EQ(0, tracker.copies());
  122. EXPECT_EQ(0, tracker.moves());
  123. {
  124. InstanceTracker tracker2;
  125. CopyableMovableInstance instance2(instance1);
  126. CopyableMovableInstance instance3(std::move(instance2));
  127. EXPECT_EQ(3, tracker.instances());
  128. EXPECT_EQ(2, tracker.live_instances());
  129. EXPECT_EQ(1, tracker.copies());
  130. EXPECT_EQ(1, tracker.moves());
  131. EXPECT_EQ(2, tracker2.instances());
  132. EXPECT_EQ(1, tracker2.live_instances());
  133. EXPECT_EQ(1, tracker2.copies());
  134. EXPECT_EQ(1, tracker2.moves());
  135. }
  136. EXPECT_EQ(1, tracker.instances());
  137. EXPECT_EQ(1, tracker.live_instances());
  138. EXPECT_EQ(1, tracker.copies());
  139. EXPECT_EQ(1, tracker.moves());
  140. }
  141. EXPECT_EQ(0, tracker.instances());
  142. EXPECT_EQ(0, tracker.live_instances());
  143. EXPECT_EQ(1, tracker.copies());
  144. EXPECT_EQ(1, tracker.moves());
  145. }
  146. TEST(TestInstanceTracker, Comparisons) {
  147. InstanceTracker tracker;
  148. MovableOnlyInstance one(1), two(2);
  149. EXPECT_EQ(0, tracker.comparisons());
  150. EXPECT_FALSE(one == two);
  151. EXPECT_EQ(1, tracker.comparisons());
  152. EXPECT_TRUE(one != two);
  153. EXPECT_EQ(2, tracker.comparisons());
  154. EXPECT_TRUE(one < two);
  155. EXPECT_EQ(3, tracker.comparisons());
  156. EXPECT_FALSE(one > two);
  157. EXPECT_EQ(4, tracker.comparisons());
  158. EXPECT_TRUE(one <= two);
  159. EXPECT_EQ(5, tracker.comparisons());
  160. EXPECT_FALSE(one >= two);
  161. EXPECT_EQ(6, tracker.comparisons());
  162. EXPECT_TRUE(one.compare(two) < 0); // NOLINT
  163. EXPECT_EQ(7, tracker.comparisons());
  164. tracker.ResetCopiesMovesSwaps();
  165. EXPECT_EQ(0, tracker.comparisons());
  166. }
  167. } // namespace