1
0

MindTests.Helpers.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. using System.Linq;
  2. using Content.IntegrationTests.Pair;
  3. using Content.Server.GameTicking;
  4. using Content.Server.Mind;
  5. using Content.Shared.Ghost;
  6. using Content.Shared.Mind;
  7. using Content.Shared.Players;
  8. using Robust.Server.GameObjects;
  9. using Robust.Server.Player;
  10. using Robust.Shared.Enums;
  11. using Robust.Shared.GameObjects;
  12. using Robust.Shared.Map;
  13. using Robust.Shared.Network;
  14. using Robust.Shared.Player;
  15. namespace Content.IntegrationTests.Tests.Minds;
  16. // This partial class contains misc helper functions for other tests.
  17. public sealed partial class MindTests
  18. {
  19. /// <summary>
  20. /// Gets a server-client pair and ensures that the client is attached to a simple mind test entity.
  21. /// </summary>
  22. /// <remarks>
  23. /// Without this, it may be possible that a tests starts with the client attached to an entity that does not match
  24. /// the player's mind's current entity, likely because some previous test directly changed the players attached
  25. /// entity.
  26. /// </remarks>
  27. private static async Task<Pair.TestPair> SetupPair(bool dirty = false)
  28. {
  29. var pair = await PoolManager.GetServerClient(new PoolSettings
  30. {
  31. DummyTicker = false,
  32. Connected = true,
  33. Dirty = dirty
  34. });
  35. var entMan = pair.Server.ResolveDependency<IServerEntityManager>();
  36. var playerMan = pair.Server.ResolveDependency<IPlayerManager>();
  37. var mindSys = entMan.System<SharedMindSystem>();
  38. var player = playerMan.Sessions.Single();
  39. EntityUid entity = default;
  40. EntityUid mindId = default!;
  41. MindComponent mind = default!;
  42. await pair.Server.WaitPost(() =>
  43. {
  44. entity = entMan.SpawnEntity(null, MapCoordinates.Nullspace);
  45. mindId = mindSys.CreateMind(player.UserId);
  46. mind = entMan.GetComponent<MindComponent>(mindId);
  47. mindSys.TransferTo(mindId, entity);
  48. });
  49. await pair.RunTicksSync(5);
  50. Assert.Multiple(() =>
  51. {
  52. Assert.That(player.ContentData()?.Mind, Is.EqualTo(mindId));
  53. Assert.That(player.AttachedEntity, Is.EqualTo(entity));
  54. Assert.That(player.AttachedEntity, Is.EqualTo(mind.CurrentEntity), "Player is not attached to the mind's current entity.");
  55. Assert.That(entMan.EntityExists(mind.OwnedEntity), "The mind's current entity does not exist");
  56. Assert.That(mind.VisitingEntity == null || entMan.EntityExists(mind.VisitingEntity), "The minds visited entity does not exist.");
  57. });
  58. return pair;
  59. }
  60. private static async Task<EntityUid> BecomeGhost(TestPair pair, bool visit = false)
  61. {
  62. var entMan = pair.Server.ResolveDependency<IServerEntityManager>();
  63. var playerMan = pair.Server.ResolveDependency<IPlayerManager>();
  64. var mindSys = entMan.System<SharedMindSystem>();
  65. EntityUid ghostUid = default;
  66. EntityUid mindId = default!;
  67. MindComponent mind = default!;
  68. var player = playerMan.Sessions.Single();
  69. await pair.Server.WaitAssertion(() =>
  70. {
  71. var oldUid = player.AttachedEntity;
  72. ghostUid = entMan.SpawnEntity(GameTicker.ObserverPrototypeName, MapCoordinates.Nullspace);
  73. mindId = mindSys.GetMind(player.UserId)!.Value;
  74. Assert.That(mindId, Is.Not.EqualTo(default(EntityUid)));
  75. mind = entMan.GetComponent<MindComponent>(mindId);
  76. if (visit)
  77. {
  78. mindSys.Visit(mindId, ghostUid);
  79. return;
  80. }
  81. mindSys.TransferTo(mindId, ghostUid);
  82. if (oldUid != null)
  83. entMan.DeleteEntity(oldUid.Value);
  84. });
  85. await pair.RunTicksSync(5);
  86. Assert.Multiple(() =>
  87. {
  88. Assert.That(entMan.HasComponent<GhostComponent>(ghostUid));
  89. Assert.That(player.AttachedEntity, Is.EqualTo(ghostUid));
  90. Assert.That(mind.CurrentEntity, Is.EqualTo(ghostUid));
  91. });
  92. if (!visit)
  93. Assert.That(mind.VisitingEntity, Is.Null);
  94. return ghostUid;
  95. }
  96. private static async Task<EntityUid> VisitGhost(Pair.TestPair pair, bool _ = false)
  97. {
  98. return await BecomeGhost(pair, visit: true);
  99. }
  100. /// <summary>
  101. /// Get the player's current mind and check that the entities exists.
  102. /// </summary>
  103. private static (EntityUid Id, MindComponent Comp) GetMind(Pair.TestPair pair)
  104. {
  105. var playerMan = pair.Server.PlayerMan;
  106. var entMan = pair.Server.EntMan;
  107. var player = playerMan.Sessions.SingleOrDefault();
  108. Assert.That(player, Is.Not.Null);
  109. var mindId = player.ContentData()!.Mind!.Value;
  110. Assert.That(mindId, Is.Not.EqualTo(default(EntityUid)));
  111. var mind = entMan.GetComponent<MindComponent>(mindId);
  112. ActorComponent actor = default!;
  113. Assert.Multiple(() =>
  114. {
  115. Assert.That(player, Is.EqualTo(mind.Session), "Player session does not match mind session");
  116. Assert.That(entMan.System<MindSystem>().GetMind(player.UserId), Is.EqualTo(mindId));
  117. Assert.That(player.AttachedEntity, Is.EqualTo(mind.CurrentEntity), "Player is not attached to the mind's current entity.");
  118. Assert.That(entMan.EntityExists(mind.OwnedEntity), "The mind's current entity does not exist");
  119. Assert.That(mind.VisitingEntity == null || entMan.EntityExists(mind.VisitingEntity), "The minds visited entity does not exist.");
  120. Assert.That(entMan.TryGetComponent(mind.CurrentEntity, out actor));
  121. });
  122. Assert.That(actor.PlayerSession, Is.EqualTo(mind.Session));
  123. return (mindId, mind);
  124. }
  125. private static async Task Disconnect(Pair.TestPair pair)
  126. {
  127. var netManager = pair.Client.ResolveDependency<IClientNetManager>();
  128. var playerMan = pair.Server.ResolveDependency<IPlayerManager>();
  129. var entMan = pair.Server.ResolveDependency<IEntityManager>();
  130. var player = playerMan.Sessions.Single();
  131. var mindId = player.ContentData()!.Mind!.Value;
  132. var mind = entMan.GetComponent<MindComponent>(mindId);
  133. await pair.Client.WaitAssertion(() =>
  134. {
  135. netManager.ClientDisconnect("Disconnect command used.");
  136. });
  137. await pair.RunTicksSync(5);
  138. Assert.Multiple(() =>
  139. {
  140. Assert.That(player.Status, Is.EqualTo(SessionStatus.Disconnected));
  141. Assert.That(mind.UserId, Is.Not.Null);
  142. Assert.That(mind.Session, Is.Null);
  143. });
  144. }
  145. private static async Task Connect(Pair.TestPair pair, string username)
  146. {
  147. var netManager = pair.Client.ResolveDependency<IClientNetManager>();
  148. var playerMan = pair.Server.ResolveDependency<IPlayerManager>();
  149. Assert.That(playerMan.Sessions, Is.Empty);
  150. await Task.WhenAll(pair.Client.WaitIdleAsync(), pair.Client.WaitIdleAsync());
  151. pair.Client.SetConnectTarget(pair.Server);
  152. await pair.Client.WaitPost(() => netManager.ClientConnect(null!, 0, username));
  153. await pair.RunTicksSync(5);
  154. var player = playerMan.Sessions.Single();
  155. Assert.That(player.Status, Is.EqualTo(SessionStatus.InGame));
  156. }
  157. private static async Task<ICommonSession> DisconnectReconnect(Pair.TestPair pair)
  158. {
  159. var playerMan = pair.Server.ResolveDependency<IPlayerManager>();
  160. var player = playerMan.Sessions.Single();
  161. var name = player.Name;
  162. var id = player.UserId;
  163. await Disconnect(pair);
  164. await Connect(pair, name);
  165. // Session has changed
  166. var newSession = playerMan.Sessions.Single();
  167. Assert.Multiple(() =>
  168. {
  169. Assert.That(newSession, Is.Not.EqualTo(player));
  170. Assert.That(newSession.UserId, Is.EqualTo(id));
  171. });
  172. return newSession;
  173. }
  174. }