test(D.2b): vitals importer conformance — golden fixture + tree/slice/chrome checks
Job 1: extract LayoutImporter.ImportInfos() (public dat-shell half that returns the resolved ElementInfo tree without building widgets) so fixture generation and conformance tests can call it directly. Import() now delegates to ImportInfos() + Build() — existing 32 Layout tests stay green. Job 2: generate tests/AcDream.App.Tests/UI/Layout/fixtures/vitals_2100006C.json from the real portal.dat via a throwaway [Fact] generator (deleted, not committed). System.Text.Json with IncludeFields=true — ValueTuple serializes as Item1/Item2. Pre-write validation confirmed health meter BackLeft=0x0600747E FrontRight=0x06007483 rect (5,5,150,16). Round-trip deserialization re-validated before writing. Job 3: FixtureLoader.LoadVitals() deserializes the fixture from the test output directory (CopyToOutputDirectory item in csproj) and returns ImportedLayout via LayoutImporter.Build(root, _ => (0,0,0), null) — no dats, no GL. Job 4: LayoutConformanceTests — 3 golden tests (35 asserts total): - VitalsTree_HasThreeMetersAtExpectedRects: 3 meters at x=5, w=150, h=16, y=5/21/37 - VitalsTree_MetersHaveExpectedSliceIds: all 18 back+front slice ids health/stamina/mana - VitalsTree_ChromeCornerHasExpectedSprite: TL corner 0x10000633 → sprite 0x060074C3 Full App suite: 326 pass / 1 skip (pre-existing) / 0 fail. Build: 0 errors, 0 warnings. Throwaway generator not committed (confirmed via git status). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
25be30b1a7
commit
3567135a04
5 changed files with 1238 additions and 14 deletions
|
|
@ -124,6 +124,25 @@ public static class LayoutImporter
|
|||
|
||||
// ── Dat shell ─────────────────────────────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Dat shell, ElementInfo half: load the layout + resolve inheritance + build the
|
||||
/// ElementInfo tree (no widgets). Exposed for fixture generation + conformance tests.
|
||||
/// Returns null if the layout is missing.
|
||||
/// </summary>
|
||||
public static ElementInfo? ImportInfos(DatCollection dats, uint layoutId)
|
||||
{
|
||||
var ld = dats.Get<LayoutDesc>(layoutId);
|
||||
if (ld is null) return null;
|
||||
|
||||
var tops = new List<ElementInfo>();
|
||||
foreach (var kv in ld.Elements)
|
||||
tops.Add(Resolve(dats, kv.Value, new HashSet<(uint, uint)>()));
|
||||
|
||||
return tops.Count == 1
|
||||
? tops[0]
|
||||
: new ElementInfo { Id = 0, Type = 3, Children = tops };
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dat shell: load the LayoutDesc, resolve inheritance for every top-level
|
||||
/// element, and build the widget tree. Returns null if the layout is absent
|
||||
|
|
@ -135,20 +154,8 @@ public static class LayoutImporter
|
|||
Func<uint, (uint, int, int)> resolve,
|
||||
UiDatFont? datFont)
|
||||
{
|
||||
var ld = dats.Get<LayoutDesc>(layoutId);
|
||||
if (ld is null) return null;
|
||||
|
||||
// Build a resolved ElementInfo for every top-level element in the layout.
|
||||
var tops = new List<ElementInfo>();
|
||||
foreach (var kv in ld.Elements)
|
||||
tops.Add(Resolve(dats, kv.Value, new HashSet<(uint, uint)>()));
|
||||
|
||||
// If there is exactly one top-level element use it directly as the root;
|
||||
// otherwise wrap the tops in a synthetic zero-id container.
|
||||
ElementInfo rootInfo = tops.Count == 1
|
||||
? tops[0]
|
||||
: new ElementInfo { Id = 0, Type = 3, Children = tops };
|
||||
|
||||
var rootInfo = ImportInfos(dats, layoutId);
|
||||
if (rootInfo is null) return null;
|
||||
return Build(rootInfo, resolve, datFont);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue