StringMapTest.cpp revision 1f6efa3996dd1929fbc129203ce5009b620e6969
11ed3663b49c7a00fa2bec8a70ee59fe05b9173ecBill Wendling//===- llvm/unittest/ADT/StringMapMap.cpp - StringMap unit tests ----------===// 28bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// 38bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// The LLVM Compiler Infrastructure 48bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// 58bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// This file is distributed under the University of Illinois Open Source 68bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// License. See LICENSE.TXT for details. 78bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// 88bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman//===----------------------------------------------------------------------===// 98bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 108bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman#include "gtest/gtest.h" 118bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman#include "llvm/ADT/StringMap.h" 121f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 138bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanusing namespace llvm; 148bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 158bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmannamespace { 168bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 178bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// Test fixture 188bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanclass StringMapTest : public testing::Test { 198bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanprotected: 208bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman StringMap<uint32_t> testMap; 218bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 228bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman static const char testKey[]; 238bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman static const uint32_t testValue; 248bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman static const char* testKeyFirst; 256316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar static size_t testKeyLength; 268bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman static const std::string testKeyStr; 278bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 288bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman void assertEmptyMap() { 298bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Size tests 308bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, testMap.size()); 318bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.empty()); 328bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 338bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Iterator tests 348bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.begin() == testMap.end()); 358bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 368bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Lookup tests 378bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, testMap.count(testKey)); 386316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_EQ(0u, testMap.count(StringRef(testKeyFirst, testKeyLength))); 398bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, testMap.count(testKeyStr)); 408bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.find(testKey) == testMap.end()); 416316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_TRUE(testMap.find(StringRef(testKeyFirst, testKeyLength)) == 426316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar testMap.end()); 438bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.find(testKeyStr) == testMap.end()); 448bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 458bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 468bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman void assertSingleItemMap() { 478bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Size tests 488bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(1u, testMap.size()); 498bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_FALSE(testMap.begin() == testMap.end()); 508bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_FALSE(testMap.empty()); 518bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 528bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Iterator tests 538bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman StringMap<uint32_t>::iterator it = testMap.begin(); 548bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_STREQ(testKey, it->first()); 558bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(testValue, it->second); 568bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman ++it; 578bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(it == testMap.end()); 588bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 598bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Lookup tests 608bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(1u, testMap.count(testKey)); 616316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_EQ(1u, testMap.count(StringRef(testKeyFirst, testKeyLength))); 628bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(1u, testMap.count(testKeyStr)); 638bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.find(testKey) == testMap.begin()); 646316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_TRUE(testMap.find(StringRef(testKeyFirst, testKeyLength)) == 656316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar testMap.begin()); 668bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.find(testKeyStr) == testMap.begin()); 678bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 688bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman}; 698bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 708bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst char StringMapTest::testKey[] = "key"; 718bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst uint32_t StringMapTest::testValue = 1u; 728bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst char* StringMapTest::testKeyFirst = testKey; 736316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbarsize_t StringMapTest::testKeyLength = sizeof(testKey) - 1; 748bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst std::string StringMapTest::testKeyStr(testKey); 758bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 766b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Empty map tests. 778bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, EmptyMapTest) { 788bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman SCOPED_TRACE("EmptyMapTest"); 798bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertEmptyMap(); 808bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 818bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 826b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Constant map tests. 838bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, ConstEmptyMapTest) { 848bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman const StringMap<uint32_t>& constTestMap = testMap; 858bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 868bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Size tests 878bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, constTestMap.size()); 888bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(constTestMap.empty()); 898bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 908bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Iterator tests 918bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(constTestMap.begin() == constTestMap.end()); 928bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 938bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Lookup tests 948bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, constTestMap.count(testKey)); 956316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_EQ(0u, constTestMap.count(StringRef(testKeyFirst, testKeyLength))); 968bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, constTestMap.count(testKeyStr)); 978bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(constTestMap.find(testKey) == constTestMap.end()); 986316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_TRUE(constTestMap.find(StringRef(testKeyFirst, testKeyLength)) == 996b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling constTestMap.end()); 1008bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(constTestMap.find(testKeyStr) == constTestMap.end()); 1018bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1028bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1036b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// A map with a single entry. 1048bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, SingleEntryMapTest) { 1058bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman SCOPED_TRACE("SingleEntryMapTest"); 1068bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1078bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertSingleItemMap(); 1088bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1098bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1106b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test clear() method. 1118bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, ClearTest) { 1128bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman SCOPED_TRACE("ClearTest"); 1138bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1148bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap.clear(); 1158bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertEmptyMap(); 1168bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1178bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1186b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test erase(iterator) method. 1198bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, EraseIteratorTest) { 1208bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman SCOPED_TRACE("EraseIteratorTest"); 1218bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1228bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap.erase(testMap.begin()); 1238bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertEmptyMap(); 1248bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1258bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1266b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test erase(value) method. 1278bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, EraseValueTest) { 1288bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman SCOPED_TRACE("EraseValueTest"); 1298bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1308bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap.erase(testKey); 1318bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertEmptyMap(); 1328bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1338bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1346b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test inserting two values and erasing one. 1358bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, InsertAndEraseTest) { 1368bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman SCOPED_TRACE("InsertAndEraseTest"); 1378bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1388bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap["otherKey"] = 2; 1398bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap.erase("otherKey"); 1408bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertSingleItemMap(); 1418bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1428bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1436b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// A more complex iteration test. 1448bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, IterationTest) { 1458bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman bool visited[100]; 1468bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1478bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Insert 100 numbers into the map 1488bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman for (int i = 0; i < 100; ++i) { 1498bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman std::stringstream ss; 1508bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman ss << "key_" << i; 1518bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[ss.str()] = i; 1528bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman visited[i] = false; 1538bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 1548bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1558bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Iterate over all numbers and mark each one found. 1568bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman for (StringMap<uint32_t>::iterator it = testMap.begin(); 1578bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman it != testMap.end(); ++it) { 1588bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman std::stringstream ss; 1598bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman ss << "key_" << it->second; 1608bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman ASSERT_STREQ(ss.str().c_str(), it->first()); 1618bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman visited[it->second] = true; 1628bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 1638bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1648bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Ensure every number was visited. 1658bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman for (int i = 0; i < 100; ++i) { 1668bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman ASSERT_TRUE(visited[i]) << "Entry #" << i << " was never visited"; 1678bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 1688bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1698bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1706b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling} // end anonymous namespace 1716b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling 1726b223d71e5e5e123137f0f056541de4212f5c878Bill Wendlingnamespace llvm { 1736b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling 1746b223d71e5e5e123137f0f056541de4212f5c878Bill Wendlingtemplate <> 1756b223d71e5e5e123137f0f056541de4212f5c878Bill Wendlingclass StringMapEntryInitializer<uint32_t> { 1766b223d71e5e5e123137f0f056541de4212f5c878Bill Wendlingpublic: 1776b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling template <typename InitTy> 1786b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling static void Initialize(StringMapEntry<uint32_t> &T, InitTy InitVal) { 1796b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling T.second = InitVal; 1806b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling } 1816b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling}; 1826b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling 1836b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling} // end llvm namespace 1846b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling 1856b223d71e5e5e123137f0f056541de4212f5c878Bill Wendlingnamespace { 1866b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling 1876b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test StringMapEntry::Create() method. 1886b223d71e5e5e123137f0f056541de4212f5c878Bill WendlingTEST_F(StringMapTest, StringMapEntryTest) { 1896b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling StringMap<uint32_t>::value_type* entry = 1906b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling StringMap<uint32_t>::value_type::Create( 1916316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar testKeyFirst, testKeyFirst + testKeyLength, 1u); 1926b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling EXPECT_STREQ(testKey, entry->first()); 1936b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling EXPECT_EQ(1u, entry->second); 194d8735356a36fb04dfcfd9520f9785c0c3739b4a1Jeffrey Yasskin free(entry); 1956b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling} 1966b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling 1976b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test insert() method. 1986b223d71e5e5e123137f0f056541de4212f5c878Bill WendlingTEST_F(StringMapTest, InsertTest) { 1996b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling SCOPED_TRACE("InsertTest"); 2006b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling testMap.insert( 2016b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling StringMap<uint32_t>::value_type::Create( 2026316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar testKeyFirst, testKeyFirst + testKeyLength, 2036316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar testMap.getAllocator(), 1u)); 2046b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling assertSingleItemMap(); 2058bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 2066b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling 2076b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling} // end anonymous namespace 208