summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop.Tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/LivingVillage.Desktop.Tests')
-rw-r--r--src/LivingVillage.Desktop.Tests/P16UiTests.fs59
-rw-r--r--src/LivingVillage.Desktop.Tests/PrototypeTests.fs5
2 files changed, 61 insertions, 3 deletions
diff --git a/src/LivingVillage.Desktop.Tests/P16UiTests.fs b/src/LivingVillage.Desktop.Tests/P16UiTests.fs
index 0bfdb62..0db4506 100644
--- a/src/LivingVillage.Desktop.Tests/P16UiTests.fs
+++ b/src/LivingVillage.Desktop.Tests/P16UiTests.fs
@@ -64,3 +64,62 @@ type P16StartMenuTests () =
Assert.AreEqual<MenuItem list>([ ContinueItem; LoadItem; ExitItem ], MenuState.items main)
Assert.AreEqual<string list>([ "继续"; "读档"; "退出" ], MenuState.items main |> List.map MenuState.itemLabel)
Assert.AreEqual<MenuCommand>(ContinueGame, MenuState.update Confirm main |> snd)
+
+// ---- P16 HUD 顶部窄信息条 ----
+
+[<TestClass>]
+type P16HudTests () =
+
+ let world = Sim.initialWorldN 42UL 4
+
+ [<TestMethod>]
+ member _.HudBarIsANarrowStripNotAFullscreenBlock () =
+ Assert.IsTrue(HudLayout.barHeight <= 40, "HUD bar must stay a narrow strip")
+ Assert.IsTrue(HudLayout.barHeight * 4 < 720, "HUD bar must not dominate the viewport")
+
+ [<TestMethod>]
+ member _.HudSegmentsAreDeterministicAndUseRealState () =
+ let control = SimulationControl.initial
+ let segments = HudLayout.segments world control
+ Assert.AreEqual<string list>([ "时段"; "时间"; "倍速"; "体力"; "钱币" ], segments |> List.map (fun segment -> segment.Label))
+ Assert.AreEqual<HudLayout.Segment list>(segments, HudLayout.segments world control)
+ let energy = segments |> List.find (fun segment -> segment.Label = "体力")
+ Assert.AreEqual<string>(sprintf "%.0f" world.Avatar.Mind.Needs.Energy, energy.Value)
+ let money = segments |> List.find (fun segment -> segment.Label = "钱币")
+ Assert.AreEqual<string>(sprintf "%.0f" world.Avatar.Mind.Needs.Money, money.Value)
+
+ [<TestMethod>]
+ member _.HudLayoutPlacesSegmentsDeterministicallyWithinWidth () =
+ let placed = HudLayout.layout (HudLayout.segments world SimulationControl.initial)
+ Assert.AreEqual<int>(5, placed.Length)
+ let (firstX, _, _) = List.head placed
+ Assert.AreEqual<int>(HudLayout.paddingX, firstX)
+ placed
+ |> List.pairwise
+ |> List.iter (fun ((x1, w1, _), (x2, _, _)) ->
+ Assert.IsTrue(x2 >= x1 + w1, sprintf "segments overlap: %d+%d vs %d" x1 w1 x2))
+ let (lastX, lastWidth, _) = List.last placed
+ Assert.IsTrue(lastX + lastWidth <= 1280, "last segment must fit inside a 1280 viewport")
+
+ [<TestMethod>]
+ member _.HudClockAndPeriodArePureFunctions () =
+ let ticksPerHour = Sim.ticksPerDay / 24L
+ Assert.AreEqual<string>("12:00", M6Presentation.clockTimeLabel (12L * ticksPerHour))
+ Assert.AreEqual<string>("00:00", M6Presentation.clockTimeLabel 0L)
+ Assert.AreEqual<string>("06:30", M6Presentation.clockTimeLabel (6L * ticksPerHour + ticksPerHour / 2L))
+ Assert.AreEqual<string>("白天", M6Presentation.timePeriodLabel (12L * ticksPerHour))
+ Assert.AreEqual<string>("夜晚", M6Presentation.timePeriodLabel 0L)
+ Assert.AreEqual<string>("清晨", M6Presentation.timePeriodLabel (6L * ticksPerHour))
+ Assert.AreEqual<string>("黄昏", M6Presentation.timePeriodLabel (19L * ticksPerHour))
+
+ [<TestMethod>]
+ member _.HudNightPaletteLeansCoolAndLabelsAreAtlasBacked () =
+ let day = HudLayout.palette Day
+ let night = HudLayout.palette Night
+ Assert.IsTrue(night.Accent.B > night.Accent.R, "night accent should lean cool/blue (winter-night tint)")
+ Assert.IsTrue(day.Accent.R > day.Accent.B, "day accent should lean warm")
+ for label in [ "时段"; "时间"; "倍速"; "体力"; "钱币" ] do
+ Assert.IsTrue(PixelText.isRenderable label, sprintf "HUD label %s must render" label)
+ Assert.IsTrue(ChineseText.requiredUiLabels |> List.contains "时段")
+ Assert.IsTrue(ChineseText.requiredUiLabels |> List.contains "体力")
+ Assert.IsTrue(ChineseText.requiredUiLabels |> List.contains "钱币")
diff --git a/src/LivingVillage.Desktop.Tests/PrototypeTests.fs b/src/LivingVillage.Desktop.Tests/PrototypeTests.fs
index 036154e..88f6016 100644
--- a/src/LivingVillage.Desktop.Tests/PrototypeTests.fs
+++ b/src/LivingVillage.Desktop.Tests/PrototypeTests.fs
@@ -792,9 +792,8 @@ type PrototypeTests () =
Assert.IsTrue(rect.Y >= 0 && rect.Y + rect.Height <= height, sprintf "y overflow %A %A" (anchorX, anchorY) rect)
// Never cover the bottom-left HUD band (camera 0: band starts at height - 160).
Assert.IsTrue(rect.Y + rect.Height <= height - FloatingPrompt.hudBottomBandHeight + 8, sprintf "bottom HUD overlap %A %A" (anchorX, anchorY) rect)
- // Never cover the top-right status strip.
- if rect.X + rect.Width >= width - FloatingPrompt.hudTopRightWidth then
- Assert.IsTrue(rect.Y >= FloatingPrompt.hudTopRightHeight, sprintf "top-right HUD overlap %A %A" (anchorX, anchorY) rect)
+ // Never cover the full-width top status bar.
+ Assert.IsTrue(rect.Y >= FloatingPrompt.hudTopBarHeight, sprintf "top HUD overlap %A %A" (anchorX, anchorY) rect)
[<TestMethod>]
member _.FloatingPromptMeasureMatchesPixelTextAdvances () =