using NeonSprawl.Server.Game.PositionState; using NeonSprawl.Server.Game.Npc; using NeonSprawl.Server.Game.Targeting; using Xunit; namespace NeonSprawl.Server.Tests.Game.Targeting; public class PlayerTargetStateReaderTests { [Fact] public void ComputeValidity_ShouldReturnInvalidTarget_WhenLockIdNotInRegistry() { // Arrange var snap = new PositionSnapshot(0, 0, 0, 0); // Act var validity = PlayerTargetStateReader.ComputeValidity("not_in_registry", in snap); // Assert Assert.Equal(TargetValidity.InvalidTarget, validity); } [Fact] public void ComputeValidity_ShouldReturnNone_WhenLockNull() { // Arrange var snap = new PositionSnapshot(0, 0, 0, 0); // Act var validity = PlayerTargetStateReader.ComputeValidity(null, in snap); // Assert Assert.Equal(TargetValidity.None, validity); } [Fact] public void ComputeValidity_AtExactLockRadius_ReturnsOk() { // Arrange // Alpha anchor XZ (-3, -3), lockRadius 6 -> horizontal distance 6 from (3, -3) is on boundary (inclusive). var snap = new PositionSnapshot(3, 0, -3, 0); // Act var validity = PlayerTargetStateReader.ComputeValidity(PrototypeNpcRegistry.PrototypeNpcMeleeId, in snap); // Assert Assert.Equal(TargetValidity.Ok, validity); } [Fact] public void ComputeValidity_JustOutsideLockRadius_ReturnsOutOfRange() { // Arrange const double eps = 1e-6; var snap = new PositionSnapshot(3 + eps, 0, -3, 0); // Act var validity = PlayerTargetStateReader.ComputeValidity(PrototypeNpcRegistry.PrototypeNpcMeleeId, in snap); // Assert Assert.Equal(TargetValidity.OutOfRange, validity); } [Fact] public void ComputeValidity_AtOrigin_ShouldReturnOk_ForMeleeRangedAndElite() { // Arrange // Melee (-3,-3) r=6, ranged (3,3) r=6, elite (0,0) r=6 overlap at origin for tab cycle. var snap = new PositionSnapshot(0, 0, 0, 0); // Act var meleeValidity = PlayerTargetStateReader.ComputeValidity(PrototypeNpcRegistry.PrototypeNpcMeleeId, in snap); var rangedValidity = PlayerTargetStateReader.ComputeValidity(PrototypeNpcRegistry.PrototypeNpcRangedId, in snap); var eliteValidity = PlayerTargetStateReader.ComputeValidity(PrototypeNpcRegistry.PrototypeNpcEliteId, in snap); // Assert Assert.Equal(TargetValidity.Ok, meleeValidity); Assert.Equal(TargetValidity.Ok, rangedValidity); Assert.Equal(TargetValidity.Ok, eliteValidity); } }