Slight mind test cleanup (#17521)
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#nullable enable
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Content.Server.Ghost.Roles;
|
||||
using Content.Server.Ghost.Roles.Components;
|
||||
@@ -16,12 +17,7 @@ public sealed class GhostRoleTests
|
||||
{
|
||||
private const string Prototypes = @"
|
||||
- type: entity
|
||||
id: GhostRoleTestEntity_Player
|
||||
components:
|
||||
- type: MindContainer
|
||||
|
||||
- type: entity
|
||||
id: GhostRoleTestEntity_Role
|
||||
id: GhostRoleTestEntity
|
||||
components:
|
||||
- type: MindContainer
|
||||
- type: GhostRole
|
||||
@@ -42,36 +38,29 @@ public sealed class GhostRoleTests
|
||||
var entMan = server.ResolveDependency<IEntityManager>();
|
||||
var sPlayerMan = server.ResolveDependency<Robust.Server.Player.IPlayerManager>();
|
||||
var conHost = client.ResolveDependency<IConsoleHost>();
|
||||
var cPlayerMan = client.ResolveDependency<Robust.Client.Player.IPlayerManager>();
|
||||
var mindSystem = entMan.System<MindSystem>();
|
||||
|
||||
// Get player data
|
||||
if (cPlayerMan.LocalPlayer?.Session == null)
|
||||
Assert.Fail("No player");
|
||||
|
||||
var clientSession = cPlayerMan.LocalPlayer!.Session!;
|
||||
var session = sPlayerMan.GetSessionByUserId(clientSession.UserId);
|
||||
var session = sPlayerMan.ServerSessions.Single();
|
||||
|
||||
// Spawn player entity & attach
|
||||
EntityUid originalMob = default;
|
||||
await server.WaitPost(() =>
|
||||
{
|
||||
originalMob = entMan.SpawnEntity("GhostRoleTestEntity_Player", MapCoordinates.Nullspace);
|
||||
originalMob = entMan.SpawnEntity(null, MapCoordinates.Nullspace);
|
||||
mindSystem.TransferTo(session.ContentData()!.Mind!, originalMob, true);
|
||||
});
|
||||
|
||||
// Check player got attached.
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 10);
|
||||
Assert.That(cPlayerMan.LocalPlayer.ControlledEntity, Is.EqualTo(originalMob));
|
||||
Assert.That(session.AttachedEntity, Is.EqualTo(originalMob));
|
||||
|
||||
// Use the ghost command
|
||||
conHost.ExecuteCommand("ghost");
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 10);
|
||||
Assert.That(cPlayerMan.LocalPlayer.ControlledEntity, Is.Not.EqualTo(originalMob));
|
||||
Assert.That(session.AttachedEntity, Is.Not.EqualTo(originalMob));
|
||||
|
||||
// Spawn ghost takeover entity.
|
||||
EntityUid ghostRole = default;
|
||||
await server.WaitPost(() => ghostRole = entMan.SpawnEntity("GhostRoleTestEntity_Role", MapCoordinates.Nullspace));
|
||||
await server.WaitPost(() => ghostRole = entMan.SpawnEntity("GhostRoleTestEntity", MapCoordinates.Nullspace));
|
||||
|
||||
// Take the ghost role
|
||||
await server.WaitPost(() =>
|
||||
@@ -82,13 +71,13 @@ public sealed class GhostRoleTests
|
||||
|
||||
// Check player got attached to ghost role.
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 10);
|
||||
Assert.That(cPlayerMan.LocalPlayer.ControlledEntity, Is.EqualTo(ghostRole));
|
||||
Assert.That(session.AttachedEntity, Is.EqualTo(ghostRole));
|
||||
|
||||
// Ghost again.
|
||||
conHost.ExecuteCommand("ghost");
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 10);
|
||||
Assert.That(cPlayerMan.LocalPlayer.ControlledEntity, Is.Not.EqualTo(originalMob));
|
||||
Assert.That(cPlayerMan.LocalPlayer.ControlledEntity, Is.Not.EqualTo(ghostRole));
|
||||
Assert.That(session.AttachedEntity, Is.Not.EqualTo(originalMob));
|
||||
Assert.That(session.AttachedEntity, Is.Not.EqualTo(ghostRole));
|
||||
|
||||
// Next, control the original entity again:
|
||||
await server.WaitPost(() =>
|
||||
@@ -96,7 +85,7 @@ public sealed class GhostRoleTests
|
||||
mindSystem.TransferTo(session.ContentData()!.Mind!, originalMob, true);
|
||||
});
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 10);
|
||||
Assert.That(cPlayerMan.LocalPlayer.ControlledEntity, Is.EqualTo(originalMob));
|
||||
Assert.That(session.AttachedEntity, Is.EqualTo(originalMob));
|
||||
|
||||
await pairTracker.CleanReturnAsync();
|
||||
}
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
#nullable enable
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Content.Server.Mind;
|
||||
using Content.Server.Players;
|
||||
using NUnit.Framework;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Server.Player;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Maths;
|
||||
|
||||
namespace Content.IntegrationTests.Tests.Minds
|
||||
{
|
||||
// Tests various scenarios of deleting the entity that a player's mind is connected to.
|
||||
[TestFixture]
|
||||
public sealed class MindEntityDeletionTest
|
||||
{
|
||||
// This test will do the following:
|
||||
// - spawn a player
|
||||
// - visit some entity
|
||||
// - delete the entity being visited
|
||||
// - assert that player returns to original entity
|
||||
[Test]
|
||||
public async Task TestDeleteVisiting()
|
||||
{
|
||||
await using var pairTracker = await PoolManager.GetServerClient();
|
||||
var server = pairTracker.Pair.Server;
|
||||
|
||||
var entMan = server.ResolveDependency<IServerEntityManager>();
|
||||
var playerMan = server.ResolveDependency<IPlayerManager>();
|
||||
var mapManager = server.ResolveDependency<IMapManager>();
|
||||
|
||||
var mindSystem = entMan.EntitySysManager.GetEntitySystem<MindSystem>();
|
||||
|
||||
EntityUid playerEnt = default;
|
||||
EntityUid visitEnt = default;
|
||||
Mind mind = default!;
|
||||
var map = await PoolManager.CreateTestMap(pairTracker);
|
||||
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
var player = playerMan.ServerSessions.Single();
|
||||
var pos = new MapCoordinates(Vector2.Zero, map.MapId);
|
||||
|
||||
playerEnt = entMan.SpawnEntity(null, pos);
|
||||
visitEnt = entMan.SpawnEntity(null, pos);
|
||||
|
||||
mind = mindSystem.CreateMind(player.UserId);
|
||||
mindSystem.TransferTo(mind, playerEnt);
|
||||
mindSystem.Visit(mind, visitEnt);
|
||||
|
||||
Assert.That(player.AttachedEntity, Is.EqualTo(visitEnt));
|
||||
Assert.That(mind.VisitingEntity, Is.EqualTo(visitEnt));
|
||||
});
|
||||
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
await server.WaitPost(() => entMan.DeleteEntity(visitEnt));
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
|
||||
Assert.IsNull(mind.VisitingEntity);
|
||||
Assert.That(entMan.EntityExists(mind.OwnedEntity));
|
||||
Assert.That(mind.OwnedEntity, Is.EqualTo(playerEnt));
|
||||
|
||||
// This used to throw so make sure it doesn't.
|
||||
await server.WaitPost(() => entMan.DeleteEntity(mind.OwnedEntity!.Value));
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
|
||||
await server.WaitPost(() => mapManager.DeleteMap(map.MapId));
|
||||
await pairTracker.CleanReturnAsync();
|
||||
}
|
||||
|
||||
// this is a variant of TestGhostOnDelete that just deletes the whole map.
|
||||
[Test]
|
||||
public async Task TestGhostOnDeleteMap()
|
||||
{
|
||||
await using var pairTracker = await PoolManager.GetServerClient();
|
||||
var server = pairTracker.Pair.Server;
|
||||
var testMap = await PoolManager.CreateTestMap(pairTracker);
|
||||
var coordinates = testMap.GridCoords;
|
||||
|
||||
var entMan = server.ResolveDependency<IServerEntityManager>();
|
||||
var mapManager = server.ResolveDependency<IMapManager>();
|
||||
var playerMan = server.ResolveDependency<IPlayerManager>();
|
||||
var player = playerMan.ServerSessions.Single();
|
||||
|
||||
var mindSystem = entMan.EntitySysManager.GetEntitySystem<MindSystem>();
|
||||
|
||||
var map = await PoolManager.CreateTestMap(pairTracker);
|
||||
|
||||
EntityUid playerEnt = default;
|
||||
Mind mind = default!;
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
playerEnt = entMan.SpawnEntity(null, coordinates);
|
||||
mind = player.ContentData()!.Mind!;
|
||||
mindSystem.TransferTo(mind, playerEnt);
|
||||
|
||||
Assert.That(mind.CurrentEntity, Is.EqualTo(playerEnt));
|
||||
});
|
||||
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
|
||||
await server.WaitPost(() =>
|
||||
{
|
||||
mapManager.DeleteMap(testMap.MapId);
|
||||
});
|
||||
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
Assert.That(entMan.EntityExists(mind.CurrentEntity!.Value), Is.True);
|
||||
Assert.That(mind.CurrentEntity, Is.Not.EqualTo(playerEnt));
|
||||
});
|
||||
|
||||
await server.WaitPost(() =>
|
||||
{
|
||||
mapManager.DeleteMap(map.MapId);
|
||||
});
|
||||
|
||||
await pairTracker.CleanReturnAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,7 @@
|
||||
using System.Linq;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Content.Server.GameTicking;
|
||||
using Content.Server.Ghost.Components;
|
||||
using Content.Server.Mind;
|
||||
using Content.Server.Mind.Components;
|
||||
using Content.Server.Players;
|
||||
using NUnit.Framework;
|
||||
using Robust.Server.Console;
|
||||
@@ -11,13 +9,101 @@ using Robust.Server.GameObjects;
|
||||
using Robust.Server.Player;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Network;
|
||||
|
||||
namespace Content.IntegrationTests.Tests.Minds;
|
||||
|
||||
[TestFixture]
|
||||
public sealed class GhostTests
|
||||
// Tests various scenarios where an entity that is associated with a player's mind is deleted.
|
||||
public sealed partial class MindTests
|
||||
{
|
||||
// This test will do the following:
|
||||
// - spawn a player
|
||||
// - visit some entity
|
||||
// - delete the entity being visited
|
||||
// - assert that player returns to original entity
|
||||
[Test]
|
||||
public async Task TestDeleteVisiting()
|
||||
{
|
||||
await using var pairTracker = await PoolManager.GetServerClient();
|
||||
var server = pairTracker.Pair.Server;
|
||||
|
||||
var entMan = server.ResolveDependency<IServerEntityManager>();
|
||||
var playerMan = server.ResolveDependency<IPlayerManager>();
|
||||
|
||||
var mindSystem = entMan.EntitySysManager.GetEntitySystem<MindSystem>();
|
||||
|
||||
EntityUid playerEnt = default;
|
||||
EntityUid visitEnt = default;
|
||||
Mind mind = default!;
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
var player = playerMan.ServerSessions.Single();
|
||||
|
||||
playerEnt = entMan.SpawnEntity(null, MapCoordinates.Nullspace);
|
||||
visitEnt = entMan.SpawnEntity(null, MapCoordinates.Nullspace);
|
||||
|
||||
mind = mindSystem.CreateMind(player.UserId);
|
||||
mindSystem.TransferTo(mind, playerEnt);
|
||||
mindSystem.Visit(mind, visitEnt);
|
||||
|
||||
Assert.That(player.AttachedEntity, Is.EqualTo(visitEnt));
|
||||
Assert.That(mind.VisitingEntity, Is.EqualTo(visitEnt));
|
||||
});
|
||||
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
await server.WaitPost(() => entMan.DeleteEntity(visitEnt));
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
|
||||
Assert.IsNull(mind.VisitingEntity);
|
||||
Assert.That(entMan.EntityExists(mind.OwnedEntity));
|
||||
Assert.That(mind.OwnedEntity, Is.EqualTo(playerEnt));
|
||||
|
||||
// This used to throw so make sure it doesn't.
|
||||
await server.WaitPost(() => entMan.DeleteEntity(mind.OwnedEntity!.Value));
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
|
||||
await pairTracker.CleanReturnAsync();
|
||||
}
|
||||
|
||||
// this is a variant of TestGhostOnDelete that just deletes the whole map.
|
||||
[Test]
|
||||
public async Task TestGhostOnDeleteMap()
|
||||
{
|
||||
await using var pairTracker = await PoolManager.GetServerClient();
|
||||
var server = pairTracker.Pair.Server;
|
||||
var testMap = await PoolManager.CreateTestMap(pairTracker);
|
||||
var coordinates = testMap.GridCoords;
|
||||
|
||||
var entMan = server.ResolveDependency<IServerEntityManager>();
|
||||
var mapManager = server.ResolveDependency<IMapManager>();
|
||||
var playerMan = server.ResolveDependency<IPlayerManager>();
|
||||
var player = playerMan.ServerSessions.Single();
|
||||
|
||||
var mindSystem = entMan.EntitySysManager.GetEntitySystem<MindSystem>();
|
||||
|
||||
EntityUid playerEnt = default;
|
||||
Mind mind = default!;
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
playerEnt = entMan.SpawnEntity(null, coordinates);
|
||||
mind = player.ContentData()!.Mind!;
|
||||
mindSystem.TransferTo(mind, playerEnt);
|
||||
|
||||
Assert.That(mind.CurrentEntity, Is.EqualTo(playerEnt));
|
||||
});
|
||||
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
await server.WaitPost(() => mapManager.DeleteMap(testMap.MapId));
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
Assert.That(entMan.EntityExists(mind.CurrentEntity!.Value), Is.True);
|
||||
Assert.That(mind.CurrentEntity, Is.Not.EqualTo(playerEnt));
|
||||
});
|
||||
|
||||
await pairTracker.CleanReturnAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test that a ghost gets created when the player entity is deleted.
|
||||
/// 1. Delete mob
|
||||
@@ -27,7 +113,7 @@ public sealed class GhostTests
|
||||
public async Task TestGhostOnDelete()
|
||||
{
|
||||
// Client is needed to spawn session
|
||||
await using var pairTracker = await PoolManager.GetServerClient();
|
||||
await using var pairTracker = await SetupPair();
|
||||
var server = pairTracker.Pair.Server;
|
||||
|
||||
var entMan = server.ResolveDependency<IServerEntityManager>();
|
||||
@@ -35,21 +121,13 @@ public sealed class GhostTests
|
||||
|
||||
IPlayerSession player = playerMan.ServerSessions.Single();
|
||||
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
Assert.That(player.AttachedEntity, Is.Not.EqualTo(null));
|
||||
entMan.DeleteEntity(player.AttachedEntity!.Value);
|
||||
});
|
||||
Assert.That(!entMan.HasComponent<GhostComponent>(player.AttachedEntity), "Player was initially a ghost?");
|
||||
|
||||
// Delete entity
|
||||
await server.WaitPost(() => entMan.DeleteEntity(player.AttachedEntity!.Value));
|
||||
await PoolManager.RunTicksSync(pairTracker.Pair, 5);
|
||||
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
// Is player a ghost?
|
||||
Assert.That(player.AttachedEntity, Is.Not.EqualTo(null));
|
||||
var entity = player.AttachedEntity!.Value;
|
||||
Assert.That(entMan.HasComponent<GhostComponent>(entity));
|
||||
});
|
||||
Assert.That(entMan.HasComponent<GhostComponent>(player.AttachedEntity), "Player did not become a ghost");
|
||||
|
||||
await pairTracker.CleanReturnAsync();
|
||||
}
|
||||
@@ -72,7 +150,6 @@ public sealed class GhostTests
|
||||
|
||||
var entMan = server.ResolveDependency<IServerEntityManager>();
|
||||
var playerMan = server.ResolveDependency<IPlayerManager>();
|
||||
var gameTicker = entMan.EntitySysManager.GetEntitySystem<GameTicker>();
|
||||
var mindSystem = entMan.EntitySysManager.GetEntitySystem<MindSystem>();
|
||||
|
||||
IPlayerSession player = playerMan.ServerSessions.Single();
|
||||
@@ -15,7 +15,6 @@ using IPlayerManager = Robust.Server.Player.IPlayerManager;
|
||||
namespace Content.IntegrationTests.Tests.Minds;
|
||||
|
||||
// This partial class contains misc helper functions for other tests.
|
||||
[TestFixture]
|
||||
public sealed partial class MindTests
|
||||
{
|
||||
/// <summary>
|
||||
@@ -23,7 +22,7 @@ public sealed partial class MindTests
|
||||
/// </summary>
|
||||
public async Task<PairTracker> SetupPair()
|
||||
{
|
||||
var pairTracker = await PoolManager.GetServerClient(new PoolSettings{ ExtraPrototypes = Prototypes });
|
||||
var pairTracker = await PoolManager.GetServerClient();
|
||||
var pair = pairTracker.Pair;
|
||||
|
||||
var entMan = pair.Server.ResolveDependency<IServerEntityManager>();
|
||||
@@ -35,7 +34,7 @@ public sealed partial class MindTests
|
||||
EntityUid entity = default;
|
||||
await pair.Server.WaitPost(() =>
|
||||
{
|
||||
entity = entMan.SpawnEntity("MindTestEntity", MapCoordinates.Nullspace);
|
||||
entity = entMan.SpawnEntity(null, MapCoordinates.Nullspace);
|
||||
mindSys.TransferTo(mindSys.CreateMind(player.UserId), entity);
|
||||
});
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ using Robust.Shared.Map;
|
||||
|
||||
namespace Content.IntegrationTests.Tests.Minds;
|
||||
|
||||
[TestFixture]
|
||||
public sealed partial class MindTests
|
||||
{
|
||||
// This test will do the following:
|
||||
@@ -92,7 +91,6 @@ public sealed partial class MindTests
|
||||
{
|
||||
await using var pairTracker = await SetupPair();
|
||||
var pair = pairTracker.Pair;
|
||||
|
||||
var entMan = pair.Server.ResolveDependency<IEntityManager>();
|
||||
var mind = GetMind(pair);
|
||||
|
||||
@@ -119,10 +117,8 @@ public sealed partial class MindTests
|
||||
{
|
||||
await using var pairTracker = await SetupPair();
|
||||
var pair = pairTracker.Pair;
|
||||
|
||||
var entMan = pair.Server.ResolveDependency<IEntityManager>();
|
||||
var mindSys = entMan.System<MindSystem>();
|
||||
await PoolManager.RunTicksSync(pair, 5);
|
||||
var mind = GetMind(pair);
|
||||
|
||||
// Make player visit a new mob
|
||||
@@ -130,7 +126,7 @@ public sealed partial class MindTests
|
||||
EntityUid visiting = default;
|
||||
await pair.Server.WaitAssertion(() =>
|
||||
{
|
||||
visiting = entMan.SpawnEntity("MindTestEntity", MapCoordinates.Nullspace);
|
||||
visiting = entMan.SpawnEntity(null, MapCoordinates.Nullspace);
|
||||
mindSys.Visit(mind, visiting);
|
||||
});
|
||||
await PoolManager.RunTicksSync(pair, 5);
|
||||
|
||||
@@ -32,14 +32,9 @@ public sealed partial class MindTests
|
||||
{
|
||||
private const string Prototypes = @"
|
||||
- type: entity
|
||||
id: MindTestEntity
|
||||
components:
|
||||
- type: MindContainer
|
||||
|
||||
- type: entity
|
||||
parent: MindTestEntity
|
||||
id: MindTestEntityDamageable
|
||||
components:
|
||||
- type: MindContainer
|
||||
- type: Damageable
|
||||
damageContainer: Biological
|
||||
- type: Body
|
||||
|
||||
@@ -390,14 +390,10 @@ public sealed class MindSystem : EntitySystem
|
||||
|
||||
if (entity != null)
|
||||
{
|
||||
if (!TryComp(entity.Value, out component))
|
||||
{
|
||||
component = AddComp<MindContainerComponent>(entity.Value);
|
||||
}
|
||||
else if (component.HasMind)
|
||||
{
|
||||
component = EnsureComp<MindContainerComponent>(entity.Value);
|
||||
|
||||
if (component.HasMind)
|
||||
_gameTicker.OnGhostAttempt(component.Mind, false);
|
||||
}
|
||||
|
||||
if (TryComp<ActorComponent>(entity.Value, out var actor))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user