acdream/tests/AcDream.App.Tests/UI/Layout
Erik 6a15dd063c
All checks were successful
CI / linux-portable (push) Successful in 3m13s
CI / windows-gate (push) Successful in 5m15s
CI / release (push) Successful in 2m2s
fix: retail text and golden-string tests must not follow the machine's locale
Run 170's Windows gate went red on 37 tests across four assemblies while the
same commit passed 14,370/0 locally. The failures were all one family:

  Expected: "You have 1 500p"     <- built with the machine's culture
  Actual:   "You have 1,500p"     <- production, correctly invariant

The runner is Swedish; this dev box is not. These tests had been passing on CI
only because that machine's registry locale had been pinned by hand — machine
state, which came undone (almost certainly the reboot after today's hang).
Re-pinning it would be a workaround on one machine for a defect in the repo,
so this fixes the repo instead.

Two genuinely different bugs were hiding in that one symptom.

1. TESTS that build an expected string with the ambient culture and compare it
   to invariant production output, and test-side recording sinks whose traces
   are compared against literal golden strings. Those only ever passed on a
   machine that happens to format like the invariant culture. Pinned to
   InvariantCulture: the vendor purse/cost expectations, and the motion-funnel,
   animation-sequencer, framebuffer-resize, resource-slot, and runtime-attack
   trace sinks.

2. PRODUCTION that formats player-visible retail text with the ambient culture.
   This one matters beyond CI: retail is a US client, so it shows "2.50",
   "1,500p" and "(-20)" to everyone. On a Swedish machine acdream was showing
   "2,50", "1 500p" and "(-20)" with U+2212 MINUS SIGN — the audience for this
   alpha is literally Swedish. Converted 76 sites to InvariantCulture across the
   item/creature appraisal formatters, the character stat panel's buff and vitae
   parentheticals, the appraisal and link-status controllers, the chat
   /framerate and /location output, the camera sensitivity toast, the
   time-override toast, the F3 dump, the sky diagnostics, and the world-frame
   invariant-failure message.

   DATES are deliberately left on the current culture (CharacterController's
   birth/login stamp, RuntimeHouseState's purchase expiry). Retail has no answer
   for a non-US player's date format, and forcing "08/19/2026 7:00:00 PM" on
   them is a UX decision, not a retail-fidelity one.

Apparatus, so the next occurrence is reproducible instead of mysterious:
tests/TestCultureInitializer.cs adds an opt-in ACDREAM_TEST_CULTURE knob to
every test assembly, linked in through a new tests/Directory.Build.props.
Unset — what CI and everyone runs — it changes nothing.

  ACDREAM_TEST_CULTURE=sv-SE dotnet test ...

reproduced all 37 CI failures on this machine plus 6 more the runner's own
locale does not surface (the Unicode-minus family), and drove the fix.

Verified both ways on the full solution under the release-gate filter:
default culture 14,370 passed / 0 failed, and ACDREAM_TEST_CULTURE=sv-SE
14,370 passed / 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 19:56:09 +02:00
..
fixtures feat(ui): Map/House panel — slices 2+3, panel shell + Map tab 2026-08-17 02:04:19 +02:00
AppraisalUiControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
CharacterControllerTests.cs feat(render): Campaign V slice V11 commit 1 - delete ImGui, Studio, and the DevTools frontend 2026-07-28 23:56:04 +02:00
CharacterCreationAppearancePageSwatchColorTests.cs fix(chargen): Campaign CC gate round 1 re-test 2 — R3-5/R3-6 color-key swatch/gradient textures 2026-08-16 17:20:31 +02:00
CharacterCreationLiveDatTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
CharacterCreationUiControllerTests.cs fix(ui): systemic escape normalization at the string source 2026-08-17 13:26:25 +02:00
CharacterLayoutImportProbe.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
CharacterManagementLiveDatTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
CharacterManagementUiControllerTests.cs feat(chargen): Campaign CC slice CC7 — end-to-end create flow + connected checklist 2026-08-16 02:35:21 +02:00
CharacterOptionsPageControllerTests.cs feat(ui): vitals — Side By Side Vitals swaps retail's two vitals windows 2026-08-17 10:40:49 +02:00
CharacterScreensFixedCanvasArbiterTests.cs fix(chargen): Campaign CC CC7 review fix round — F1-F9 — REVIEW-CLOSED 2026-08-16 03:13:02 +02:00
CharacterSheetProviderTests.cs feat(player): port retail augmentation stat chain 2026-07-31 08:08:23 +02:00
CharacterStatControllerTests.cs fix(ui): refresh live skill rows 2026-07-31 08:22:46 +02:00
ChargenColorSpotComposerTests.cs fix(chargen): Campaign CC gate round 1 re-test 2 — R3-5/R3-6 color-key swatch/gradient textures 2026-08-16 17:20:31 +02:00
ChatIndicatorButtonLiveMountProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
ChatLayoutConformanceTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
ChatOptionsDatDefaultsTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
ChatOptionsPageControllerTests.cs test: replace campaign labels with behavior names 2026-08-18 12:25:00 +02:00
ChatTranscriptRendererTests.cs feat(chat): retail text style — two-plane glyph outlines, authored SpewBox/chat styles 2026-08-10 19:28:34 +02:00
ChatWindowControllerTests.cs fix(chat): CH6a/b rework — grip media, retail window-id model, floaty fixture 2026-08-10 13:09:32 +02:00
CombatLayoutConformanceTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
CombatUiControllerTests.cs fix: powerbar mode captions - jump 'Height' + combat 'Power'/'Accuracy' 2026-08-14 08:14:14 +02:00
ConfigOptionsPageControllerTests.cs fix(ui): Options panel Config tab content escapes the window frame — stale viewport anchor capture, not a missing clip 2026-08-17 00:24:33 +02:00
CreatureAppraisalRowsTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
DatRichTextTests.cs fix(ui): systemic escape normalization at the string source 2026-08-17 13:26:25 +02:00
DatStringEscapeSweepTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
DatStringResolverTemplateTests.cs build: make release restore reproducible 2026-08-18 10:29:00 +02:00
DatWidgetFactoryFontResolveTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
DatWidgetFactoryTests.cs fix(ui): systemic escape normalization at the string source 2026-08-17 13:26:25 +02:00
DormantDatWidgetConformanceTests.cs test: remove final campaign labels 2026-08-18 13:50:31 +02:00
EffectsUiControllerTests.cs fix(ui): OP2 rework — dormant UiDatElement subclasses, fixed Panel/CheckboxBitfield64 mechanism 2026-08-11 01:08:08 +02:00
ElementReaderTests.cs feat(ui): #409 — client-wide retail tooltip system 2026-08-16 20:03:24 +02:00
ExternalContainerControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
FaPanelSlotProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
FixtureLoader.cs feat(ui): Map/House panel — slices 2+3, panel shell + Map tab 2026-08-17 02:04:19 +02:00
FloatingChatLayoutConformanceTests.cs fix(chat): CH6a/b rework — grip media, retail window-id model, floaty fixture 2026-08-10 13:09:32 +02:00
FloatingChatWindowControllerTests.cs feat(chat): Campaign CH slice CH6b — floating chat windows 1-4 2026-08-10 12:10:20 +02:00
IndicatorBarControllerTests.cs fix(movement): invalidate burden on enchantment changes 2026-07-31 10:16:27 +02:00
IndicatorDetailPanelControllerTests.cs fix(ui): restore effect detail scrolling 2026-07-17 13:28:18 +02:00
InventoryControllerTests.cs fix(movement): invalidate burden on enchantment changes 2026-07-31 10:16:27 +02:00
InventoryFrameImportProbe.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
ItemAppraisalTextFormatterTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
ItemCooldownUiControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ItemListCellTemplateTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
JumpPowerbarControllerTests.cs feat(ui): port retail jump power bar 2026-07-13 10:22:12 +02:00
JumpPowerbarLayoutConformanceTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
KeyboardConfigControllerTests.cs fix #394 #395 #396: OP8 re-gate round — caption font, retail key names, capture dialog 2026-08-14 13:45:55 +02:00
KeyboardConfigLiveMountProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
LayoutConformanceTests.cs feat(ui): port retained widget foundations 2026-07-10 17:55:41 +02:00
LayoutImporterMediaBearingChildSweepTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
LayoutImporterTests.cs feat(ui): #409 — client-wide retail tooltip system 2026-08-16 20:03:24 +02:00
MapHousePanelControllerTests.cs fix(ui): morning gate — map town markers: green rollover highlight + the authored map-note tooltip skin/font 2026-08-17 09:22:46 +02:00
MapHousePanelLiveDatMountTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
MapHousePanelSlotProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
MapNoteLiveDatTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
MapPageControllerTests.cs fix(ui): Map tab player/house icon resolution — build the button-swallowed icons from the panel-slot resolve tree, detached from the per-frame layout pass 2026-08-17 05:58:17 +02:00
MouseTurningSettingsMacroTests.cs feat(ui): Campaign OP slice OP3 — Options panel shell, open paths, Gameplay tab 2026-08-11 02:14:40 +02:00
OptionPageModelTests.cs fix(ui,runtime): OP4 re-review residuals R1-R4 (coordinator pass) — OP4 CLOSED 2026-08-11 06:36:14 +02:00
OptionsPanelControllerTests.cs fix #381: Options-panel footer needs an opaque backing field 2026-08-11 23:01:43 +02:00
OptionsPanelLayoutConformanceTests.cs test: remove final campaign labels 2026-08-18 13:50:31 +02:00
OptionsPanelLiveMountProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
PaperdollClickMapTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
PaperdollControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
PaperdollSlotBackgroundTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
PaperdollToggleTests.cs feat(D.2b): Slice 2 — paperdoll armor/non-armor partition + Slots toggle state 2026-06-23 08:57:50 +02:00
PowerbarLayoutProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
RadarControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
RadarLayoutConformanceTests.cs feat(ui): port retail radar and compass 2026-07-10 16:14:37 +02:00
RadarSnapshotProviderTests.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
RetailDialogFactoryTests.cs fix(ui,net): Campaign LA gate round 2 — char-select exit confirmation, authored row justify, world name 2026-08-15 11:50:45 +02:00
RetailFixtureConformanceTests.cs feat(ui): port retail appraisal panel 2026-07-23 11:34:08 +02:00
RetailFpsControllerTests.cs fix #213: complete suicide and framerate presentation 2026-07-13 15:50:47 +02:00
RetailKeyNamesTests.cs fix #394 #395 #396: OP8 re-gate round — caption font, retail key names, capture dialog 2026-08-14 13:45:55 +02:00
RetailLayoutFixtureGenerator.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
RetailPanelUiControllerTests.cs fix(ui): OP3 review fixes — byte-verified Magic chat lines, Gameplay/OptionPage shape, mid-air tri-state, shared geometry 2026-08-11 03:05:27 +02:00
RetailStringEscapesTests.cs fix(ui): systemic escape normalization at the string source 2026-08-17 13:26:25 +02:00
RetailTooltipPresenterTests.cs fix(ui): morning gate — world tooltips ride retail's mouse-idle dwell, not the found edge 2026-08-17 08:49:11 +02:00
RetailWindowFrameTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
RowTemplateResolverTests.cs feat(ui): FA4 -- fellowship page fully live 2026-08-12 04:40:53 +02:00
SelectedObjectControllerTests.cs test: remove final campaign labels 2026-08-18 13:50:31 +02:00
SocialFellowshipPageControllerTests.cs fix: social panel completion batch (user gate 2026-08-13, "fix all") 2026-08-13 19:30:51 +02:00
SocialPanelControllerTests.cs fix: social panel completion batch (user gate 2026-08-13, "fix all") 2026-08-13 19:30:51 +02:00
SocialPanelLiveMountProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
SpellbookRowStyleTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
SpellbookWindowControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
SpellcastingUiControllerTests.cs fix(ui): night-round review — F3/F4/F7 cast-button tooltip strings 2026-08-17 04:39:17 +02:00
SpellExamineComponentTemplateFactoryTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ToolbarControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ToolbarInputControllerTests.cs feat(ui): complete retail quick-slot input 2026-07-11 08:59:49 +02:00
TooltipLiveDatTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
UiButtonCorpusSweepTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
UiDatElementTests.cs fix #416 #415: the retail button state/media machine — roster hover highlight clears; probe wait verbs bind without an artifact dir 2026-08-17 16:25:36 +02:00
UiPropertyBagTests.cs feat(chat): retail text style — two-plane glyph outlines, authored SpewBox/chat styles 2026-08-10 19:28:34 +02:00
UiTextLayoutCacheTests.cs test(app): put every strict-zero site on the probe (#250) 2026-07-29 03:49:13 +02:00
UiViewportFactoryTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
VendorUiControllerTests.cs fix: retail text and golden-string tests must not follow the machine's locale 2026-08-19 19:56:09 +02:00
VitalsBindingTests.cs feat(ui): port retained widget foundations 2026-07-10 17:55:41 +02:00
VitalsDetailToggleTests.cs fix(ui): gate — no void frames around the login wormhole; vitals icons centered 2026-08-17 12:30:51 +02:00
VitalsSideBySideControllerTests.cs feat(ui): vitals — Side By Side Vitals swaps retail's two vitals windows 2026-08-17 10:40:49 +02:00
VividTargetIndicatorLayoutTests.cs feat(selection): port retail offscreen target indicator 2026-07-18 07:41:12 +02:00