137 lines
3.4 KiB
C++
137 lines
3.4 KiB
C++
//
|
|
// 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 <gtest/gtest.h>
|
|
|
|
#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<size_t, GLuint> resourceMap;
|
|
std::vector<size_t> 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<size_t, GLuint> resourceMap;
|
|
std::vector<size_t> 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<size_t, GLuint> resourceMap;
|
|
std::vector<size_t> 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<size_t, GLuint> resourceMap;
|
|
std::vector<size_t> 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
|