| //===- llvm/unittest/ADT/DenseMapMap.cpp - DenseMap unit tests --*- C++ -*-===// |
| // |
| // 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/DenseMap.h" |
| |
| using namespace llvm; |
| |
| namespace { |
| |
| // Test fixture |
| class DenseMapTest : public testing::Test { |
| protected: |
| DenseMap<uint32_t, uint32_t> uintMap; |
| DenseMap<uint32_t *, uint32_t *> uintPtrMap; |
| uint32_t dummyInt; |
| }; |
| |
| // Empty map tests |
| TEST_F(DenseMapTest, EmptyIntMapTest) { |
| // Size tests |
| EXPECT_EQ(0u, uintMap.size()); |
| EXPECT_TRUE(uintMap.empty()); |
| |
| // Iterator tests |
| EXPECT_TRUE(uintMap.begin() == uintMap.end()); |
| |
| // Lookup tests |
| EXPECT_FALSE(uintMap.count(0u)); |
| EXPECT_TRUE(uintMap.find(0u) == uintMap.end()); |
| EXPECT_EQ(0u, uintMap.lookup(0u)); |
| } |
| |
| // Empty map tests for pointer map |
| TEST_F(DenseMapTest, EmptyPtrMapTest) { |
| // Size tests |
| EXPECT_EQ(0u, uintPtrMap.size()); |
| EXPECT_TRUE(uintPtrMap.empty()); |
| |
| // Iterator tests |
| EXPECT_TRUE(uintPtrMap.begin() == uintPtrMap.end()); |
| |
| // Lookup tests |
| EXPECT_FALSE(uintPtrMap.count(&dummyInt)); |
| EXPECT_TRUE(uintPtrMap.find(&dummyInt) == uintPtrMap.begin()); |
| EXPECT_EQ(0, uintPtrMap.lookup(&dummyInt)); |
| } |
| |
| // Constant map tests |
| TEST_F(DenseMapTest, ConstEmptyMapTest) { |
| const DenseMap<uint32_t, uint32_t> & constUintMap = uintMap; |
| const DenseMap<uint32_t *, uint32_t *> & constUintPtrMap = uintPtrMap; |
| EXPECT_EQ(0u, constUintMap.size()); |
| EXPECT_EQ(0u, constUintPtrMap.size()); |
| EXPECT_TRUE(constUintMap.empty()); |
| EXPECT_TRUE(constUintPtrMap.empty()); |
| EXPECT_TRUE(constUintMap.begin() == constUintMap.end()); |
| EXPECT_TRUE(constUintPtrMap.begin() == constUintPtrMap.end()); |
| } |
| |
| // A map with a single entry |
| TEST_F(DenseMapTest, SingleEntryMapTest) { |
| uintMap[0] = 1; |
| |
| // Size tests |
| EXPECT_EQ(1u, uintMap.size()); |
| EXPECT_FALSE(uintMap.begin() == uintMap.end()); |
| EXPECT_FALSE(uintMap.empty()); |
| |
| // Iterator tests |
| DenseMap<uint32_t, uint32_t>::iterator it = uintMap.begin(); |
| EXPECT_EQ(0u, it->first); |
| EXPECT_EQ(1u, it->second); |
| ++it; |
| EXPECT_TRUE(it == uintMap.end()); |
| |
| // Lookup tests |
| EXPECT_TRUE(uintMap.count(0u)); |
| EXPECT_TRUE(uintMap.find(0u) == uintMap.begin()); |
| EXPECT_EQ(1u, uintMap.lookup(0u)); |
| EXPECT_EQ(1u, uintMap[0]); |
| } |
| |
| // Test clear() method |
| TEST_F(DenseMapTest, ClearTest) { |
| uintMap[0] = 1; |
| uintMap.clear(); |
| |
| EXPECT_EQ(0u, uintMap.size()); |
| EXPECT_TRUE(uintMap.empty()); |
| EXPECT_TRUE(uintMap.begin() == uintMap.end()); |
| } |
| |
| // Test erase(iterator) method |
| TEST_F(DenseMapTest, EraseTest) { |
| uintMap[0] = 1; |
| uintMap.erase(uintMap.begin()); |
| |
| EXPECT_EQ(0u, uintMap.size()); |
| EXPECT_TRUE(uintMap.empty()); |
| EXPECT_TRUE(uintMap.begin() == uintMap.end()); |
| } |
| |
| // Test erase(value) method |
| TEST_F(DenseMapTest, EraseTest2) { |
| uintMap[0] = 1; |
| uintMap.erase(0); |
| |
| EXPECT_EQ(0u, uintMap.size()); |
| EXPECT_TRUE(uintMap.empty()); |
| EXPECT_TRUE(uintMap.begin() == uintMap.end()); |
| } |
| |
| // Test insert() method |
| TEST_F(DenseMapTest, InsertTest) { |
| uintMap.insert(std::make_pair(0u, 1u)); |
| EXPECT_EQ(1u, uintMap.size()); |
| EXPECT_EQ(1u, uintMap[0]); |
| } |
| |
| // Test copy constructor method |
| TEST_F(DenseMapTest, CopyConstructorTest) { |
| uintMap[0] = 1; |
| DenseMap<uint32_t, uint32_t> copyMap(uintMap); |
| |
| EXPECT_EQ(1u, copyMap.size()); |
| EXPECT_EQ(1u, copyMap[0]); |
| } |
| |
| // Test assignment operator method |
| TEST_F(DenseMapTest, AssignmentTest) { |
| uintMap[0] = 1; |
| DenseMap<uint32_t, uint32_t> copyMap = uintMap; |
| |
| EXPECT_EQ(1u, copyMap.size()); |
| EXPECT_EQ(1u, copyMap[0]); |
| } |
| |
| // A more complex iteration test |
| TEST_F(DenseMapTest, IterationTest) { |
| bool visited[100]; |
| |
| // Insert 100 numbers into the map |
| for (int i = 0; i < 100; ++i) { |
| visited[i] = false; |
| uintMap[i] = 3; |
| } |
| |
| // Iterate over all numbers and mark each one found. |
| for (DenseMap<uint32_t, uint32_t>::iterator it = uintMap.begin(); |
| it != uintMap.end(); ++it) { |
| visited[it->first] = true; |
| } |
| |
| // Ensure every number was visited. |
| for (int i = 0; i < 100; ++i) { |
| ASSERT_TRUE(visited[i]) << "Entry #" << i << " was never visited"; |
| } |
| } |
| |
| // const_iterator test |
| TEST_F(DenseMapTest, ConstIteratorTest) { |
| // Check conversion from iterator to const_iterator. |
| DenseMap<uint32_t, uint32_t>::iterator it = uintMap.begin(); |
| DenseMap<uint32_t, uint32_t>::const_iterator cit(it); |
| EXPECT_TRUE(it == cit); |
| |
| // Check copying of const_iterators. |
| DenseMap<uint32_t, uint32_t>::const_iterator cit2(cit); |
| EXPECT_TRUE(cit == cit2); |
| } |
| |
| } |