Third owner-screenshot round: acdream fit one more word per line than retail and drew glyphs flush against the popup's right border. Retail's InqSizewMargins @0x00469660 wraps the glyph list at (bound - m_margL - m_margR) and adds the margins back into the measured width; the popup skins' shared text child 0x10000396 authors margins L=2/R=2 (U=2/D=2 on three of the four skins — live-DAT probed). The presenter now subtracts the horizontal margins from both wrap passes, re-adds them into the measured width used for root sizing, and counts the vertical margins in the measured/re-wrapped heights; the widget's own draw already insets by all four margins (UiText ContentOffsetX + the top/bottom inset), so the right-side spacing returns for free. TooltipSkinLiveDatTests pins the authored margins per skin alongside the P0x3D=256 wrap bound; a new presenter test proves margins shrink the wrap bound and survive onto the widget. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
55 lines
2.3 KiB
C#
55 lines
2.3 KiB
C#
using AcDream.App.UI.Layout;
|
|
using DatReaderWriter;
|
|
|
|
namespace AcDream.App.Tests.UI.Layout;
|
|
|
|
/// <summary>
|
|
/// CA5 re-check pin (2026-08-24): the popup skins' shared TEXT CHILD
|
|
/// (0x10000396) authors <c>P0x3D=256</c> — the wrap width retail's
|
|
/// <c>InqSizewMargins UITS_MAX_WIDTH</c> reads BEFORE its display-width
|
|
/// fallback. TS-85's earlier "zero elements author P0x3D" sweep covered
|
|
/// hover TARGETS only, never the popup skins; this pin closes that gap so
|
|
/// a DAT revision (or importer regression) that loses the bound fails
|
|
/// loudly instead of silently un-wrapping every tooltip.
|
|
/// </summary>
|
|
[Trait("Lane", "InstalledDat")]
|
|
public sealed class TooltipSkinLiveDatTests
|
|
{
|
|
private static string DatDirectory =>
|
|
Path.Combine(
|
|
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
|
"Documents", "Asheron's Call");
|
|
|
|
[InstalledDatFact]
|
|
public void EveryPopupSkinTextChildAuthorsTheRetailWrapBound()
|
|
{
|
|
using var dats = new DatCollection(
|
|
DatDirectory, DatReaderWriter.Options.DatAccessType.Read);
|
|
ElementInfo? tree = LayoutImporter.ImportInfos(dats, 0x21000041u);
|
|
Assert.NotNull(tree);
|
|
|
|
int textChildren = 0;
|
|
void Walk(ElementInfo e, uint parentId)
|
|
{
|
|
if (e.Id == 0x10000396u && e.Type == 12)
|
|
{
|
|
textChildren++;
|
|
Assert.Equal(256, e.MaxWidth);
|
|
// Retail wraps at (256 - margL - margR) and draws inset by
|
|
// the margins — the CA5 owner-screenshot delta (one extra
|
|
// word on line one + text flush against the right border).
|
|
// All four skins author L=2/R=2; skin 0x10000398 alone
|
|
// authors no vertical margins (live-DAT probe 2026-08-24).
|
|
Assert.Equal(2, e.MarginLeft);
|
|
Assert.Equal(2, e.MarginRight);
|
|
int vertical = parentId == 0x10000398u ? 0 : 2;
|
|
Assert.Equal(vertical, e.MarginTop);
|
|
Assert.Equal(vertical, e.MarginBottom);
|
|
}
|
|
foreach (var c in e.Children) Walk(c, e.Id);
|
|
}
|
|
Walk(tree!, 0);
|
|
Assert.True(textChildren >= 4,
|
|
$"expected the text child under all four popup skins, found {textChildren}");
|
|
}
|
|
}
|