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"
13cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <tuple>
148bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanusing namespace llvm;
158bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
168bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmannamespace {
178bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
188bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// Test fixture
198bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanclass StringMapTest : public testing::Test {
208bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanprotected:
218bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  StringMap<uint32_t> testMap;
228bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
238bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  static const char testKey[];
248bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  static const uint32_t testValue;
258bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  static const char* testKeyFirst;
266316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar  static size_t testKeyLength;
278bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  static const std::string testKeyStr;
288bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
298bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  void assertEmptyMap() {
308bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    // Size tests
318bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_EQ(0u, testMap.size());
328bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_TRUE(testMap.empty());
338bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
348bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    // Iterator tests
358bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_TRUE(testMap.begin() == testMap.end());
368bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
378bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    // Lookup tests
388bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_EQ(0u, testMap.count(testKey));
396316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar    EXPECT_EQ(0u, testMap.count(StringRef(testKeyFirst, testKeyLength)));
408bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_EQ(0u, testMap.count(testKeyStr));
418bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_TRUE(testMap.find(testKey) == testMap.end());
426316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar    EXPECT_TRUE(testMap.find(StringRef(testKeyFirst, testKeyLength)) ==
436316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar                testMap.end());
448bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_TRUE(testMap.find(testKeyStr) == testMap.end());
458bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  }
468bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
478bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  void assertSingleItemMap() {
488bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    // Size tests
498bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_EQ(1u, testMap.size());
508bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_FALSE(testMap.begin() == testMap.end());
518bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_FALSE(testMap.empty());
528bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
538bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    // Iterator tests
548bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    StringMap<uint32_t>::iterator it = testMap.begin();
55d7c027322ebccd9666c3f46d9a5236ba76fda434Chris Lattner    EXPECT_STREQ(testKey, it->first().data());
568bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_EQ(testValue, it->second);
578bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    ++it;
588bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_TRUE(it == testMap.end());
598bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
608bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    // Lookup tests
618bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_EQ(1u, testMap.count(testKey));
626316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar    EXPECT_EQ(1u, testMap.count(StringRef(testKeyFirst, testKeyLength)));
638bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_EQ(1u, testMap.count(testKeyStr));
648bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_TRUE(testMap.find(testKey) == testMap.begin());
656316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar    EXPECT_TRUE(testMap.find(StringRef(testKeyFirst, testKeyLength)) ==
666316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar                testMap.begin());
678bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    EXPECT_TRUE(testMap.find(testKeyStr) == testMap.begin());
688bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  }
698bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman};
708bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
718bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst char StringMapTest::testKey[] = "key";
728bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst uint32_t StringMapTest::testValue = 1u;
738bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst char* StringMapTest::testKeyFirst = testKey;
746316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbarsize_t StringMapTest::testKeyLength = sizeof(testKey) - 1;
758bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst std::string StringMapTest::testKeyStr(testKey);
768bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
776b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Empty map tests.
788bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, 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  testMap[testKey] = testValue;
1068bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  assertSingleItemMap();
1078bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman}
1088bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
1096b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test clear() method.
1108bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, ClearTest) {
1118bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  testMap[testKey] = testValue;
1128bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  testMap.clear();
1138bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  assertEmptyMap();
1148bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman}
1158bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
1166b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test erase(iterator) method.
1178bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, EraseIteratorTest) {
1188bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  testMap[testKey] = testValue;
1198bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  testMap.erase(testMap.begin());
1208bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  assertEmptyMap();
1218bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman}
1228bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
1236b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test erase(value) method.
1248bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, EraseValueTest) {
1258bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  testMap[testKey] = testValue;
1268bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  testMap.erase(testKey);
1278bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  assertEmptyMap();
1288bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman}
1298bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
1306b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test inserting two values and erasing one.
1318bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, InsertAndEraseTest) {
1328bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  testMap[testKey] = testValue;
1338bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  testMap["otherKey"] = 2;
1348bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  testMap.erase("otherKey");
1358bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  assertSingleItemMap();
1368bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman}
1378bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
1382a79116940012acaad9cc70efef79d7359f27513Chandler CarruthTEST_F(StringMapTest, SmallFullMapTest) {
1392a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  // StringMap has a tricky corner case when the map is small (<8 buckets) and
1402a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  // it fills up through a balanced pattern of inserts and erases. This can
1412a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  // lead to inf-loops in some cases (PR13148) so we test it explicitly here.
1422a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  llvm::StringMap<int> Map(2);
1432a79116940012acaad9cc70efef79d7359f27513Chandler Carruth
1442a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  Map["eins"] = 1;
1452a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  Map["zwei"] = 2;
1462a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  Map["drei"] = 3;
1472a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  Map.erase("drei");
1482a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  Map.erase("eins");
1492a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  Map["veir"] = 4;
1502a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  Map["funf"] = 5;
1512a79116940012acaad9cc70efef79d7359f27513Chandler Carruth
1522a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  EXPECT_EQ(3u, Map.size());
1532a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  EXPECT_EQ(0, Map.lookup("eins"));
1542a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  EXPECT_EQ(2, Map.lookup("zwei"));
1552a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  EXPECT_EQ(0, Map.lookup("drei"));
1562a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  EXPECT_EQ(4, Map.lookup("veir"));
1572a79116940012acaad9cc70efef79d7359f27513Chandler Carruth  EXPECT_EQ(5, Map.lookup("funf"));
1582a79116940012acaad9cc70efef79d7359f27513Chandler Carruth}
1592a79116940012acaad9cc70efef79d7359f27513Chandler Carruth
1606b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// A more complex iteration test.
1618bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, IterationTest) {
1628bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  bool visited[100];
1638bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
1648bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  // Insert 100 numbers into the map
1658bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  for (int i = 0; i < 100; ++i) {
1668bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    std::stringstream ss;
1678bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    ss << "key_" << i;
1688bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    testMap[ss.str()] = i;
1698bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    visited[i] = false;
1708bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  }
1718bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
1728bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  // Iterate over all numbers and mark each one found.
1738bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  for (StringMap<uint32_t>::iterator it = testMap.begin();
1748bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman      it != testMap.end(); ++it) {
1758bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    std::stringstream ss;
1768bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    ss << "key_" << it->second;
177d7c027322ebccd9666c3f46d9a5236ba76fda434Chris Lattner    ASSERT_STREQ(ss.str().c_str(), it->first().data());
1788bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    visited[it->second] = true;
1798bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  }
1808bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
1818bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  // Ensure every number was visited.
1828bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  for (int i = 0; i < 100; ++i) {
1838bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman    ASSERT_TRUE(visited[i]) << "Entry #" << i << " was never visited";
1848bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman  }
1858bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman}
1868bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman
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(
191cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          StringRef(testKeyFirst, testKeyLength), 1u);
192d7c027322ebccd9666c3f46d9a5236ba76fda434Chris Lattner  EXPECT_STREQ(testKey, entry->first().data());
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(
202cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          StringRef(testKeyFirst, testKeyLength),
2036316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar          testMap.getAllocator(), 1u));
2046b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling  assertSingleItemMap();
2058bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman}
2066b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling
207cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// Test insert(pair<K, V>) method
208cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST_F(StringMapTest, InsertPairTest) {
209cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool Inserted;
210cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringMap<uint32_t>::iterator NewIt;
211cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::tie(NewIt, Inserted) =
212cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      testMap.insert(std::make_pair(testKeyFirst, testValue));
213cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(1u, testMap.size());
214cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(testValue, testMap[testKeyFirst]);
215cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(testKeyFirst, NewIt->first());
216cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(testValue, NewIt->second);
217cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(Inserted);
218cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
219cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringMap<uint32_t>::iterator ExistingIt;
220cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::tie(ExistingIt, Inserted) =
221cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      testMap.insert(std::make_pair(testKeyFirst, testValue + 1));
222cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(1u, testMap.size());
223cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(testValue, testMap[testKeyFirst]);
224cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(Inserted);
225cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(NewIt, ExistingIt);
226cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
227cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
228cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// Test insert(pair<K, V>) method when rehashing occurs
229cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST_F(StringMapTest, InsertRehashingPairTest) {
230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Check that the correct iterator is returned when the inserted element is
231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // moved to a different bucket during internal rehashing. This depends on
232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // the particular key, and the implementation of StringMap and HashString.
233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Changes to those might result in this test not actually checking that.
234cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringMap<uint32_t> t(1);
235cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(1u, t.getNumBuckets());
236cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
237cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringMap<uint32_t>::iterator It =
238cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    t.insert(std::make_pair("abcdef", 42)).first;
239cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(2u, t.getNumBuckets());
240cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ("abcdef", It->first());
241cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(42u, It->second);
242cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
243cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Create a non-default constructable value
24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct StringMapTestStruct {
24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringMapTestStruct(int i) : i(i) {}
24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringMapTestStruct() LLVM_DELETED_FUNCTION;
24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  int i;
24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(StringMapTest, NonDefaultConstructable) {
25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringMap<StringMapTestStruct> t;
25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  t.GetOrCreateValue("Test", StringMapTestStruct(123));
25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringMap<StringMapTestStruct>::iterator iter = t.find("Test");
25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ASSERT_NE(iter, t.end());
25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ASSERT_EQ(iter->second.i, 123);
25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct MoveOnly {
260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  int i;
261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MoveOnly(int i) : i(i) {}
262dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MoveOnly(MoveOnly &&RHS) : i(RHS.i) {}
263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MoveOnly &operator=(MoveOnly &&RHS) {
264dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    i = RHS.i;
265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return *this;
266dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprivate:
269cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MoveOnly(const MoveOnly &) LLVM_DELETED_FUNCTION;
270cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MoveOnly &operator=(const MoveOnly &) LLVM_DELETED_FUNCTION;
271dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
273dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesTEST_F(StringMapTest, MoveOnlyKey) {
274dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringMap<MoveOnly> t;
275dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  t.GetOrCreateValue("Test", MoveOnly(42));
276dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringRef Key = "Test";
277cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringMapEntry<MoveOnly>::Create(Key, MoveOnly(42))
278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      ->Destroy();
279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
280dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
281dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesTEST_F(StringMapTest, MoveConstruct) {
282dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringMap<int> A;
283dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  A.GetOrCreateValue("x", 42);
284dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringMap<int> B = std::move(A);
285dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(A.size(), 0u);
286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(B.size(), 1u);
287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(B["x"], 42);
288dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(B.count("y"), 0u);
289dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
290dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
291dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesTEST_F(StringMapTest, MoveAssignment) {
292dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringMap<int> A;
293dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  A["x"] = 42;
294dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringMap<int> B;
295dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  B["y"] = 117;
296dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  A = std::move(B);
297dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(A.size(), 1u);
298dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(B.size(), 0u);
299dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(A["y"], 117);
300dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(B.count("x"), 0u);
301dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
302dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
303dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct Countable {
304dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  int &InstanceCount;
305dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  int Number;
306dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Countable(int Number, int &InstanceCount)
307dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      : InstanceCount(InstanceCount), Number(Number) {
308dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ++InstanceCount;
309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
310dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Countable(Countable &&C) : InstanceCount(C.InstanceCount), Number(C.Number) {
311dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ++InstanceCount;
312dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    C.Number = -1;
313dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
314dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Countable(const Countable &C)
315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      : InstanceCount(C.InstanceCount), Number(C.Number) {
316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ++InstanceCount;
317dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Countable &operator=(Countable C) {
319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Number = C.Number;
320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return *this;
321dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
322dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ~Countable() { --InstanceCount; }
323dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
324dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
325dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesTEST_F(StringMapTest, MoveDtor) {
326dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  int InstanceCount = 0;
327dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringMap<Countable> A;
328dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  A.GetOrCreateValue("x", Countable(42, InstanceCount));
329dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(InstanceCount, 1);
330dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  auto I = A.find("x");
331dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_NE(I, A.end());
332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(I->second.Number, 42);
333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
334dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringMap<Countable> B;
335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  B = std::move(A);
336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(InstanceCount, 1);
337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_TRUE(A.empty());
338dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  I = B.find("x");
339dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_NE(I, B.end());
340dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(I->second.Number, 42);
341dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  B = StringMap<Countable>();
343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_EQ(InstanceCount, 0);
344dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ASSERT_TRUE(B.empty());
345dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
3476b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling} // end anonymous namespace
348