using System.Linq; using AcDream.App.Streaming; using AcDream.Core.World; using DatReaderWriter.DBObjs; using Xunit; namespace AcDream.Core.Tests.Streaming; public class GpuWorldStateTwoTierTests { private static LoadedLandblock MakeStubLandblock(uint canonicalId, params WorldEntity[] entities) => new(canonicalId, new LandBlock(), entities); private static WorldEntity MakeStubEntity(uint id) => new() { Id = id, SourceGfxObjOrSetupId = 0x01000001u, Position = System.Numerics.Vector3.Zero, Rotation = System.Numerics.Quaternion.Identity, MeshRefs = System.Array.Empty(), }; [Fact] public void RemoveEntitiesFromLandblock_KeepsLandblockButDropsEntities() { var state = new GpuWorldState(); var lb = MakeStubLandblock(0xAAAAFFFFu, MakeStubEntity(1), MakeStubEntity(2)); state.AddLandblock(lb); Assert.Equal(2, state.Entities.Count); state.RemoveEntitiesFromLandblock(0xAAAAFFFFu); Assert.Empty(state.Entities); Assert.True(state.IsLoaded(0xAAAAFFFFu)); // landblock still resident } [Fact] public void AddEntitiesToExistingLandblock_MergesIntoExistingRecord() { var state = new GpuWorldState(); var lb = MakeStubLandblock(0xAAAAFFFFu, MakeStubEntity(1)); state.AddLandblock(lb); state.AddEntitiesToExistingLandblock(0xAAAAFFFFu, new[] { MakeStubEntity(2), MakeStubEntity(3), }); Assert.Equal(3, state.Entities.Count); } [Fact] public void AddEntitiesToExistingLandblock_LandblockNotYetLoaded_ParksInPending() { var state = new GpuWorldState(); // Landblock not loaded yet. state.AddEntitiesToExistingLandblock(0xAAAAFFFFu, new[] { MakeStubEntity(1), MakeStubEntity(2), }); // Nothing in the flat view yet. Assert.Empty(state.Entities); Assert.Equal(2, state.PendingLiveEntityCount); // Now load the landblock — pending entities should merge in. state.AddLandblock(MakeStubLandblock(0xAAAAFFFFu)); Assert.Equal(2, state.Entities.Count); } }