using AcDream.Core.World; using DatReaderWriter.DBObjs; using DatReaderWriter.Types; namespace AcDream.Core.Tests.World; /// /// Tests for . The adapter converts our /// LandBlock dat type (Terrain TerrainInfo[81] + Height byte[81]) into /// WorldBuilder's [81] /// shape, which WB's TerrainUtils / SceneryRenderManager consume. /// /// Bit layout in LandBlock.Terrain[i] (TerrainInfo / ushort): /// bits 0-1 : Road (2 bits) → WB TerrainEntry.Road /// bits 2-6 : TerrainType (5 bits) → WB TerrainEntry.Type /// bits 11-15 : SceneType (5 bits) → WB TerrainEntry.Scenery /// Height comes from LandBlock.Height[i] (byte) → WB TerrainEntry.Height. /// public class WbSceneryAdapterTests { [Fact] public void BuildTerrainEntries_PreservesRoadTextureSceneryHeight() { var block = new LandBlock(); // Vertex 0: road=0x3, type=0x00, scenery=0x1F, height=42 // raw layout: bits 0-1=11, bits 2-6=00000, bits 7-10=0000, bits 11-15=11111 // = 0xF803 block.Terrain[0] = (TerrainInfo)0xF803; block.Height[0] = 42; // Vertex 80: road=0x0, type=0x1F, scenery=0x00, height=200 // raw layout: bits 0-1=00, bits 2-6=11111, bits 11-15=00000 // = 0x007C block.Terrain[80] = (TerrainInfo)0x007C; block.Height[80] = 200; var entries = WbSceneryAdapter.BuildTerrainEntries(block); Assert.Equal(81, entries.Length); Assert.Equal((byte)42, entries[0].Height); Assert.Equal((byte)0x3, entries[0].Road); Assert.Equal((byte)0x00, entries[0].Type); Assert.Equal((byte)0x1F, entries[0].Scenery); Assert.Equal((byte)200, entries[80].Height); Assert.Equal((byte)0x0, entries[80].Road); Assert.Equal((byte)0x1F, entries[80].Type); Assert.Equal((byte)0x00, entries[80].Scenery); } [Fact] public void BuildTerrainEntries_AllZeros_ProducesEmptyEntries() { var block = new LandBlock(); // Terrain and Height are already zero-initialized by LandBlock constructor. var entries = WbSceneryAdapter.BuildTerrainEntries(block); Assert.All(entries, e => { Assert.Equal((byte)0, e.Height); Assert.Equal((byte)0, e.Road); Assert.Equal((byte)0, e.Type); Assert.Equal((byte)0, e.Scenery); }); } [Fact] public void BuildTerrainEntries_NullBlock_Throws() { Assert.Throws(() => WbSceneryAdapter.BuildTerrainEntries(null!)); } }