namespace LivingVillage.Desktop.Tests open Microsoft.VisualStudio.TestTools.UnitTesting open LivingVillage.Kernel open LivingVillage.Kernel.Sim open LivingVillage.Desktop module private Harness = let atNpc (id: int) (world: World) : World = let npc = world.Npcs.[id] { world with Avatar = { world.Avatar with Pos = npc.Pos } } [] type DesktopTests () = [] member _.InteractOpensTheSixIntentMenu () = let world = Sim.initialWorldN 42UL 4 |> Harness.atNpc 0 let next, view = M5Interaction.apply Interact world M5Interaction.initial Assert.AreEqual(world, next) Assert.AreEqual(DialoguePanel, view.Panel) Assert.AreEqual(6, view.Menu.Value.Options.Length) Assert.IsTrue(M5Interaction.titleText view |> fun text -> text.Contains("闲聊")) [] member _.SelectingAnIntentUpdatesWorldAndChronicle () = let world = Sim.initialWorldN 42UL 4 |> Harness.atNpc 0 let openedWorld, opened = M5Interaction.apply Interact world M5Interaction.initial let next, view = M5Interaction.apply Intent1 openedWorld opened Assert.IsTrue(next.Events |> List.exists (fun event -> match event.Kind with | DialogueEvent _ -> true | _ -> false)) Assert.IsTrue(next.Annals |> List.exists (fun entry -> match entry.Kind with | DialogueAnnal _ -> true | _ -> false)) Assert.IsTrue(view.Chronicle.Contains("dialogue")) Assert.IsTrue(view.Status.Contains("dialogue")) [] member _.NeedsAndObservationPanelsUseKernelViews () = let world = Sim.initialWorldN 42UL 4 |> Harness.atNpc 0 let afterStep = Sim.step { Input = { MoveX = 0.0f; MoveY = 0.0f } } world let _, needsView = M5Interaction.apply ToggleNeeds afterStep M5Interaction.initial let _, observationView = M5Interaction.apply Observe world M5Interaction.initial Assert.AreEqual(afterStep.Avatar.Mind.Needs, needsView.Needs.Value.Needs) Assert.IsTrue(observationView.Observations |> List.exists (fun observation -> observation.Id = NpcId 0)) [] member _.HeadlessSmokeProvesTheThreeHopCausalChain () = let result = Program.M5Smoke.run () Assert.IsTrue(result.Passed, result.Failure) Assert.AreEqual(6, result.MenuOptions) Assert.AreEqual(4, result.RumorPathLength) Assert.IsTrue(result.Chronicle.Contains("dialogue")) Assert.IsTrue(result.RumorTrace.Contains("receiver=-1")) Assert.IsTrue(result.RumorTrace.Contains("depth=3")) [] member _.DayNightStateChangesTheRenderProfile () = let day = M6Presentation.profileAtTick (6L * Sim.ticksPerDay / 24L) let night = M6Presentation.profileAtTick (22L * Sim.ticksPerDay / 24L) Assert.AreEqual(Day, day.Mode) Assert.AreEqual(Night, night.Mode) Assert.AreNotEqual(day.Background, night.Background) Assert.AreNotEqual(day.WorldTint, night.WorldTint)