From d85cce460fd7fbb8854fb11ba547be1baf576de7 Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Tue, 22 Sep 2026 00:08:15 +0800 Subject: feat(desktop): P16 启动画面淡入(Esc/空格跳过)+ 开始界面收敛三项(开始/读档/退出)+ CJK 补字 238 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LivingVillage.Desktop.Tests.fsproj | 1 + src/LivingVillage.Desktop.Tests/M6bTests.fs | 5 +- src/LivingVillage.Desktop.Tests/P16UiTests.fs | 66 ++++++++++++++++++++++ src/LivingVillage.Desktop.Tests/PrototypeTests.fs | 9 +-- 4 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 src/LivingVillage.Desktop.Tests/P16UiTests.fs (limited to 'src/LivingVillage.Desktop.Tests') diff --git a/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj b/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj index a8aac24..60d9995 100644 --- a/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj +++ b/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj @@ -9,6 +9,7 @@ + diff --git a/src/LivingVillage.Desktop.Tests/M6bTests.fs b/src/LivingVillage.Desktop.Tests/M6bTests.fs index 5aea9bd..1b2ef70 100644 --- a/src/LivingVillage.Desktop.Tests/M6bTests.fs +++ b/src/LivingVillage.Desktop.Tests/M6bTests.fs @@ -13,8 +13,9 @@ type M6bMenuTests () = Assert.AreEqual(MainMenu, state.Page) Assert.AreEqual( - [ NewGameItem; LoadItem; SettingsItem; ControlsItem; ExitItem ], + [ NewGameItem; LoadItem; ExitItem ], MenuState.items state) + Assert.AreEqual([ "开始"; "读档"; "退出" ], MenuState.items state |> List.map MenuState.itemLabel) Assert.AreEqual(0, state.Selected) [] @@ -32,7 +33,7 @@ type M6bMenuTests () = [] member _.SettingsCanSelectEveryExistingSimulationMode () = let initial = MenuState.create SimulationControl.initial false - let settings, _ = MenuState.update Confirm (MenuState.move Down (MenuState.move Down initial)) + let settings = MenuState.openSettings initial let oneX, oneXCommand = MenuState.update Confirm settings let twoX, twoXCommand = MenuState.update Confirm (MenuState.move Down settings) let fiveX, fiveXCommand = MenuState.update Confirm (MenuState.move Down (MenuState.move Down settings)) diff --git a/src/LivingVillage.Desktop.Tests/P16UiTests.fs b/src/LivingVillage.Desktop.Tests/P16UiTests.fs new file mode 100644 index 0000000..0bfdb62 --- /dev/null +++ b/src/LivingVillage.Desktop.Tests/P16UiTests.fs @@ -0,0 +1,66 @@ +namespace LivingVillage.Desktop.Tests + +open Microsoft.VisualStudio.TestTools.UnitTesting +open LivingVillage.Kernel +open LivingVillage.Desktop + +// ---- P16 启动画面 / 开始界面 ---- + +[] +type P16LaunchTests () = + + [] + member _.LaunchRevealAndVeilAreDeterministicAndComplete () = + Assert.AreEqual(0.0f, LaunchScreen.revealProgress 0L) + Assert.AreEqual(1.0f, LaunchScreen.revealProgress LaunchScreen.fadeInFrames) + Assert.AreEqual(1.0f, LaunchScreen.revealProgress 1000L) + Assert.AreEqual(1.0f, LaunchScreen.veilAlpha 0L) + Assert.AreEqual(0.0f, LaunchScreen.veilAlpha LaunchScreen.durationFrames) + Assert.IsTrue(LaunchScreen.veilAlpha 30L > LaunchScreen.veilAlpha 90L, "veil must decrease monotonically") + Assert.IsFalse(LaunchScreen.isComplete (LaunchScreen.durationFrames - 1L)) + Assert.IsTrue(LaunchScreen.isComplete LaunchScreen.durationFrames) + + [] + member _.LaunchSkipIsEscOrSpaceAndTextUsesTheAtlasPath () = + Assert.IsTrue(LaunchScreen.skipRequested true false) + Assert.IsTrue(LaunchScreen.skipRequested false true) + Assert.IsFalse(LaunchScreen.skipRequested false false) + Assert.IsTrue(PixelText.isRenderable LaunchScreen.title) + Assert.IsTrue(PixelText.isRenderable LaunchScreen.skipHint) + Assert.IsTrue(PixelText.isRenderable LaunchScreen.subtitle) + Assert.IsTrue(ChineseText.requiredUiLabels |> List.contains LaunchScreen.skipHint) + +[] +type P16StartMenuTests () = + + [] + member _.StartMenuIsExactlyThreeItemsWithChineseLabels () = + let state = MenuState.create SimulationControl.initial false + + Assert.AreEqual(3, MenuState.items state |> List.length) + Assert.AreEqual([ "开始"; "读档"; "退出" ], MenuState.items state |> List.map MenuState.itemLabel) + + [] + member _.StartMenuNavigationSelectsEachItemAndWraps () = + let state = MenuState.create SimulationControl.initial false + let down1 = MenuState.move Down state + let down2 = MenuState.move Down down1 + let wrap = MenuState.move Down down2 + + Assert.AreEqual(NewGameItem, MenuState.selectedItem state) + Assert.AreEqual(LoadItem, MenuState.selectedItem down1) + Assert.AreEqual(ExitItem, MenuState.selectedItem down2) + Assert.AreEqual(NewGameItem, MenuState.selectedItem wrap) + + Assert.AreEqual(StartNewGame, MenuState.update Confirm state |> snd) + Assert.AreEqual(LoadGame, MenuState.update Confirm down1 |> snd) + Assert.AreEqual(ExitGame, MenuState.update Confirm down2 |> snd) + + [] + member _.ReturningToMenuOffersContinueAsTheFirstOfThreeItems () = + let playing = MenuState.create SimulationControl.initial true |> MenuState.enterGame + let main = MenuState.openMain playing + + Assert.AreEqual([ ContinueItem; LoadItem; ExitItem ], MenuState.items main) + Assert.AreEqual([ "继续"; "读档"; "退出" ], MenuState.items main |> List.map MenuState.itemLabel) + Assert.AreEqual(ContinueGame, MenuState.update Confirm main |> snd) diff --git a/src/LivingVillage.Desktop.Tests/PrototypeTests.fs b/src/LivingVillage.Desktop.Tests/PrototypeTests.fs index 658e2e1..036154e 100644 --- a/src/LivingVillage.Desktop.Tests/PrototypeTests.fs +++ b/src/LivingVillage.Desktop.Tests/PrototypeTests.fs @@ -119,10 +119,11 @@ type PrototypeTests () = let controlLabels = MenuState.controlRows |> List.map (fun row -> row.Action) let settingsLabels = MenuState.settings |> List.map MenuState.settingsLabel - Assert.IsTrue(itemLabels |> List.contains "开始新游戏") - Assert.IsTrue(itemLabels |> List.contains "读取存档") - Assert.IsTrue(itemLabels |> List.contains "设置") + Assert.IsTrue(itemLabels |> List.contains "开始") + Assert.IsTrue(itemLabels |> List.contains "读档") Assert.IsTrue(itemLabels |> List.contains "退出") + Assert.AreEqual("设置", MenuState.itemLabel SettingsItem) + Assert.AreEqual("操作说明", MenuState.itemLabel ControlsItem) Assert.AreEqual( [ "移动" "互动" @@ -945,7 +946,7 @@ type PrototypeTests () = [] member _.CjkGlyphAtlasHasAStableCharacterTableAndGeometry () = - Assert.AreEqual(228, characters.Length) + Assert.AreEqual(238, characters.Length) CollectionAssert.AreEqual(characters, characters |> Array.sort) Assert.AreEqual(characters.Length, characters |> Array.distinct |> Array.length) Assert.AreEqual(16, columns) -- cgit v1.2.3