1
0

MindTests.ReconnectTests.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using System.Linq;
  2. using Content.Shared.Ghost;
  3. using Content.Shared.Mind;
  4. using Robust.Server.Player;
  5. using Robust.Shared.GameObjects;
  6. using Robust.Shared.Map;
  7. namespace Content.IntegrationTests.Tests.Minds;
  8. public sealed partial class MindTests
  9. {
  10. // This test will do the following:
  11. // - attach a player to a ghost (not visiting)
  12. // - disconnect
  13. // - reconnect
  14. // - assert that they spawned in as a new entity
  15. [Test]
  16. public async Task TestGhostsCanReconnect()
  17. {
  18. await using var pair = await SetupPair();
  19. var entMan = pair.Server.ResolveDependency<IEntityManager>();
  20. var mind = GetMind(pair);
  21. var ghost = await BecomeGhost(pair);
  22. await DisconnectReconnect(pair);
  23. // Player in control of a new ghost, but with the same mind
  24. Assert.Multiple(() =>
  25. {
  26. Assert.That(GetMind(pair), Is.EqualTo(mind));
  27. Assert.That(entMan.Deleted(ghost));
  28. Assert.That(entMan.HasComponent<GhostComponent>(mind.Comp.OwnedEntity));
  29. Assert.That(mind.Comp.VisitingEntity, Is.Null);
  30. });
  31. await pair.CleanReturnAsync();
  32. }
  33. // This test will do the following:
  34. // - disconnect a player
  35. // - delete their original entity
  36. // - reconnect
  37. // - assert that they spawned in as a new entity
  38. [Test]
  39. public async Task TestDeletedCanReconnect()
  40. {
  41. await using var pair = await SetupPair();
  42. var entMan = pair.Server.ResolveDependency<IEntityManager>();
  43. var mind = GetMind(pair);
  44. var playerMan = pair.Server.ResolveDependency<IPlayerManager>();
  45. var player = playerMan.Sessions.Single();
  46. var name = player.Name;
  47. var user = player.UserId;
  48. Assert.That(mind.Comp.OwnedEntity, Is.Not.Null);
  49. var entity = mind.Comp.OwnedEntity.Value;
  50. // Player is not a ghost
  51. Assert.That(!entMan.HasComponent<GhostComponent>(mind.Comp.CurrentEntity));
  52. // Disconnect
  53. await Disconnect(pair);
  54. // Delete entity
  55. Assert.That(entMan.EntityExists(entity));
  56. await pair.Server.WaitPost(() => entMan.DeleteEntity(entity));
  57. Assert.Multiple(() =>
  58. {
  59. Assert.That(entMan.Deleted(entity));
  60. Assert.That(mind.Comp.OwnedEntity, Is.Null);
  61. });
  62. // Reconnect
  63. await Connect(pair, name);
  64. player = playerMan.Sessions.Single();
  65. Assert.Multiple(() =>
  66. {
  67. Assert.That(user, Is.EqualTo(player.UserId));
  68. // Player is now a new ghost entity
  69. Assert.That(GetMind(pair), Is.EqualTo(mind));
  70. Assert.That(mind.Comp.OwnedEntity, Is.Not.EqualTo(entity));
  71. Assert.That(entMan.HasComponent<GhostComponent>(mind.Comp.OwnedEntity));
  72. });
  73. await pair.CleanReturnAsync();
  74. }
  75. // This test will do the following:
  76. // - visit a ghost
  77. // - disconnect
  78. // - reconnect
  79. // - assert that they return to their original entity
  80. [Test]
  81. public async Task TestVisitingGhostReconnect()
  82. {
  83. await using var pair = await SetupPair();
  84. var entMan = pair.Server.ResolveDependency<IEntityManager>();
  85. var mind = GetMind(pair);
  86. var original = mind.Comp.CurrentEntity;
  87. var ghost = await VisitGhost(pair);
  88. await DisconnectReconnect(pair);
  89. // Player now controls their original mob, mind was preserved
  90. Assert.Multiple(() =>
  91. {
  92. Assert.That(mind, Is.EqualTo(GetMind(pair)));
  93. Assert.That(mind.Comp.CurrentEntity, Is.EqualTo(original));
  94. Assert.That(entMan.Deleted(original), Is.False);
  95. Assert.That(entMan.Deleted(ghost));
  96. });
  97. await pair.CleanReturnAsync();
  98. }
  99. // This test will do the following:
  100. // - visit a normal (non-ghost) entity,
  101. // - disconnect
  102. // - reconnect
  103. // - assert that they return to the visited entity.
  104. [Test]
  105. public async Task TestVisitingReconnect()
  106. {
  107. await using var pair = await SetupPair(true);
  108. var entMan = pair.Server.ResolveDependency<IEntityManager>();
  109. var mindSys = entMan.System<SharedMindSystem>();
  110. var mind = GetMind(pair);
  111. Assert.That(mind.Comp.VisitingEntity, Is.Null);
  112. // Make player visit a new mob
  113. var original = mind.Comp.OwnedEntity;
  114. EntityUid visiting = default;
  115. await pair.Server.WaitAssertion(() =>
  116. {
  117. visiting = entMan.SpawnEntity(null, MapCoordinates.Nullspace);
  118. mindSys.Visit(mind.Id, visiting);
  119. });
  120. await pair.RunTicksSync(5);
  121. Assert.That(mind.Comp.VisitingEntity, Is.EqualTo(visiting));
  122. await DisconnectReconnect(pair);
  123. // Player is back in control of the visited mob, mind was preserved
  124. Assert.Multiple(() =>
  125. {
  126. Assert.That(GetMind(pair), Is.EqualTo(mind));
  127. Assert.That(entMan.Deleted(original), Is.False);
  128. Assert.That(entMan.Deleted(visiting), Is.False);
  129. Assert.That(mind.Comp.CurrentEntity, Is.EqualTo(visiting));
  130. });
  131. await pair.CleanReturnAsync();
  132. }
  133. // This test will do the following
  134. // - connect as a normal player
  135. // - disconnect
  136. // - reconnect
  137. // - assert that they return to the original entity.
  138. [Test]
  139. public async Task TestReconnect()
  140. {
  141. await using var pair = await SetupPair();
  142. var mind = GetMind(pair);
  143. Assert.That(mind.Comp.VisitingEntity, Is.Null);
  144. Assert.That(mind.Comp.OwnedEntity, Is.Not.Null);
  145. var entity = mind.Comp.OwnedEntity;
  146. await pair.RunTicksSync(5);
  147. await DisconnectReconnect(pair);
  148. await pair.RunTicksSync(5);
  149. var newMind = GetMind(pair);
  150. Assert.That(newMind.Comp.VisitingEntity, Is.Null);
  151. Assert.That(newMind.Comp.OwnedEntity, Is.EqualTo(entity));
  152. Assert.That(newMind.Id, Is.EqualTo(mind.Id));
  153. await pair.CleanReturnAsync();
  154. }
  155. }