From aea4460eae4624619c5012c1195e21b4f5e33ee1 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 10 May 2026 17:42:09 +0200 Subject: [PATCH] feat(render #53): EntityClassificationCache.InvalidateEntity + tests Idempotent removal of a cached entry by entity id. Tests #4 and #5 from spec section 7.1 lock in the contract. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Rendering/Wb/EntityClassificationCache.cs | 9 ++++++++ .../Wb/EntityClassificationCacheTests.cs | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/AcDream.App/Rendering/Wb/EntityClassificationCache.cs b/src/AcDream.App/Rendering/Wb/EntityClassificationCache.cs index 5683346..7d5a65b 100644 --- a/src/AcDream.App/Rendering/Wb/EntityClassificationCache.cs +++ b/src/AcDream.App/Rendering/Wb/EntityClassificationCache.cs @@ -62,4 +62,13 @@ internal sealed class EntityClassificationCache Batches = batches, }; } + + /// + /// Remove the cache entry for . No-op if the + /// id isn't cached. + /// + public void InvalidateEntity(uint entityId) + { + _entries.Remove(entityId); + } } diff --git a/tests/AcDream.Core.Tests/Rendering/Wb/EntityClassificationCacheTests.cs b/tests/AcDream.Core.Tests/Rendering/Wb/EntityClassificationCacheTests.cs index 6f37bff..a7949c1 100644 --- a/tests/AcDream.Core.Tests/Rendering/Wb/EntityClassificationCacheTests.cs +++ b/tests/AcDream.Core.Tests/Rendering/Wb/EntityClassificationCacheTests.cs @@ -103,6 +103,29 @@ public class EntityClassificationCacheTests Assert.Equal(0x105u, entry.Batches[5].BindlessTextureHandle); } + [Fact] + public void InvalidateEntity_RemovesEntry() + { + var cache = new EntityClassificationCache(); + cache.Populate(100, 0u, new[] { MakeCachedBatch(1, 0, 6, 0xAA) }); + Assert.True(cache.TryGet(100, out _)); + + cache.InvalidateEntity(100); + + Assert.False(cache.TryGet(100, out var entry)); + Assert.Null(entry); + Assert.Equal(0, cache.Count); + } + + [Fact] + public void InvalidateEntity_OnMissingId_NoThrow() + { + var cache = new EntityClassificationCache(); + var ex = Record.Exception(() => cache.InvalidateEntity(99999)); + Assert.Null(ex); + Assert.Equal(0, cache.Count); + } + private static CachedBatch MakeCachedBatch( uint ibo, uint firstIndex, int indexCount, ulong texHandle) {