using AcDream.App.UI; using AcDream.App.UI.Layout; namespace AcDream.App.Tests.UI.Layout; /// /// Golden conformance tests for the vitals LayoutDesc importer. /// Uses the committed JSON fixture (vitals_2100006C.json) — no dats, no GL. /// /// These tests lock the importer's tree-building (factory dispatch, meter slice /// extraction, rects) against the real portal.dat values captured when the /// fixture was generated. Any regression in , /// , or will surface here. /// /// Sprite ids sourced from docs/research/2026-06-15-layoutdesc-format.md §11. /// public class LayoutConformanceTests { // ── Test 1: Three meters at expected rects ──────────────────────────────── /// /// The three vital bars must be UiMeters positioned at x=5, width=150, height=16, /// at y=5 (health), y=21 (stamina), y=37 (mana). /// [Fact] public void VitalsTree_HasThreeMetersAtExpectedRects() { var layout = FixtureLoader.LoadVitals(); (uint Id, float Y)[] expected = [ (0x100000E6u, 5f), // health (0x100000ECu, 21f), // stamina (0x100000EEu, 37f), // mana ]; foreach (var (id, y) in expected) { var elem = layout.FindElement(id); Assert.NotNull(elem); var meter = Assert.IsType(elem); Assert.Equal(5f, meter.Left); Assert.Equal(y, meter.Top); Assert.Equal(150f, meter.Width); Assert.Equal(16f, meter.Height); } } // ── Test 2: All 18 slice ids ────────────────────────────────────────────── /// /// The six back+front 3-slice sprite ids for each of the three meters must /// match the values confirmed from the dat dump (format doc §11). /// This proves the factory's grandchild slice extraction against committed data. /// [Fact] public void VitalsTree_MetersHaveExpectedSliceIds() { var layout = FixtureLoader.LoadVitals(); // Health bar { var elem = layout.FindElement(0x100000E6u); var m = Assert.IsType(elem); Assert.Equal(0x0600747Eu, m.BackLeft); Assert.Equal(0x0600747Fu, m.BackTile); Assert.Equal(0x06007480u, m.BackRight); Assert.Equal(0x06007481u, m.FrontLeft); Assert.Equal(0x06007482u, m.FrontTile); Assert.Equal(0x06007483u, m.FrontRight); } // Stamina bar { var elem = layout.FindElement(0x100000ECu); var m = Assert.IsType(elem); Assert.Equal(0x06007484u, m.BackLeft); Assert.Equal(0x06007485u, m.BackTile); Assert.Equal(0x06007486u, m.BackRight); Assert.Equal(0x06007487u, m.FrontLeft); Assert.Equal(0x06007488u, m.FrontTile); Assert.Equal(0x06007489u, m.FrontRight); } // Mana bar { var elem = layout.FindElement(0x100000EEu); var m = Assert.IsType(elem); Assert.Equal(0x0600748Au, m.BackLeft); Assert.Equal(0x0600748Bu, m.BackTile); Assert.Equal(0x0600748Cu, m.BackRight); Assert.Equal(0x0600748Du, m.FrontLeft); Assert.Equal(0x0600748Eu, m.FrontTile); Assert.Equal(0x0600748Fu, m.FrontRight); } } // ── Test 3: Chrome TL corner sprite ─────────────────────────────────────── /// /// The top-left chrome corner element (id 0x10000633) must be a /// whose active media file id is 0x060074C3. /// [Fact] public void VitalsTree_ChromeCornerHasExpectedSprite() { var layout = FixtureLoader.LoadVitals(); var elem = layout.FindElement(0x10000633u); Assert.NotNull(elem); var datElem = Assert.IsType(elem); var (file, _) = datElem.ActiveMedia(); Assert.Equal(0x060074C3u, file); } }