|  | //===- 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 |