| //===- llvm/unittest/ADT/StringMapMap.cpp - StringMap unit tests ----------===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "gtest/gtest.h" | |
| #include "llvm/ADT/StringMap.h" | |
| #include "llvm/Support/DataTypes.h" | |
| using namespace llvm; | |
| namespace { | |
| // Test fixture | |
| class StringMapTest : public testing::Test { | |
| protected: | |
| StringMap<uint32_t> testMap; | |
| static const char testKey[]; | |
| static const uint32_t testValue; | |
| static const char* testKeyFirst; | |
| static size_t testKeyLength; | |
| static const std::string testKeyStr; | |
| void assertEmptyMap() { | |
| // Size tests | |
| EXPECT_EQ(0u, testMap.size()); | |
| EXPECT_TRUE(testMap.empty()); | |
| // Iterator tests | |
| EXPECT_TRUE(testMap.begin() == testMap.end()); | |
| // Lookup tests | |
| EXPECT_EQ(0u, testMap.count(testKey)); | |
| EXPECT_EQ(0u, testMap.count(StringRef(testKeyFirst, testKeyLength))); | |
| EXPECT_EQ(0u, testMap.count(testKeyStr)); | |
| EXPECT_TRUE(testMap.find(testKey) == testMap.end()); | |
| EXPECT_TRUE(testMap.find(StringRef(testKeyFirst, testKeyLength)) == | |
| testMap.end()); | |
| EXPECT_TRUE(testMap.find(testKeyStr) == testMap.end()); | |
| } | |
| void assertSingleItemMap() { | |
| // Size tests | |
| EXPECT_EQ(1u, testMap.size()); | |
| EXPECT_FALSE(testMap.begin() == testMap.end()); | |
| EXPECT_FALSE(testMap.empty()); | |
| // Iterator tests | |
| StringMap<uint32_t>::iterator it = testMap.begin(); | |
| EXPECT_STREQ(testKey, it->first().data()); | |
| EXPECT_EQ(testValue, it->second); | |
| ++it; | |
| EXPECT_TRUE(it == testMap.end()); | |
| // Lookup tests | |
| EXPECT_EQ(1u, testMap.count(testKey)); | |
| EXPECT_EQ(1u, testMap.count(StringRef(testKeyFirst, testKeyLength))); | |
| EXPECT_EQ(1u, testMap.count(testKeyStr)); | |
| EXPECT_TRUE(testMap.find(testKey) == testMap.begin()); | |
| EXPECT_TRUE(testMap.find(StringRef(testKeyFirst, testKeyLength)) == | |
| testMap.begin()); | |
| EXPECT_TRUE(testMap.find(testKeyStr) == testMap.begin()); | |
| } | |
| }; | |
| const char StringMapTest::testKey[] = "key"; | |
| const uint32_t StringMapTest::testValue = 1u; | |
| const char* StringMapTest::testKeyFirst = testKey; | |
| size_t StringMapTest::testKeyLength = sizeof(testKey) - 1; | |
| const std::string StringMapTest::testKeyStr(testKey); | |
| // Empty map tests. | |
| TEST_F(StringMapTest, EmptyMapTest) { | |
| SCOPED_TRACE("EmptyMapTest"); | |
| assertEmptyMap(); | |
| } | |
| // Constant map tests. | |
| TEST_F(StringMapTest, ConstEmptyMapTest) { | |
| const StringMap<uint32_t>& constTestMap = testMap; | |
| // Size tests | |
| EXPECT_EQ(0u, constTestMap.size()); | |
| EXPECT_TRUE(constTestMap.empty()); | |
| // Iterator tests | |
| EXPECT_TRUE(constTestMap.begin() == constTestMap.end()); | |
| // Lookup tests | |
| EXPECT_EQ(0u, constTestMap.count(testKey)); | |
| EXPECT_EQ(0u, constTestMap.count(StringRef(testKeyFirst, testKeyLength))); | |
| EXPECT_EQ(0u, constTestMap.count(testKeyStr)); | |
| EXPECT_TRUE(constTestMap.find(testKey) == constTestMap.end()); | |
| EXPECT_TRUE(constTestMap.find(StringRef(testKeyFirst, testKeyLength)) == | |
| constTestMap.end()); | |
| EXPECT_TRUE(constTestMap.find(testKeyStr) == constTestMap.end()); | |
| } | |
| // A map with a single entry. | |
| TEST_F(StringMapTest, SingleEntryMapTest) { | |
| SCOPED_TRACE("SingleEntryMapTest"); | |
| testMap[testKey] = testValue; | |
| assertSingleItemMap(); | |
| } | |
| // Test clear() method. | |
| TEST_F(StringMapTest, ClearTest) { | |
| SCOPED_TRACE("ClearTest"); | |
| testMap[testKey] = testValue; | |
| testMap.clear(); | |
| assertEmptyMap(); | |
| } | |
| // Test erase(iterator) method. | |
| TEST_F(StringMapTest, EraseIteratorTest) { | |
| SCOPED_TRACE("EraseIteratorTest"); | |
| testMap[testKey] = testValue; | |
| testMap.erase(testMap.begin()); | |
| assertEmptyMap(); | |
| } | |
| // Test erase(value) method. | |
| TEST_F(StringMapTest, EraseValueTest) { | |
| SCOPED_TRACE("EraseValueTest"); | |
| testMap[testKey] = testValue; | |
| testMap.erase(testKey); | |
| assertEmptyMap(); | |
| } | |
| // Test inserting two values and erasing one. | |
| TEST_F(StringMapTest, InsertAndEraseTest) { | |
| SCOPED_TRACE("InsertAndEraseTest"); | |
| testMap[testKey] = testValue; | |
| testMap["otherKey"] = 2; | |
| testMap.erase("otherKey"); | |
| assertSingleItemMap(); | |
| } | |
| // A more complex iteration test. | |
| TEST_F(StringMapTest, IterationTest) { | |
| bool visited[100]; | |
| // Insert 100 numbers into the map | |
| for (int i = 0; i < 100; ++i) { | |
| std::stringstream ss; | |
| ss << "key_" << i; | |
| testMap[ss.str()] = i; | |
| visited[i] = false; | |
| } | |
| // Iterate over all numbers and mark each one found. | |
| for (StringMap<uint32_t>::iterator it = testMap.begin(); | |
| it != testMap.end(); ++it) { | |
| std::stringstream ss; | |
| ss << "key_" << it->second; | |
| ASSERT_STREQ(ss.str().c_str(), it->first().data()); | |
| visited[it->second] = true; | |
| } | |
| // Ensure every number was visited. | |
| for (int i = 0; i < 100; ++i) { | |
| ASSERT_TRUE(visited[i]) << "Entry #" << i << " was never visited"; | |
| } | |
| } | |
| } // end anonymous namespace | |
| namespace llvm { | |
| template <> | |
| class StringMapEntryInitializer<uint32_t> { | |
| public: | |
| template <typename InitTy> | |
| static void Initialize(StringMapEntry<uint32_t> &T, InitTy InitVal) { | |
| T.second = InitVal; | |
| } | |
| }; | |
| } // end llvm namespace | |
| namespace { | |
| // Test StringMapEntry::Create() method. | |
| TEST_F(StringMapTest, StringMapEntryTest) { | |
| StringMap<uint32_t>::value_type* entry = | |
| StringMap<uint32_t>::value_type::Create( | |
| testKeyFirst, testKeyFirst + testKeyLength, 1u); | |
| EXPECT_STREQ(testKey, entry->first().data()); | |
| EXPECT_EQ(1u, entry->second); | |
| free(entry); | |
| } | |
| // Test insert() method. | |
| TEST_F(StringMapTest, InsertTest) { | |
| SCOPED_TRACE("InsertTest"); | |
| testMap.insert( | |
| StringMap<uint32_t>::value_type::Create( | |
| testKeyFirst, testKeyFirst + testKeyLength, | |
| testMap.getAllocator(), 1u)); | |
| assertSingleItemMap(); | |
| } | |
| } // end anonymous namespace |