using AcDream.App.Rendering.Wb; using AcDream.Content; using Chorizite.Core.Render.Enums; namespace AcDream.App.Tests.Rendering.Wb; public sealed class MeshUploadCachesTests { [Fact] public void CpuCacheHit_AfterCompletedUpload_ReStagesExactlyOnceWithTexturePayload() { var staging = new MeshUploadStagingQueue(); var cache = new CpuMeshUploadCache(capacity: 2); byte[] textureBytes = [1, 2, 3, 4]; var data = new ObjectMeshData { ObjectId = 0x01000010ul, UploadAttempts = 2 }; data.TextureBatches[(1, 1, TextureFormat.RGBA8)] = [ new TextureBatchData { TextureData = textureBytes }, ]; cache.Store(data); Assert.True(staging.Stage(data)); Assert.True(staging.TryDequeue(out var initial)); Assert.Same(data, initial); staging.Complete(data.ObjectId); // GPU upload completed, then was later evicted. data.UploadAttempts = 3; Assert.True(cache.TryGetAndStage(data.ObjectId, staging, out var cached)); Assert.Same(data, cached); Assert.Equal(0, data.UploadAttempts); Assert.Equal(textureBytes, cached!.TextureBatches.Values.Single().Single().TextureData); Assert.True(cache.TryGetAndStage(data.ObjectId, staging, out _)); Assert.True(staging.TryDequeue(out var restaged)); Assert.Same(data, restaged); Assert.False(staging.TryDequeue(out _)); } [Fact] public void Retry_RetainsQueueOwnershipUntilCompletion() { var staging = new MeshUploadStagingQueue(); var data = new ObjectMeshData { ObjectId = 0x01000010ul }; Assert.True(staging.Stage(data)); Assert.True(staging.TryDequeue(out var attempt)); staging.Requeue(attempt!); Assert.False(staging.Stage(data)); Assert.True(staging.TryDequeue(out var retry)); Assert.Same(data, retry); staging.Complete(data.ObjectId); Assert.True(staging.Stage(data)); } [Fact] public void UploadCompletion_NeverManufacturesLogicalOwnership() { const ulong id = 0x01000010ul; var ownership = new MeshOwnershipCounter(); Assert.Equal(1, ownership.Acquire(id)); Assert.True(ownership.MarkUploadComplete(id)); Assert.Equal(1, ownership.Count(id)); Assert.Equal(0, ownership.Release(id)); Assert.False(ownership.MarkUploadComplete(id)); // late upload after unload Assert.Equal(0, ownership.Count(id)); } }