#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