// // Copyright 2018 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // ResourceMap_unittest: // Unit tests for the ResourceMap template class. // #include #include "libANGLE/ResourceMap.h" using namespace gl; namespace { // Tests assigning slots in the map and then deleting elements. TEST(ResourceMapTest, AssignAndErase) { constexpr size_t kSize = 64; ResourceMap resourceMap; std::vector objects(kSize, 1); for (size_t index = 0; index < kSize; ++index) { resourceMap.assign(index + 1, &objects[index]); } for (size_t index = 0; index < kSize; ++index) { size_t *found = nullptr; ASSERT_TRUE(resourceMap.erase(index + 1, &found)); ASSERT_EQ(&objects[index], found); } ASSERT_TRUE(resourceMap.empty()); } // Tests assigning slots in the map and then using clear() to free it. TEST(ResourceMapTest, AssignAndClear) { constexpr size_t kSize = 64; ResourceMap resourceMap; std::vector objects(kSize, 1); for (size_t index = 0; index < kSize; ++index) { resourceMap.assign(index + 1, &objects[index]); } resourceMap.clear(); ASSERT_TRUE(resourceMap.empty()); } // Tests growing a map more than double the size. TEST(ResourceMapTest, BigGrowth) { constexpr size_t kSize = 8; ResourceMap resourceMap; std::vector objects; for (size_t index = 0; index < kSize; ++index) { objects.push_back(index); } // Assign a large value. constexpr size_t kLargeIndex = 128; objects.push_back(kLargeIndex); for (size_t &object : objects) { resourceMap.assign(object, &object); } for (size_t object : objects) { size_t *found = nullptr; ASSERT_TRUE(resourceMap.erase(object, &found)); ASSERT_EQ(object, *found); } ASSERT_TRUE(resourceMap.empty()); } // Tests querying unassigned or erased values. TEST(ResourceMapTest, QueryUnassigned) { constexpr size_t kSize = 8; ResourceMap resourceMap; std::vector objects; for (size_t index = 0; index < kSize; ++index) { objects.push_back(index); } ASSERT_FALSE(resourceMap.contains(0)); ASSERT_EQ(nullptr, resourceMap.query(0)); ASSERT_FALSE(resourceMap.contains(100)); ASSERT_EQ(nullptr, resourceMap.query(100)); for (size_t &object : objects) { resourceMap.assign(object, &object); } ASSERT_FALSE(resourceMap.empty()); for (size_t &object : objects) { ASSERT_TRUE(resourceMap.contains(object)); ASSERT_EQ(&object, resourceMap.query(object)); } ASSERT_FALSE(resourceMap.contains(10)); ASSERT_EQ(nullptr, resourceMap.query(10)); ASSERT_FALSE(resourceMap.contains(100)); ASSERT_EQ(nullptr, resourceMap.query(100)); for (size_t object : objects) { size_t *found = nullptr; ASSERT_TRUE(resourceMap.erase(object, &found)); ASSERT_EQ(object, *found); } ASSERT_TRUE(resourceMap.empty()); ASSERT_FALSE(resourceMap.contains(0)); ASSERT_EQ(nullptr, resourceMap.query(0)); ASSERT_FALSE(resourceMap.contains(100)); ASSERT_EQ(nullptr, resourceMap.query(100)); } } // anonymous namespace