From 0b50a57239cd69a1acfdb676a339ffa19caeca36 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Tue, 17 Mar 2026 23:07:33 +0800 Subject: [PATCH] test(Resources): Add ResourceCache tests (8 test cases) --- tests/Resources/CMakeLists.txt | 2 + tests/Resources/test_resource_cache.cpp | 147 ++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 tests/Resources/test_resource_cache.cpp diff --git a/tests/Resources/CMakeLists.txt b/tests/Resources/CMakeLists.txt index 4f840494..acf9f3a0 100644 --- a/tests/Resources/CMakeLists.txt +++ b/tests/Resources/CMakeLists.txt @@ -6,6 +6,8 @@ set(RESOURCES_TEST_SOURCES test_resource_types.cpp test_resource_guid.cpp test_iresource.cpp + test_resource_handle.cpp + test_resource_cache.cpp ) add_executable(xcengine_resources_tests ${RESOURCES_TEST_SOURCES}) diff --git a/tests/Resources/test_resource_cache.cpp b/tests/Resources/test_resource_cache.cpp new file mode 100644 index 00000000..4efe0f85 --- /dev/null +++ b/tests/Resources/test_resource_cache.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include +#include + +using namespace XCEngine::Resources; +using namespace XCEngine::Containers; + +namespace { + +class TestResource : public IResource { +public: + ResourceType GetType() const override { return ResourceType::Texture; } + const String& GetName() const override { return m_name; } + const String& GetPath() const override { return m_path; } + ResourceGUID GetGUID() const override { return m_guid; } + bool IsValid() const override { return m_isValid; } + size_t GetMemorySize() const override { return m_memorySize; } + void Release() override { delete this; } +}; + +TEST(ResourceCache, AddAndFind) { + ResourceCache cache; + + TestResource* resource = new TestResource(); + resource->Initialize({ "Test", "test.png", ResourceGUID(100), 1024 }); + + ResourceGUID guid(100); + cache.Add(guid, resource); + + IResource* found = cache.Find(guid); + EXPECT_EQ(found, resource); + + cache.Remove(guid); + found = cache.Find(guid); + EXPECT_EQ(found, nullptr); +} + +TEST(ResourceCache, GetSize) { + ResourceCache cache; + + EXPECT_EQ(cache.GetSize(), 0u); + + TestResource* resource1 = new TestResource(); + resource1->Initialize({ "Test1", "test1.png", ResourceGUID(1), 100 }); + cache.Add(ResourceGUID(1), resource1); + EXPECT_EQ(cache.GetSize(), 1u); + + TestResource* resource2 = new TestResource(); + resource2->Initialize({ "Test2", "test2.png", ResourceGUID(2), 200 }); + cache.Add(ResourceGUID(2), resource2); + EXPECT_EQ(cache.GetSize(), 2u); +} + +TEST(ResourceCache, GetMemoryUsage) { + ResourceCache cache; + + EXPECT_EQ(cache.GetMemoryUsage(), 0u); + + TestResource* resource1 = new TestResource(); + resource1->Initialize({ "Test1", "test1.png", ResourceGUID(1), 100 }); + cache.Add(ResourceGUID(1), resource1); + EXPECT_EQ(cache.GetMemoryUsage(), 100u); + + TestResource* resource2 = new TestResource(); + resource2->Initialize({ "Test2", "test2.png", ResourceGUID(2), 200 }); + cache.Add(ResourceGUID(2), resource2); + EXPECT_EQ(cache.GetMemoryUsage(), 300u); +} + +TEST(ResourceCache, SetMemoryBudget) { + ResourceCache cache; + + EXPECT_EQ(cache.GetMemoryBudget(), 512 * 1024 * 1024u); + + cache.SetMemoryBudget(1024); + EXPECT_EQ(cache.GetMemoryBudget(), 1024u); +} + +TEST(ResourceCache, Touch) { + ResourceCache cache; + + TestResource* resource = new TestResource(); + resource->Initialize({ "Test", "test.png", ResourceGUID(100), 100 }); + + ResourceGUID guid(100); + cache.Add(guid, resource); + cache.Touch(guid); + + IResource* found = cache.Find(guid); + EXPECT_EQ(found, resource); +} + +TEST(ResourceCache, Clear) { + ResourceCache cache; + + TestResource* resource1 = new TestResource(); + resource1->Initialize({ "Test1", "test1.png", ResourceGUID(1), 100 }); + cache.Add(ResourceGUID(1), resource1); + + TestResource* resource2 = new TestResource(); + resource2->Initialize({ "Test2", "test2.png", ResourceGUID(2), 200 }); + cache.Add(ResourceGUID(2), resource2); + + EXPECT_EQ(cache.GetSize(), 2u); + + cache.Clear(); + EXPECT_EQ(cache.GetSize(), 0u); + EXPECT_EQ(cache.GetMemoryUsage(), 0u); +} + +TEST(ResourceCache, OnMemoryPressure) { + ResourceCache cache; + cache.SetMemoryBudget(150); + + TestResource* resource1 = new TestResource(); + resource1->Initialize({ "Test1", "test1.png", ResourceGUID(1), 100 }); + cache.Add(ResourceGUID(1), resource1); + EXPECT_EQ(cache.GetMemoryUsage(), 100u); + + TestResource* resource2 = new TestResource(); + resource2->Initialize({ "Test2", "test2.png", ResourceGUID(2), 100 }); + cache.Add(ResourceGUID(2), resource2); + EXPECT_EQ(cache.GetMemoryUsage(), 200u); + + cache.OnMemoryPressure(50); + EXPECT_LE(cache.GetMemoryUsage(), 150u); +} + +TEST(ResourceCache, GetLRUList) { + ResourceCache cache; + + TestResource* resource1 = new TestResource(); + resource1->Initialize({ "Test1", "test1.png", ResourceGUID(1), 100 }); + cache.Add(ResourceGUID(1), resource1); + + TestResource* resource2 = new TestResource(); + resource2->Initialize({ "Test2", "test2.png", ResourceGUID(2), 200 }); + cache.Add(ResourceGUID(2), resource2); + + auto lruList = cache.GetLRUList(2); + EXPECT_GE(lruList.Size(), 0u); +} + +} // namespace