diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-21 12:07:13 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-21 12:07:13 +0800 |
| commit | 506afd9e38cad2ab0752734b79ef02da0864db67 (patch) | |
| tree | 6006269927609e53bfd826df4f6307681f994a0a /src/LivingVillage.Desktop.Tests | |
| parent | 2851a030db0f0bc5892305fb189a41c97c13578d (diff) | |
| download | living-village-506afd9e38cad2ab0752734b79ef02da0864db67.tar.gz | |
fix(desktop): 键位页键名列统一宽度不叠印
Controls 页按键名列独立成列(ControlsKeyX/KeyWidth=120/ActionX),controlRowRects 纯函数返回键名与动作矩形,回归测试断言逐行矩形不相交、全部行键名列 x/宽度一致、列宽容纳最长键名 F1/F2/F3;面板上移至 ControlsPanelY 保证 14 行键位加页脚完整落入视口。
Diffstat (limited to 'src/LivingVillage.Desktop.Tests')
| -rw-r--r-- | src/LivingVillage.Desktop.Tests/PrototypeTests.fs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/LivingVillage.Desktop.Tests/PrototypeTests.fs b/src/LivingVillage.Desktop.Tests/PrototypeTests.fs index c85287f..77d2530 100644 --- a/src/LivingVillage.Desktop.Tests/PrototypeTests.fs +++ b/src/LivingVillage.Desktop.Tests/PrototypeTests.fs @@ -219,6 +219,29 @@ type PrototypeTests () = Assert.AreEqual<SimulationControl>(original, restoredControl) [<TestMethod>] + member _.ControlsPageKeyColumnIsUniformAndNeverOverprintsActions () = + let layout = TitleScreen.layout 1280 720 + let rows = MenuState.controlRows + + // Every row: key-name rectangle and action rectangle must be disjoint. + for rowIndex in 0 .. rows.Length - 1 do + let keyRect, actionRect = TitleScreen.controlRowRects layout rowIndex + Assert.IsTrue(TitleScreen.rectsDisjoint keyRect actionRect, sprintf "row %d key overlaps action" rowIndex) + + // The key column is uniform: every row shares the same x and width. + let keyRects = [ 0 .. rows.Length - 1 ] |> List.map (fun index -> TitleScreen.controlRowRects layout index |> fst) + Assert.AreEqual<int>(1, keyRects |> List.map (fun rect -> rect.X) |> List.distinct |> List.length) + Assert.AreEqual<int>(1, keyRects |> List.map (fun rect -> rect.Width) |> List.distinct |> List.length) + + // The key column fits the longest key name (latin glyph: 6px * scale 2 per char). + let longestKey = rows |> List.maxBy (fun row -> row.Keys.Length) + Assert.IsTrue(layout.ControlsKeyWidth >= longestKey.Keys.Length * 12, sprintf "key width %d too small for %s" layout.ControlsKeyWidth longestKey.Keys) + + // The controls panel holds every row plus the footer inside the viewport. + let panelBottom = layout.ControlsPanelY + 60 + rows.Length * layout.ControlsRowHeight + 48 + Assert.IsTrue(panelBottom <= 720, sprintf "controls panel bottom %d overflows" panelBottom) + + [<TestMethod>] member _.CornerStatusShowsDayMoneyAndEnergyFromRealData () = let world = Sim.initialWorldN 42UL 0 let lines = M5Interaction.cornerStatusLines world |
