using System.Numerics; using AcDream.Core.World; using DatReaderWriter.DBObjs; using DatReaderWriter.Types; namespace AcDream.Core.Tests.World; public class LandblockLoaderTests { private static LandBlock BuildFlatLandBlock() { var block = new LandBlock { HasObjects = true, Terrain = new TerrainInfo[81], Height = new byte[81], }; for (int i = 0; i < 81; i++) { block.Terrain[i] = (ushort)0; block.Height[i] = 0; } return block; } [Fact] public void BuildEntitiesFromInfo_StabsAndBuildings_AreMappedToEntities() { var info = new LandBlockInfo { Objects = { new Stab { Id = 0x01000042u, // GfxObj id Frame = new Frame { Origin = new Vector3(10, 20, 5), Orientation = Quaternion.Identity, }, }, new Stab { Id = 0x02000099u, // Setup id Frame = new Frame { Origin = new Vector3(30, 40, 10), Orientation = Quaternion.Identity, }, }, }, Buildings = { new BuildingInfo { ModelId = 0x020000AAu, // Setup for a building Frame = new Frame { Origin = new Vector3(50, 60, 0), Orientation = Quaternion.Identity, }, }, }, }; var entities = LandblockLoader.BuildEntitiesFromInfo(info); Assert.Equal(3, entities.Count); Assert.Contains(entities, e => e.SourceGfxObjOrSetupId == 0x01000042u && e.Position == new Vector3(10, 20, 5)); Assert.Contains(entities, e => e.SourceGfxObjOrSetupId == 0x02000099u && e.Position == new Vector3(30, 40, 10)); Assert.Contains(entities, e => e.SourceGfxObjOrSetupId == 0x020000AAu && e.Position == new Vector3(50, 60, 0)); } [Fact] public void BuildEntitiesFromInfo_AssignsMonotonicIds() { var info = new LandBlockInfo { Objects = { new Stab { Id = 0x01000001u, Frame = new Frame() }, new Stab { Id = 0x01000002u, Frame = new Frame() }, new Stab { Id = 0x01000003u, Frame = new Frame() }, }, }; var entities = LandblockLoader.BuildEntitiesFromInfo(info); var ids = entities.Select(e => e.Id).OrderBy(i => i).ToArray(); Assert.Equal(3, ids.Distinct().Count()); // all unique } [Fact] public void BuildEntitiesFromInfo_UnsupportedIdType_IsSkipped() { // 0x03xxxxxx is neither GfxObj (0x01) nor Setup (0x02). var info = new LandBlockInfo { Objects = { new Stab { Id = 0x01000001u, Frame = new Frame() }, new Stab { Id = 0x03000002u, Frame = new Frame() }, // skipped new Stab { Id = 0x02000003u, Frame = new Frame() }, }, }; var entities = LandblockLoader.BuildEntitiesFromInfo(info); Assert.Equal(2, entities.Count); Assert.DoesNotContain(entities, e => e.SourceGfxObjOrSetupId == 0x03000002u); } [Fact] public void BuildEntitiesFromInfo_Empty_ReturnsEmpty() { var entities = LandblockLoader.BuildEntitiesFromInfo(new LandBlockInfo()); Assert.Empty(entities); } }