using NeonSprawl.Server.Game.Npc; using Xunit; namespace NeonSprawl.Server.Tests.Game.Npc; public sealed class InMemoryNpcRuntimeStateStoreTests { [Fact] public void TryGet_ShouldLazyInitializeIdleRow_ForKnownNpcInstance() { // Arrange var store = new InMemoryNpcRuntimeStateStore(); // Act var found = store.TryGet(PrototypeNpcRegistry.PrototypeNpcMeleeId, out var snapshot); // Assert Assert.True(found); Assert.Equal(PrototypeNpcRegistry.PrototypeNpcMeleeId, snapshot.NpcInstanceId); Assert.Equal(NpcBehaviorState.Idle, snapshot.BehaviorState); Assert.Null(snapshot.ActiveTelegraph); } [Fact] public void TryGet_ShouldReturnFalse_ForUnknownNpcInstance() { // Arrange var store = new InMemoryNpcRuntimeStateStore(); // Act var found = store.TryGet("prototype_target_alpha", out var snapshot); // Assert Assert.False(found); Assert.Equal(default, snapshot); } [Fact] public void TryWrite_ShouldPersistRuntimeRow_ForKnownNpcInstance() { // Arrange var store = new InMemoryNpcRuntimeStateStore(); var started = new DateTimeOffset(2026, 5, 27, 12, 0, 0, TimeSpan.Zero); var telegraph = new ActiveTelegraphSnapshot("prototype_npc_melee:1", started); // Act var written = store.TryWrite( PrototypeNpcRegistry.PrototypeNpcMeleeId, new NpcRuntimeStateSnapshot( PrototypeNpcRegistry.PrototypeNpcMeleeId, NpcBehaviorState.TelegraphWindup, started, telegraph)); store.TryGet(PrototypeNpcRegistry.PrototypeNpcMeleeId, out var snapshot); // Assert Assert.True(written); Assert.Equal(NpcBehaviorState.TelegraphWindup, snapshot.BehaviorState); Assert.Equal(started, snapshot.PhaseStartedUtc); Assert.NotNull(snapshot.ActiveTelegraph); Assert.Equal("prototype_npc_melee:1", snapshot.ActiveTelegraph!.Value.TelegraphId); } [Fact] public void ResetAllPrototypeRows_ShouldReturnEachInstanceToIdle() { // Arrange var store = new InMemoryNpcRuntimeStateStore(); var started = new DateTimeOffset(2026, 5, 27, 12, 0, 0, TimeSpan.Zero); foreach (var npcId in PrototypeNpcRegistry.GetInstanceIdsInOrder()) { _ = store.TryWrite( npcId, new NpcRuntimeStateSnapshot(npcId, NpcBehaviorState.Recover, started, null)); } store.LastAdvancedUtc = started.AddSeconds(10); // Act store.ResetAllPrototypeRows(); // Assert foreach (var npcId in PrototypeNpcRegistry.GetInstanceIdsInOrder()) { store.TryGet(npcId, out var snapshot); Assert.Equal(NpcBehaviorState.Idle, snapshot.BehaviorState); Assert.Null(snapshot.ActiveTelegraph); } } [Fact] public void LastAdvancedUtc_ShouldBeSettable() { // Arrange var store = new InMemoryNpcRuntimeStateStore(); var marker = new DateTimeOffset(2026, 5, 27, 8, 0, 0, TimeSpan.Zero); // Act store.LastAdvancedUtc = marker; // Assert Assert.Equal(marker, store.LastAdvancedUtc); } }