feat(Resources): Add ResourceDependencyGraph for resource dependency tracking
- Implement dependency graph for resource management - Add/remove nodes and dependencies - Reference counting support - Circular dependency detection - Add unit tests
This commit is contained in:
@@ -22,6 +22,7 @@ set(RESOURCES_TEST_SOURCES
|
||||
test_shader_loader.cpp
|
||||
test_material_loader.cpp
|
||||
test_resource_package.cpp
|
||||
test_resource_dependency.cpp
|
||||
)
|
||||
|
||||
add_executable(xcengine_resources_tests ${RESOURCES_TEST_SOURCES})
|
||||
|
||||
131
tests/Resources/test_resource_dependency.cpp
Normal file
131
tests/Resources/test_resource_dependency.cpp
Normal file
@@ -0,0 +1,131 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <XCEngine/Resources/ResourceDependencyGraph.h>
|
||||
#include <XCEngine/Resources/ResourceTypes.h>
|
||||
|
||||
using namespace XCEngine::Resources;
|
||||
using namespace XCEngine::Containers;
|
||||
|
||||
namespace {
|
||||
|
||||
TEST(ResourceDependencyGraph, DefaultConstructor) {
|
||||
ResourceDependencyGraph graph;
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, AddNode) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Texture);
|
||||
EXPECT_TRUE(graph.HasNode(ResourceGUID(1)));
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, AddMultipleNodes) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Texture);
|
||||
graph.AddNode(ResourceGUID(2), ResourceType::Mesh);
|
||||
graph.AddNode(ResourceGUID(3), ResourceType::Material);
|
||||
|
||||
EXPECT_TRUE(graph.HasNode(ResourceGUID(1)));
|
||||
EXPECT_TRUE(graph.HasNode(ResourceGUID(2)));
|
||||
EXPECT_TRUE(graph.HasNode(ResourceGUID(3)));
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, RemoveNode) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Texture);
|
||||
EXPECT_TRUE(graph.HasNode(ResourceGUID(1)));
|
||||
|
||||
graph.RemoveNode(ResourceGUID(1));
|
||||
EXPECT_FALSE(graph.HasNode(ResourceGUID(1)));
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, AddDependency) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Material);
|
||||
graph.AddNode(ResourceGUID(2), ResourceType::Texture);
|
||||
|
||||
graph.AddDependency(ResourceGUID(1), ResourceGUID(2));
|
||||
|
||||
auto deps = graph.GetDependencies(ResourceGUID(1));
|
||||
EXPECT_EQ(deps.Size(), 1u);
|
||||
EXPECT_EQ(deps[0], ResourceGUID(2));
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, GetDependents) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Material);
|
||||
graph.AddNode(ResourceGUID(2), ResourceType::Texture);
|
||||
|
||||
graph.AddDependency(ResourceGUID(1), ResourceGUID(2));
|
||||
|
||||
auto dependents = graph.GetDependents(ResourceGUID(2));
|
||||
EXPECT_EQ(dependents.Size(), 1u);
|
||||
EXPECT_EQ(dependents[0], ResourceGUID(1));
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, GetAllDependencies) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Material);
|
||||
graph.AddNode(ResourceGUID(2), ResourceType::Texture);
|
||||
graph.AddNode(ResourceGUID(3), ResourceType::Shader);
|
||||
|
||||
graph.AddDependency(ResourceGUID(1), ResourceGUID(2));
|
||||
graph.AddDependency(ResourceGUID(1), ResourceGUID(3));
|
||||
|
||||
auto allDeps = graph.GetAllDependencies(ResourceGUID(1));
|
||||
EXPECT_EQ(allDeps.Size(), 2u);
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, RefCount) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Texture);
|
||||
|
||||
EXPECT_EQ(graph.GetRefCount(ResourceGUID(1)), 0u);
|
||||
|
||||
graph.IncrementRefCount(ResourceGUID(1));
|
||||
EXPECT_EQ(graph.GetRefCount(ResourceGUID(1)), 1u);
|
||||
|
||||
graph.IncrementRefCount(ResourceGUID(1));
|
||||
EXPECT_EQ(graph.GetRefCount(ResourceGUID(1)), 2u);
|
||||
|
||||
graph.DecrementRefCount(ResourceGUID(1));
|
||||
EXPECT_EQ(graph.GetRefCount(ResourceGUID(1)), 1u);
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, Unload) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Texture);
|
||||
|
||||
EXPECT_TRUE(graph.Unload(ResourceGUID(1)));
|
||||
|
||||
graph.IncrementRefCount(ResourceGUID(1));
|
||||
EXPECT_FALSE(graph.Unload(ResourceGUID(1)));
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, Clear) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Texture);
|
||||
graph.AddNode(ResourceGUID(2), ResourceType::Mesh);
|
||||
|
||||
EXPECT_TRUE(graph.HasNode(ResourceGUID(1)));
|
||||
EXPECT_TRUE(graph.HasNode(ResourceGUID(2)));
|
||||
|
||||
graph.Clear();
|
||||
|
||||
EXPECT_FALSE(graph.HasNode(ResourceGUID(1)));
|
||||
EXPECT_FALSE(graph.HasNode(ResourceGUID(2)));
|
||||
}
|
||||
|
||||
TEST(ResourceDependencyGraph, RemoveDependency) {
|
||||
ResourceDependencyGraph graph;
|
||||
graph.AddNode(ResourceGUID(1), ResourceType::Material);
|
||||
graph.AddNode(ResourceGUID(2), ResourceType::Texture);
|
||||
|
||||
graph.AddDependency(ResourceGUID(1), ResourceGUID(2));
|
||||
auto deps = graph.GetDependencies(ResourceGUID(1));
|
||||
EXPECT_EQ(deps.Size(), 1u);
|
||||
|
||||
graph.RemoveDependency(ResourceGUID(1), ResourceGUID(2));
|
||||
deps = graph.GetDependencies(ResourceGUID(1));
|
||||
EXPECT_EQ(deps.Size(), 0u);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
Reference in New Issue
Block a user