diff --git a/Content.IntegrationTests/Tests/FollowerSystemTest.cs b/Content.IntegrationTests/Tests/FollowerSystemTest.cs new file mode 100644 index 0000000000..fa8c1968d0 --- /dev/null +++ b/Content.IntegrationTests/Tests/FollowerSystemTest.cs @@ -0,0 +1,63 @@ +using System.Linq; +using System.Threading.Tasks; +using Content.Shared.Follower; +using NUnit.Framework; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Log; +using Robust.Shared.Map; + +namespace Content.IntegrationTests.Tests; + +[TestFixture, TestOf(typeof(FollowerSystem))] +public sealed class FollowerSystemTest : ContentIntegrationTest +{ + /// + /// This test ensures that deleting a map while an entity follows another doesn't throw any exceptions. + /// + [Test] + public async Task FollowerMapDeleteTest() + { + var server = StartServerDummyTicker(); + await server.WaitIdleAsync(); + + await server.WaitPost(() => + { + var mapMan = IoCManager.Resolve(); + var entMan = IoCManager.Resolve(); + var sysMan = IoCManager.Resolve(); + var logger = IoCManager.Resolve().RootSawmill; + var followerSystem = sysMan.GetEntitySystem(); + + // Create a map to spawn the observers on. + var map = mapMan.CreateMap(); + + // Spawn an observer to be followed. + var followed = entMan.SpawnEntity("MobObserver", new MapCoordinates(0, 0, map)); + logger.Info($"Spawned followed observer: {entMan.ToPrettyString(followed)}"); + + // Spawn an observer to follow another observer. + var follower = entMan.SpawnEntity("MobObserver", new MapCoordinates(0, 0, map)); + logger.Info($"Spawned follower observer: {entMan.ToPrettyString(follower)}"); + + followerSystem.StartFollowingEntity(follower, followed); + + foreach (var ent in entMan.GetEntities().ToArray()) + { + // Let's skip entities that have been deleted, as we want to get their TransformComp for extra info. + if (entMan.Deleted(ent)) + { + logger.Info($"Skipping {entMan.ToPrettyString(ent)}..."); + continue; + } + + // Log some information about the entity before we delete it. + var transform = entMan.GetComponent(ent); + logger.Info($"Deleting entity {entMan.ToPrettyString(ent)}... Parent: {entMan.ToPrettyString(transform.ParentUid)} | Children: {string.Join(", ", transform.Children.Select(c => entMan.ToPrettyString(c.Owner)))}"); + + // Actually delete the entity now. + entMan.DeleteEntity(ent); + } + }); + } +}