63 lines
2.0 KiB
C#
63 lines
2.0 KiB
C#
using Microsoft.Extensions.Options;
|
|
using NeonSprawl.Server.Game.Npc;
|
|
using NeonSprawl.Server.Game.PositionState;
|
|
using Xunit;
|
|
|
|
namespace NeonSprawl.Server.Tests.Game.Npc;
|
|
|
|
public sealed class InMemoryThreatStateStoreTests
|
|
{
|
|
[Fact]
|
|
public void TryGet_ShouldLazyInitializeEmptyHolder_ForKnownNpcInstance()
|
|
{
|
|
// Arrange
|
|
var store = new InMemoryThreatStateStore();
|
|
// Act
|
|
var found = store.TryGet(PrototypeNpcRegistry.PrototypeNpcMeleeId, out var snapshot);
|
|
// Assert
|
|
Assert.True(found);
|
|
Assert.Equal(PrototypeNpcRegistry.PrototypeNpcMeleeId, snapshot.NpcInstanceId);
|
|
Assert.Null(snapshot.AggroHolderPlayerId);
|
|
}
|
|
|
|
[Fact]
|
|
public void TryGet_ShouldReturnFalse_ForUnknownNpcInstance()
|
|
{
|
|
// Arrange
|
|
var store = new InMemoryThreatStateStore();
|
|
// Act
|
|
var found = store.TryGet("prototype_target_alpha", out var snapshot);
|
|
// Assert
|
|
Assert.False(found);
|
|
Assert.Equal(default, snapshot);
|
|
}
|
|
|
|
[Fact]
|
|
public void TrySetHolder_ShouldPersistLowercaseHolder_AndClearOnNull()
|
|
{
|
|
// Arrange
|
|
var store = new InMemoryThreatStateStore();
|
|
// Act
|
|
var set = store.TrySetHolder(PrototypeNpcRegistry.PrototypeNpcMeleeId, " Dev-Local-1 ");
|
|
store.TryGet(PrototypeNpcRegistry.PrototypeNpcMeleeId, out var withHolder);
|
|
var cleared = store.TryClearHolder(PrototypeNpcRegistry.PrototypeNpcMeleeId);
|
|
store.TryGet(PrototypeNpcRegistry.PrototypeNpcMeleeId, out var afterClear);
|
|
// Assert
|
|
Assert.True(set);
|
|
Assert.Equal("dev-local-1", withHolder.AggroHolderPlayerId);
|
|
Assert.True(cleared);
|
|
Assert.Null(afterClear.AggroHolderPlayerId);
|
|
}
|
|
|
|
[Fact]
|
|
public void TrySetHolder_ShouldReturnFalse_ForUnknownNpcInstance()
|
|
{
|
|
// Arrange
|
|
var store = new InMemoryThreatStateStore();
|
|
// Act
|
|
var set = store.TrySetHolder("unknown_npc", "dev-local-1");
|
|
// Assert
|
|
Assert.False(set);
|
|
}
|
|
}
|