|
|
|
@ -17,7 +17,9 @@ |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include "src/core/lib/gprpp/map.h" |
|
|
|
|
|
|
|
|
|
#include <gtest/gtest.h> |
|
|
|
|
|
|
|
|
|
#include "include/grpc/support/string_util.h" |
|
|
|
|
#include "src/core/lib/gprpp/inlined_vector.h" |
|
|
|
|
#include "src/core/lib/gprpp/memory.h" |
|
|
|
@ -319,43 +321,49 @@ TEST_F(MapTest, MapRandomInsertions) { |
|
|
|
|
// Test Map iterator
|
|
|
|
|
TEST_F(MapTest, Iteration) { |
|
|
|
|
Map<const char*, Payload, StringLess> test_map; |
|
|
|
|
for (int i = 0; i < 5; i++) { |
|
|
|
|
for (int i = 4; i >= 0; --i) { |
|
|
|
|
test_map.emplace(kKeys[i], Payload(i)); |
|
|
|
|
} |
|
|
|
|
int count = 0; |
|
|
|
|
for (auto iter = test_map.begin(); iter != test_map.end(); iter++) { |
|
|
|
|
EXPECT_EQ(iter->second.data(), count); |
|
|
|
|
count++; |
|
|
|
|
auto it = test_map.begin(); |
|
|
|
|
for (int i = 0; i < 5; ++i) { |
|
|
|
|
ASSERT_NE(it, test_map.end()); |
|
|
|
|
EXPECT_STREQ(kKeys[i], it->first); |
|
|
|
|
EXPECT_EQ(i, it->second.data()); |
|
|
|
|
++it; |
|
|
|
|
} |
|
|
|
|
EXPECT_EQ(count, 5); |
|
|
|
|
EXPECT_EQ(it, test_map.end()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Test Map iterator with unique ptr payload
|
|
|
|
|
TEST_F(MapTest, IterationWithUniquePtrValue) { |
|
|
|
|
Map<const char*, UniquePtr<Payload>, StringLess> test_map; |
|
|
|
|
for (int i = 0; i < 5; i++) { |
|
|
|
|
for (int i = 4; i >= 0; --i) { |
|
|
|
|
test_map.emplace(kKeys[i], MakeUnique<Payload>(i)); |
|
|
|
|
} |
|
|
|
|
int count = 0; |
|
|
|
|
for (auto iter = test_map.begin(); iter != test_map.end(); iter++) { |
|
|
|
|
EXPECT_EQ(iter->second->data(), count); |
|
|
|
|
count++; |
|
|
|
|
auto it = test_map.begin(); |
|
|
|
|
for (int i = 0; i < 5; ++i) { |
|
|
|
|
ASSERT_NE(it, test_map.end()); |
|
|
|
|
EXPECT_STREQ(kKeys[i], it->first); |
|
|
|
|
EXPECT_EQ(i, it->second->data()); |
|
|
|
|
++it; |
|
|
|
|
} |
|
|
|
|
EXPECT_EQ(count, 5); |
|
|
|
|
EXPECT_EQ(it, test_map.end()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Test Map iterator with unique ptr to char key
|
|
|
|
|
TEST_F(MapTest, IterationWithUniquePtrKey) { |
|
|
|
|
Map<UniquePtr<char>, Payload, StringLess> test_map; |
|
|
|
|
for (int i = 0; i < 5; i++) { |
|
|
|
|
for (int i = 4; i >= 0; --i) { |
|
|
|
|
test_map.emplace(CopyString(kKeys[i]), Payload(i)); |
|
|
|
|
} |
|
|
|
|
int count = 0; |
|
|
|
|
for (auto iter = test_map.begin(); iter != test_map.end(); iter++) { |
|
|
|
|
EXPECT_EQ(iter->second.data(), count); |
|
|
|
|
count++; |
|
|
|
|
auto it = test_map.begin(); |
|
|
|
|
for (int i = 0; i < 5; ++i) { |
|
|
|
|
ASSERT_NE(it, test_map.end()); |
|
|
|
|
EXPECT_STREQ(kKeys[i], it->first.get()); |
|
|
|
|
EXPECT_EQ(i, it->second.data()); |
|
|
|
|
++it; |
|
|
|
|
} |
|
|
|
|
EXPECT_EQ(count, 5); |
|
|
|
|
EXPECT_EQ(it, test_map.end()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Test removing entries while iterating the map
|
|
|
|
@ -367,11 +375,23 @@ TEST_F(MapTest, EraseUsingIterator) { |
|
|
|
|
int count = 0; |
|
|
|
|
for (auto iter = test_map.begin(); iter != test_map.end();) { |
|
|
|
|
EXPECT_EQ(iter->second.data(), count); |
|
|
|
|
iter = test_map.erase(iter); |
|
|
|
|
count++; |
|
|
|
|
if (count % 2 == 1) { |
|
|
|
|
iter = test_map.erase(iter); |
|
|
|
|
} else { |
|
|
|
|
++iter; |
|
|
|
|
} |
|
|
|
|
++count; |
|
|
|
|
} |
|
|
|
|
EXPECT_EQ(count, 5); |
|
|
|
|
EXPECT_TRUE(test_map.empty()); |
|
|
|
|
auto it = test_map.begin(); |
|
|
|
|
for (int i = 0; i < 5; ++i) { |
|
|
|
|
if (i % 2 == 0) { |
|
|
|
|
EXPECT_STREQ(kKeys[i], it->first); |
|
|
|
|
EXPECT_EQ(i, it->second.data()); |
|
|
|
|
++it; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
EXPECT_EQ(it, test_map.end()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Random ops on a Map with Integer key of Payload value,
|
|
|
|
|