blob: 056dde518ab19cab505fffbc0762bb9267ec56ca [file] [log] [blame]
//
// 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