diff options
Diffstat (limited to 'src/LivingVillage.Kernel.Tests/RelationTests.fs')
| -rw-r--r-- | src/LivingVillage.Kernel.Tests/RelationTests.fs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/LivingVillage.Kernel.Tests/RelationTests.fs b/src/LivingVillage.Kernel.Tests/RelationTests.fs index 0f9de83..dc67e6d 100644 --- a/src/LivingVillage.Kernel.Tests/RelationTests.fs +++ b/src/LivingVillage.Kernel.Tests/RelationTests.fs @@ -138,3 +138,57 @@ type RelationTests () = if m.[i, j] <> m.[j, i] then Assert.Fail($"matrix must be symmetric at ({i},{j})") if System.Single.IsNaN m.[i, j] then Assert.Fail($"NaN at ({i},{j})") if System.Single.IsInfinity m.[i, j] then Assert.Fail($"infinite at ({i},{j})") + + [<TestMethod>] + member _.ChatMemorySurvivesRoutineMemoryChurn () = + let initial = [ RelationHarness.chatted 1L 1 ] + let full = + [ 1 .. Sim.memoryCapacity - 1 ] + |> List.fold (fun mem i -> Sim.recordMemory (int64 (i + 1)) Meal mem) initial + let retained = Sim.recordMemory (int64 (Sim.memoryCapacity + 1)) Meal full + if retained.Length > Sim.memoryCapacity then Assert.Fail("memory exceeds capacity") + if not (retained |> List.exists (fun e -> match e.Kind with Chatted _ -> true | _ -> false)) then + Assert.Fail("chat memory must survive routine-memory churn") + + [<TestMethod>] + member _.NpcAvoidsImmediateRepeatChatPartner () = + let needs = { Hunger = 100.0f; Energy = 100.0f; Social = 0.0f; Money = 100.0f } + let personality = + { Drive = 0.0f + Aggression = 0.0f + Extraversion = 1.0f + Honesty = 0.0f + Greed = 0.0f } + let plaza = Sim.actionTarget Wander + let npc id pos action age effectDone memory = + { Id = NpcId id + Pos = pos + Mind = + { Needs = needs + Personality = personality + Action = action + Target = Sim.actionTarget action + ActionAge = age + EffectDone = effectDone + HungerFlagged = false + Memory = memory } } + let self = npc 0 plaza Wander Sim.minActionTicks true [ RelationHarness.chatted 0L 1 ] + let nearest = npc 1 { X = plaza.X + 10.0f; Y = plaza.Y } Work 0L false [] + let alternate = npc 2 { X = plaza.X + 20.0f; Y = plaza.Y } Work 0L false [] + let world = + { Tick = 1L + Time = 0.0 + Rng = Rng.ofSeed 55UL + Avatar = { Pos = plaza } + NoHost = { Reserved = 0UL } + Npcs = [| self; nearest; alternate |] + Events = [] } + let next = Sim.step RelationHarness.zeroInput world + match List.tryHead next.Npcs.[0].Mind.Memory with + | Some entry -> + match entry.Kind with + | Chatted(NpcId partner) -> + if partner <> 2 then + Assert.Fail("a recent partner must not monopolize the next chat") + | kind -> Assert.Fail($"expected a chat memory, got {kind}") + | None -> Assert.Fail("expected a chat memory") |
