summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop.Tests/P67TaskTargetUiTests.fs
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-29 08:56:42 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-29 08:56:42 +0800
commita578791b0dd8ca95fba3af6f3c2f39c816bd7e52 (patch)
treeaf71c5a7d69087a59f5f5116134c602f65960ae0 /src/LivingVillage.Desktop.Tests/P67TaskTargetUiTests.fs
parent8cfdb2aa8b19595f5fa7870c4ad3e6c4c20c421e (diff)
downloadliving-village-a578791b0dd8ca95fba3af6f3c2f39c816bd7e52.tar.gz
p67: 每日任务面板展示目标(TargetNpc/TargetTile 可见化)
- TaskRuntime.targetText/taskLine:帮工→「村民 N」、翻土→「自家地块」, 无目标时与旧任务行文案逐字节一致(不加箭头/目标名) - Interaction TaskPanel 任务行改用 taskLine(其余面板/文案不动) - 字形表新增 地 块 →(343 字,图集重生成);ChineseText.requiredUiLabels 增补 - P67TaskTargetUiTests(5 例,红先)+ PrototypeTests 计数同步 340→343 - LV_P67_SHOT 证据钩子(有目标/无目标各一帧)+ scripts/analyze-p67.py - Desktop 333/333、Kernel 119/119;digest 953775FA…7F6C ×3 PASS;未动 Kernel/Sim
Diffstat (limited to 'src/LivingVillage.Desktop.Tests/P67TaskTargetUiTests.fs')
-rw-r--r--src/LivingVillage.Desktop.Tests/P67TaskTargetUiTests.fs74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/LivingVillage.Desktop.Tests/P67TaskTargetUiTests.fs b/src/LivingVillage.Desktop.Tests/P67TaskTargetUiTests.fs
new file mode 100644
index 0000000..f6e7168
--- /dev/null
+++ b/src/LivingVillage.Desktop.Tests/P67TaskTargetUiTests.fs
@@ -0,0 +1,74 @@
+namespace LivingVillage.Desktop.Tests
+
+open Microsoft.VisualStudio.TestTools.UnitTesting
+open LivingVillage.Kernel
+open LivingVillage.Kernel.Sim
+open LivingVillage.Desktop
+
+/// P67(设计 §2.4-3 收口后的可见化):把 P66 定点的 TargetNpc/TargetTile
+/// 展示到玩家可见的每日任务面板;无目标时文案逐字节不变;新字形(地/块/→)有覆盖断言。
+[<TestClass>]
+type P67TaskTargetUiTests () =
+
+ let world =
+ WorldBootstrap.initialWorldWithOccupation false 42UL 30 (Some(Occupation.stateOf Occupation.Farmer))
+
+ let task template npc tile state : Occupation.DailyTask =
+ { TemplateId = template
+ TargetNpc = npc
+ TargetTile = tile
+ OfferedTick = 0L
+ DueTick = 0L
+ State = state }
+
+ let farmerState = Occupation.stateOf Occupation.Farmer
+
+ let taskPanelView (state: Occupation.State option) : M5View =
+ { M5Interaction.initial with Panel = TaskPanel; Task = state; Status = "ready" }
+
+ [<TestMethod>]
+ member _.HelpWorkTargetShowsVillagerName () =
+ let target = task Occupation.HelpWork (Some(Sim.NpcId 9)) None Occupation.Active
+ Assert.AreEqual<string>("帮工:进行中 → 村民 9", TaskRuntime.taskLine target "进行中")
+
+ [<TestMethod>]
+ member _.TillSoilTargetShowsHomePlot () =
+ let target = task Occupation.TillSoil None (Some(33, 25)) Occupation.Offered
+ Assert.AreEqual<string>("翻土:待接受 → 自家地块", TaskRuntime.taskLine target "待接受")
+
+ [<TestMethod>]
+ member _.NoTargetKeepsLegacyCopy () =
+ let helpWildcard = task Occupation.HelpWork None None Occupation.Active
+ Assert.AreEqual<string>("帮工:进行中", TaskRuntime.taskLine helpWildcard "进行中")
+ let nightWildcard = task Occupation.NightCatch None None Occupation.Offered
+ Assert.AreEqual<string>("夜捕:待接受", TaskRuntime.taskLine nightWildcard "待接受")
+ let tillWildcard = task Occupation.TillSoil None None Occupation.Done
+ Assert.AreEqual<string>("翻土:已完成", TaskRuntime.taskLine tillWildcard "已完成")
+
+ [<TestMethod>]
+ member _.TaskPanelShowsTargetLineAndKeepsWildcardCopy () =
+ let targeted =
+ { farmerState with
+ Today = Some(task Occupation.HelpWork (Some(Sim.NpcId 7)) None Occupation.Active) }
+ let targetedLines = M5Interaction.panelLines world (taskPanelView (Some targeted))
+ CollectionAssert.Contains(
+ ResizeArray(targetedLines),
+ "帮工:进行中 → 村民 7",
+ sprintf "目标面板行缺失:%A" targetedLines)
+ let wildcard =
+ { farmerState with Today = Some(task Occupation.HelpWork None None Occupation.Active) }
+ let wildcardLines = M5Interaction.panelLines world (taskPanelView (Some wildcard))
+ CollectionAssert.Contains(ResizeArray(wildcardLines), "帮工:进行中")
+ Assert.IsFalse(
+ wildcardLines |> List.exists (fun line -> line.Contains '→'),
+ sprintf "无目标面板不应出现目标箭头:%A" wildcardLines)
+
+ [<TestMethod>]
+ member _.TargetLinesAreFullyRenderableIncludingArrow () =
+ let lines =
+ [ TaskRuntime.taskLine (task Occupation.HelpWork (Some(Sim.NpcId 9)) None Occupation.Active) "进行中"
+ TaskRuntime.taskLine (task Occupation.TillSoil None (Some(34, 25)) Occupation.Offered) "待接受"
+ TaskRuntime.taskLine (task Occupation.HelpWork None None Occupation.Active) "进行中" ]
+ for line in lines do
+ Assert.IsTrue(PixelText.isRenderable line, sprintf "任务面板文案有缺字/不可渲染:%s" line)
+ Assert.IsTrue(CjkGlyphAtlas.contains '→', "箭头字形 → 未入图集")