From 55b17e15fdbf5b5e4802be4cbaa5e9de08a0514c Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 12 Aug 2026 07:33:50 +0200 Subject: [PATCH] fix #FA4-mechanism-SF-6: assert (not just print) the live-DAT checkbox labels and Open/Close captions SocialPanelLiveMountProbeTests wrote the four checkbox labels and the two Open/Close captions to the console with no assertion, yet the FA4 ledger's live-DAT paragraph cited them as verified -- the same finding FA3's own mechanism SF-3 raised for a different table ("printed but never asserted -- deserves a real assertion, not just a hope"). Now asserts each label is non-null/non-empty and the two captions equal the exact retail strings "Open"/"Close". Env-gated (ACDREAM_PROBE_LIVE_MOUNT=1, real installed DATs) -- inert in this session's build/test run. Co-Authored-By: Claude Fable 5 --- .../Layout/SocialPanelLiveMountProbeTests.cs | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/tests/AcDream.App.Tests/UI/Layout/SocialPanelLiveMountProbeTests.cs b/tests/AcDream.App.Tests/UI/Layout/SocialPanelLiveMountProbeTests.cs index bf6d50c4..c53a8fe3 100644 --- a/tests/AcDream.App.Tests/UI/Layout/SocialPanelLiveMountProbeTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/SocialPanelLiveMountProbeTests.cs @@ -181,7 +181,10 @@ public sealed class SocialPanelLiveMountProbeTests // Checkbox labels/tooltips (0x23000003) and the Open/Close caption // pair (0x23000001) — the two string tables SocialFellowshipPageController - // resolves at Bind time (lane A §4.3). + // resolves at Bind time (lane A §4.3). Fix-round SF-6: these were + // previously PRINTED but never asserted even though the ledger's + // live-DAT paragraph cited them as verified — the same finding + // FA3's own mechanism SF-3 raised for a different table. foreach (string retailName in new[] { "IgnoreFellowshipRequests", "FellowshipAutoAcceptRequests", @@ -190,15 +193,19 @@ public sealed class SocialPanelLiveMountProbeTests { string? label = strings.Resolve(0x23000003u, DatStringResolver.ComputeHash($"ID_PlayerOption_{retailName}")); Console.WriteLine($"[socialprobe] checkbox label ID_PlayerOption_{retailName} -> '{label}'"); + Assert.False( + string.IsNullOrEmpty(label), + $"checkbox label ID_PlayerOption_{retailName} (table 0x23000003) did not resolve."); } - foreach (string key in new[] - { - "ID_Fellowship_OpenFellowshipButtonText", "ID_Fellowship_CloseFellowshipButtonText", - }) - { - string? label = strings.Resolve(0x23000001u, DatStringResolver.ComputeHash(key)); - Console.WriteLine($"[socialprobe] fellowship caption {key} -> '{label}'"); - } + + string? openLabel = strings.Resolve( + 0x23000001u, DatStringResolver.ComputeHash("ID_Fellowship_OpenFellowshipButtonText")); + string? closeLabel = strings.Resolve( + 0x23000001u, DatStringResolver.ComputeHash("ID_Fellowship_CloseFellowshipButtonText")); + Console.WriteLine($"[socialprobe] fellowship caption ID_Fellowship_OpenFellowshipButtonText -> '{openLabel}'"); + Console.WriteLine($"[socialprobe] fellowship caption ID_Fellowship_CloseFellowshipButtonText -> '{closeLabel}'"); + Assert.Equal("Open", openLabel); + Assert.Equal("Close", closeLabel); // Full end-to-end Bind against the PRODUCTION mount (the same // resolver/scrollbar/frame wiring MountSocialPanel does) — proves