Add extra tests for working with reserved tables. PiperOrigin-RevId: 920556603 Change-Id: Id9ed97bf11f424abf7fc5d0095bdfd78d97b9100
diff --git a/absl/container/internal/raw_hash_set_test.cc b/absl/container/internal/raw_hash_set_test.cc index 6d63a06..332f99d 100644 --- a/absl/container/internal/raw_hash_set_test.cc +++ b/absl/container/internal/raw_hash_set_test.cc
@@ -1192,6 +1192,74 @@ } } +TYPED_TEST(SooTest, ReserveTwice) { + for (size_t reserve_size = 0; reserve_size < 32; ++reserve_size) { + for (size_t reserve_size2 = reserve_size; reserve_size2 < 32; + ++reserve_size2) { + SCOPED_TRACE(absl::StrCat("reserve_size: ", reserve_size, + ", reserve_size2: ", reserve_size2)); + TypeParam t; + t.reserve(reserve_size); + { // Insert first batch of elements. + size_t cap = t.capacity(); + for (size_t i = 0; i < reserve_size; ++i) { + ASSERT_TRUE(t.insert(static_cast<int>(i)).second) << i; + } + ASSERT_EQ(t.capacity(), cap); + } + t.reserve(reserve_size2); + { // Insert second batch of elements. + size_t cap = t.capacity(); + for (size_t i = reserve_size; i < reserve_size2; ++i) { + ASSERT_TRUE(t.insert(static_cast<int>(i)).second) << i; + } + ASSERT_EQ(t.capacity(), cap); + } + for (size_t i = 0; i < reserve_size2; ++i) { + ASSERT_TRUE(t.contains(static_cast<int>(i))) << i; + } + } + } +} + +TYPED_TEST(SooTest, GrowAfterReserve) { + for (size_t reserve_size = 1; reserve_size <= 150; ++reserve_size) { + size_t size = reserve_size + 1; + TypeParam s; + s.reserve(reserve_size); + for (size_t i = 0; i < size; ++i) { + ASSERT_TRUE(s.insert(static_cast<int>(i)).second) << i; + } + EXPECT_EQ(s.size(), size); + for (size_t i = 0; i < size; ++i) { + ASSERT_TRUE(s.contains(static_cast<int>(i))) << i; + } + } +} + +TYPED_TEST(SooTest, ClearAfterReserve) { + for (size_t reserve_size : + std::vector<size_t>{1, 3, 4, 6, 7, 8, 13, 14, 15, 128, 150}) { + TypeParam s; + s.reserve(reserve_size); + for (size_t i = 0; i < reserve_size; ++i) { + ASSERT_TRUE(s.insert(static_cast<int>(i)).second); + } + EXPECT_EQ(s.size(), reserve_size); + s.clear(); + EXPECT_EQ(s.size(), 0); + for (size_t i = 0; i < reserve_size; ++i) { + ASSERT_FALSE(s.contains(static_cast<int>(i))) << i; + } + for (size_t i = 0; i < reserve_size; ++i) { + ASSERT_TRUE(s.insert(static_cast<int>(i)).second) << i; + } + for (size_t i = 0; i < reserve_size; ++i) { + ASSERT_TRUE(s.contains(static_cast<int>(i))) << i; + } + } +} + template <class TableType> class SmallTableResizeTest : public testing::Test {};