83 lines
3.9 KiB
C#
83 lines
3.9 KiB
C#
using System.IO;
|
|
using System.Text.Json;
|
|
using AcDream.App.UI.Layout;
|
|
|
|
namespace AcDream.App.Tests.UI.Layout;
|
|
|
|
/// <summary>
|
|
/// Loads the committed layout ElementInfo fixtures and builds widget trees —
|
|
/// no dats required. Fixtures were generated from the real portal.dat and
|
|
/// serialized with <see cref="System.Text.Json"/>.
|
|
/// </summary>
|
|
public static class FixtureLoader
|
|
{
|
|
private static readonly JsonSerializerOptions _opts = new()
|
|
{
|
|
IncludeFields = true,
|
|
};
|
|
|
|
/// <summary>
|
|
/// Deserializes the committed <c>vitals_2100006C.json</c> fixture (copied to
|
|
/// the test output directory via the csproj <c>CopyToOutputDirectory</c> item)
|
|
/// into an <see cref="ElementInfo"/> tree, then builds and returns the
|
|
/// <see cref="ImportedLayout"/> using a null-returning sprite resolver and no
|
|
/// dat font — sufficient for conformance checks on tree structure and slice ids.
|
|
/// </summary>
|
|
public static ImportedLayout LoadVitals()
|
|
{
|
|
var root = LoadVitalsInfos();
|
|
return LayoutImporter.Build(root, _ => (0u, 0, 0), null);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Deserializes the committed <c>vitals_2100006C.json</c> fixture into a raw
|
|
/// <see cref="ElementInfo"/> tree WITHOUT calling <see cref="LayoutImporter.Build"/>.
|
|
/// Use this when the test needs to inspect the resolved <see cref="ElementInfo"/>
|
|
/// tree directly (e.g. inheritance-resolution checks) without exercising the
|
|
/// widget factory.
|
|
/// </summary>
|
|
public static AcDream.App.UI.Layout.ElementInfo LoadVitalsInfos()
|
|
=> LoadInfos("vitals_2100006C.json");
|
|
|
|
/// <summary>
|
|
/// Deserializes the committed <c>chat_21000006.json</c> fixture into a raw
|
|
/// <see cref="ElementInfo"/> tree and builds the <see cref="ImportedLayout"/>
|
|
/// using a null-returning sprite resolver and no dat font — sufficient for
|
|
/// conformance checks on tree structure and resolved types.
|
|
/// </summary>
|
|
public static ImportedLayout LoadChat()
|
|
=> LayoutImporter.Build(LoadChatInfos(), _ => (0u, 0, 0), null);
|
|
|
|
/// <summary>
|
|
/// Deserializes the committed <c>chat_21000006.json</c> fixture into a raw
|
|
/// <see cref="ElementInfo"/> tree WITHOUT calling <see cref="LayoutImporter.Build"/>.
|
|
/// Use this when the test needs to inspect the resolved <see cref="ElementInfo"/>
|
|
/// tree directly (e.g. resolved Type values per element id).
|
|
/// </summary>
|
|
public static AcDream.App.UI.Layout.ElementInfo LoadChatInfos()
|
|
=> LoadInfos("chat_21000006.json");
|
|
|
|
/// <summary>Builds the committed retail radar LayoutDesc 0x21000074 fixture.</summary>
|
|
public static ImportedLayout LoadRadar()
|
|
=> LayoutImporter.Build(LoadRadarInfos(), _ => (0u, 0, 0), null);
|
|
|
|
/// <summary>Returns the resolved ElementInfo tree for retail radar LayoutDesc 0x21000074.</summary>
|
|
public static AcDream.App.UI.Layout.ElementInfo LoadRadarInfos()
|
|
=> LoadInfos("radar_21000074.json");
|
|
|
|
// ── Shared loader ────────────────────────────────────────────────────────
|
|
|
|
private static AcDream.App.UI.Layout.ElementInfo LoadInfos(string fileName)
|
|
{
|
|
var path = Path.Combine(AppContext.BaseDirectory, "UI", "Layout", "fixtures", fileName);
|
|
if (!File.Exists(path)) throw new FileNotFoundException($"fixture not found at: {path}");
|
|
var bytes = File.ReadAllBytes(path);
|
|
// Strip UTF-8 BOM (EF BB BF) if present so JsonSerializer.Deserialize<T>(ReadOnlySpan<byte>)
|
|
// does not reject the first byte.
|
|
ReadOnlySpan<byte> span = bytes;
|
|
if (span.Length >= 3 && span[0] == 0xEF && span[1] == 0xBB && span[2] == 0xBF)
|
|
span = span[3..];
|
|
return JsonSerializer.Deserialize<AcDream.App.UI.Layout.ElementInfo>(span, _opts)
|
|
?? throw new InvalidOperationException($"fixture deserialized to null: {path}");
|
|
}
|
|
}
|