summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop.Tests/M6bTests.fs
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-21 22:57:50 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-21 22:57:50 +0800
commit60bbc83d9a1d047933e4128e7b48e1c61c925a14 (patch)
treec41b351535add285f8644d8703fa6c4f1799eeb3 /src/LivingVillage.Desktop.Tests/M6bTests.fs
parente1d8d45cf08b4f30e33299eb40e865729e7adfd2 (diff)
downloadliving-village-60bbc83d9a1d047933e4128e7b48e1c61c925a14.tar.gz
feat(desktop): P15 开局职业选择页——新档四选一+暂不选择,接入 v3 存档与当日任务
- MenuState:新增 OccupationSelect 页与 StartNewGameWith 命令;occupationOptions=农夫/渔夫/货郎/书生/暂不选择, 默认高亮「暂不选择」= 不写职业的旧行为;四选一确认后发 StartNewGameWith,ESC 返回主菜单(既有 MainMenu 行为与测试不变)。 - WorldBootstrap.occupationStateFor/refreshOccupationToday:按 seed+职业种子生成/跨日刷新当日 Offered 任务。 - Game:主菜单「开始新游戏」→ 职业选择页;选定后 initialWorldWithOccupation 注入 Money/Energy 与 Today, m5View.Task 随之写入 v3 存档;游玩中按日刷新;autoplay/flow 默认走「暂不选择」保持旧演示行为;DrawMenu 渲染职业页。 - 测试 Desktop 93(新增 6):职业页选项顺序/默认 None/标签、确认命令与返回、bootstrap 四职业 Money/Energy+当日池内 Offered 任务、四职业 v3 round-trip(职业+任务逐字段)、T 面板显示所选职业的模板名与「待接受」、跨日刷新保持同日。
Diffstat (limited to 'src/LivingVillage.Desktop.Tests/M6bTests.fs')
-rw-r--r--src/LivingVillage.Desktop.Tests/M6bTests.fs30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/LivingVillage.Desktop.Tests/M6bTests.fs b/src/LivingVillage.Desktop.Tests/M6bTests.fs
index 6ae0634..5aea9bd 100644
--- a/src/LivingVillage.Desktop.Tests/M6bTests.fs
+++ b/src/LivingVillage.Desktop.Tests/M6bTests.fs
@@ -80,3 +80,33 @@ type M6bMenuTests () =
Assert.AreEqual<string option>(Some "missing save", failed.Error)
Assert.AreEqual<MenuPage>(MainMenu, returned.Page)
Assert.AreEqual<MenuCommand>(NoCommand, command)
+
+ // ---- P15 开局职业选择页 ----
+
+ [<TestMethod>]
+ member _.OccupationSelectOffersFourKindsThenNoneAndDefaultsToNone () =
+ let page = MenuState.openOccupationSelect (MenuState.create SimulationControl.initial false)
+
+ Assert.AreEqual<MenuPage>(OccupationSelect, page.Page)
+ Assert.AreEqual<Occupation.Kind option list>(
+ [ Some Occupation.Farmer; Some Occupation.Fisher; Some Occupation.Peddler; Some Occupation.Scholar; None ],
+ MenuState.occupationOptions)
+ Assert.AreEqual<Occupation.Kind option>(None, MenuState.selectedOccupation page)
+ Assert.AreEqual<string>("暂不选择", MenuState.occupationLabel None)
+ Assert.AreEqual<string>("农夫", MenuState.occupationLabel (Some Occupation.Farmer))
+ Assert.AreEqual<string>("书生", MenuState.occupationLabel (Some Occupation.Scholar))
+
+ [<TestMethod>]
+ member _.OccupationSelectConfirmEmitsChosenKindAndBackReturnsToMenu () =
+ let page = MenuState.openOccupationSelect (MenuState.create SimulationControl.initial false)
+ let _, defaultCommand = MenuState.update Confirm page
+ Assert.AreEqual<MenuCommand>(StartNewGameWith None, defaultCommand)
+
+ let picked = MenuState.move Up (MenuState.move Up page)
+ Assert.AreEqual<Occupation.Kind option>(Some Occupation.Peddler, MenuState.selectedOccupation picked)
+ let _, command = MenuState.update Confirm picked
+ Assert.AreEqual<MenuCommand>(StartNewGameWith (Some Occupation.Peddler), command)
+
+ let back, backCommand = MenuState.update Back page
+ Assert.AreEqual<MenuPage>(MainMenu, back.Page)
+ Assert.AreEqual<MenuCommand>(NoCommand, backCommand)