neon-sprawl/server/NeonSprawl.Server.Tests/Game/Npc/InMemoryNpcRuntimeStateStor...

95 lines
3.3 KiB
C#

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);
}
}