summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Kernel.Tests/RelationTests.fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/LivingVillage.Kernel.Tests/RelationTests.fs')
-rw-r--r--src/LivingVillage.Kernel.Tests/RelationTests.fs54
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")