SaveLoadReparentTest.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Content.Shared.Body.Components;
  4. using Content.Shared.Body.Systems;
  5. using Robust.Shared.Containers;
  6. using Robust.Shared.EntitySerialization.Systems;
  7. using Robust.Shared.GameObjects;
  8. using Robust.Shared.Map;
  9. using Robust.Shared.Utility;
  10. namespace Content.IntegrationTests.Tests.Body;
  11. [TestFixture]
  12. public sealed class SaveLoadReparentTest
  13. {
  14. [TestPrototypes]
  15. private const string Prototypes = @"
  16. - type: entity
  17. name: HumanBodyDummy
  18. id: HumanBodyDummy
  19. components:
  20. - type: Body
  21. prototype: Human
  22. ";
  23. [Test]
  24. public async Task Test()
  25. {
  26. await using var pair = await PoolManager.GetServerClient();
  27. var server = pair.Server;
  28. var entities = server.ResolveDependency<IEntityManager>();
  29. var maps = server.ResolveDependency<IMapManager>();
  30. var mapLoader = entities.System<MapLoaderSystem>();
  31. var bodySystem = entities.System<SharedBodySystem>();
  32. var containerSystem = entities.System<SharedContainerSystem>();
  33. var mapSys = entities.System<SharedMapSystem>();
  34. await server.WaitAssertion(() =>
  35. {
  36. mapSys.CreateMap(out var mapId);
  37. maps.CreateGrid(mapId);
  38. var human = entities.SpawnEntity("HumanBodyDummy", new MapCoordinates(0, 0, mapId));
  39. Assert.That(entities.HasComponent<BodyComponent>(human), Is.True);
  40. var parts = bodySystem.GetBodyChildren(human).Skip(1).ToArray();
  41. var organs = bodySystem.GetBodyOrgans(human).ToArray();
  42. Assert.Multiple(() =>
  43. {
  44. Assert.That(parts, Is.Not.Empty);
  45. Assert.That(organs, Is.Not.Empty);
  46. });
  47. foreach (var (id, component) in parts)
  48. {
  49. Assert.Multiple(() =>
  50. {
  51. Assert.That(component.Body, Is.EqualTo(human));
  52. Assert.That(component.Body, Is.Not.Null);
  53. var parent = bodySystem.GetParentPartOrNull(id);
  54. Assert.That(parent, Is.Not.EqualTo(default(EntityUid)));
  55. if (!bodySystem.IsPartRoot(component.Body.Value, id, null, component))
  56. {
  57. Assert.That(parent, Is.Not.Null);
  58. }
  59. else
  60. {
  61. Assert.That(parent, Is.Null);
  62. }
  63. });
  64. foreach (var (slotId, slot) in component.Children)
  65. {
  66. Assert.Multiple(() =>
  67. {
  68. Assert.That(slot.Id, Is.EqualTo(slotId));
  69. var container =
  70. containerSystem.GetContainer(id, SharedBodySystem.GetPartSlotContainerId(slotId));
  71. Assert.That(container.ContainedEntities, Is.Not.Empty);
  72. });
  73. }
  74. }
  75. foreach (var (id, component) in organs)
  76. {
  77. var parent = bodySystem.GetParentPartOrNull(id);
  78. Assert.Multiple(() =>
  79. {
  80. Assert.That(component.Body, Is.EqualTo(human));
  81. Assert.That(parent, Is.Not.Null);
  82. Assert.That(parent.Value, Is.Not.EqualTo(default(EntityUid)));
  83. });
  84. }
  85. // Converts an entity query enumerator to an enumerable.
  86. static IEnumerable<(EntityUid Uid, TComp Comp)> EnumerateQueryEnumerator<TComp>(EntityQueryEnumerator<TComp> query)
  87. where TComp : Component
  88. {
  89. while (query.MoveNext(out var uid, out var comp))
  90. yield return (uid, comp);
  91. }
  92. Assert.That(
  93. EnumerateQueryEnumerator(
  94. entities.EntityQueryEnumerator<BodyComponent>()
  95. ).Where((e) =>
  96. entities.GetComponent<MetaDataComponent>(e.Uid).EntityPrototype!.Name == "HumanBodyDummy"
  97. ),
  98. Is.Not.Empty
  99. );
  100. var mapPath = new ResPath($"/{nameof(SaveLoadReparentTest)}{nameof(Test)}map.yml");
  101. Assert.That(mapLoader.TrySaveMap(mapId, mapPath));
  102. mapSys.DeleteMap(mapId);
  103. Assert.That(mapLoader.TryLoadMap(mapPath, out var map, out _), Is.True);
  104. var query = EnumerateQueryEnumerator(
  105. entities.EntityQueryEnumerator<BodyComponent>()
  106. ).Where((e) =>
  107. entities.GetComponent<MetaDataComponent>(e.Uid).EntityPrototype!.Name == "HumanBodyDummy"
  108. ).ToArray();
  109. Assert.That(query, Is.Not.Empty);
  110. foreach (var (uid, body) in query)
  111. {
  112. human = uid;
  113. parts = bodySystem.GetBodyChildren(human).Skip(1).ToArray();
  114. organs = bodySystem.GetBodyOrgans(human).ToArray();
  115. Assert.Multiple(() =>
  116. {
  117. Assert.That(parts, Is.Not.Empty);
  118. Assert.That(organs, Is.Not.Empty);
  119. });
  120. foreach (var (id, component) in parts)
  121. {
  122. var parent = bodySystem.GetParentPartOrNull(id);
  123. Assert.Multiple(() =>
  124. {
  125. Assert.That(component.Body, Is.EqualTo(human));
  126. Assert.That(parent, Is.Not.Null);
  127. Assert.That(parent.Value, Is.Not.EqualTo(default(EntityUid)));
  128. });
  129. foreach (var (slotId, slot) in component.Children)
  130. {
  131. Assert.Multiple(() =>
  132. {
  133. Assert.That(slot.Id, Is.EqualTo(slotId));
  134. var container =
  135. containerSystem.GetContainer(id, SharedBodySystem.GetPartSlotContainerId(slotId));
  136. Assert.That(container.ContainedEntities, Is.Not.Empty);
  137. });
  138. }
  139. }
  140. foreach (var (id, component) in organs)
  141. {
  142. var parent = bodySystem.GetParentPartOrNull(id);
  143. Assert.Multiple(() =>
  144. {
  145. Assert.That(component.Body, Is.EqualTo(human));
  146. Assert.That(parent, Is.Not.Null);
  147. Assert.That(parent.Value, Is.Not.EqualTo(default(EntityUid)));
  148. });
  149. }
  150. entities.DeleteEntity(map);
  151. }
  152. });
  153. await pair.CleanReturnAsync();
  154. }
  155. }