97 lines
3.3 KiB
C#
97 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);
|
|
}
|
|
|
|
Assert.Equal(DateTimeOffset.MinValue, store.LastAdvancedUtc);
|
|
}
|
|
|
|
[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);
|
|
}
|
|
}
|