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);
}
}