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 /// 展示到玩家可见的每日任务面板;无目标时文案逐字节不变;新字形(地/块/→)有覆盖断言。 [] 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" } [] member _.HelpWorkTargetShowsVillagerName () = let target = task Occupation.HelpWork (Some(Sim.NpcId 9)) None Occupation.Active Assert.AreEqual("帮工:进行中 → 村民 9", TaskRuntime.taskLine target "进行中") [] member _.TillSoilTargetShowsHomePlot () = let target = task Occupation.TillSoil None (Some(33, 25)) Occupation.Offered Assert.AreEqual("翻土:待接受 → 自家地块", TaskRuntime.taskLine target "待接受") [] member _.NoTargetKeepsLegacyCopy () = let helpWildcard = task Occupation.HelpWork None None Occupation.Active Assert.AreEqual("帮工:进行中", TaskRuntime.taskLine helpWildcard "进行中") let nightWildcard = task Occupation.NightCatch None None Occupation.Offered Assert.AreEqual("夜捕:待接受", TaskRuntime.taskLine nightWildcard "待接受") let tillWildcard = task Occupation.TillSoil None None Occupation.Done Assert.AreEqual("翻土:已完成", TaskRuntime.taskLine tillWildcard "已完成") [] 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) [] 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 '→', "箭头字形 → 未入图集")