test(headless): cover K4 death and cancellation

This commit is contained in:
Erik 2026-07-27 11:08:31 +02:00
parent 97c174fbb2
commit bd236ce553
2 changed files with 115 additions and 17 deletions

View file

@ -151,6 +151,7 @@ public sealed class HeadlessSessionIsolationTests
.Select(index => CreateHost(index, operations, time))
.ToArray();
var reconnectCounts = new int[sessionCount];
var deathCounts = new int[sessionCount];
var random = new Random(0xAC2013);
try
{
@ -197,6 +198,16 @@ public sealed class HeadlessSessionIsolationTests
2 + reconnectCounts[index]
+ (frame / 211))));
}
if (frame % 5003 == 0)
{
int index = (frame / 5003) % sessionCount;
Death(
operations.ActiveSession(
hosts[index].SessionId),
sharedPlayerGuid,
frame);
deathCounts[index]++;
}
if (frame % 353 == 0)
{
int index = random.Next(sessionCount);
@ -289,25 +300,30 @@ public sealed class HeadlessSessionIsolationTests
Assert.All(
reconnectCounts,
static count => Assert.True(count > 0));
Assert.All(
deathCounts,
static count => Assert.True(count > 0));
var finalRecords = new List<RuntimeEntityRecord>(
sessionCount);
Assert.All(
hosts,
host =>
{
Assert.Equal(
(ulong)frameCount,
host.Runtime.Clock.FrameNumber);
Assert.True(
host.Runtime.EntityObjects.Entities.TryGetActive(
sharedPlayerGuid,
out RuntimeEntityRecord finalRecord));
finalRecords.Add(finalRecord);
Assert.True(
host.Runtime.TransitOwner
.CaptureOwnership()
.IsSessionIdle);
});
for (int index = 0; index < hosts.Length; index++)
{
HeadlessSessionHost host = hosts[index];
Assert.Equal(
(ulong)frameCount,
host.Runtime.Clock.FrameNumber);
Assert.True(
host.Runtime.EntityObjects.Entities.TryGetActive(
sharedPlayerGuid,
out RuntimeEntityRecord finalRecord));
finalRecords.Add(finalRecord);
Assert.True(
host.Runtime.TransitOwner
.CaptureOwnership()
.IsSessionIdle);
Assert.True(
host.Runtime.CommunicationOwner.View.Count
>= deathCounts[index]);
}
Assert.Equal(
sessionCount,
finalRecords
@ -420,6 +436,18 @@ public sealed class HeadlessSessionIsolationTests
ForcePositionSequence: 0));
}
private static void Death(
WorldSession session,
uint victimGuid,
int sequence) =>
EventDelegate<Action<PlayerKilled.Parsed>>(
session,
nameof(session.PlayerKilledReceived))(
new PlayerKilled.Parsed(
$"Headless death {sequence}.",
victimGuid,
0x5000FFFFu));
private static WorldSession.EntitySpawn Spawn(
uint guid,
float positionX)