DockTest.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Numerics;
  4. using Content.Server.Shuttles.Systems;
  5. using Content.Tests;
  6. using Robust.Server.GameObjects;
  7. using Robust.Shared.EntitySerialization.Systems;
  8. using Robust.Shared.GameObjects;
  9. using Robust.Shared.Map;
  10. using Robust.Shared.Map.Components;
  11. using Robust.Shared.Maths;
  12. using Robust.Shared.Utility;
  13. namespace Content.IntegrationTests.Tests.Shuttle;
  14. public sealed class DockTest : ContentUnitTest
  15. {
  16. private static IEnumerable<object[]> TestSource()
  17. {
  18. // I-shape for grid1, T-shape for grid2
  19. yield return new object[] { new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), Angle.Zero, Angle.Zero, true };
  20. yield return new object[] { new Vector2(0.5f, 1.5f), new Vector2(0.5f, 1.5f), Angle.Zero, Angle.Zero, false };
  21. }
  22. [Test]
  23. [TestCaseSource(nameof(TestSource))]
  24. public async Task TestDockingConfig(Vector2 dock1Pos, Vector2 dock2Pos, Angle dock1Angle, Angle dock2Angle, bool result)
  25. {
  26. await using var pair = await PoolManager.GetServerClient();
  27. var server = pair.Server;
  28. var map = await pair.CreateTestMap();
  29. var entManager = server.ResolveDependency<IEntityManager>();
  30. var mapManager = server.ResolveDependency<IMapManager>();
  31. var dockingSystem = entManager.System<DockingSystem>();
  32. var mapSystem = entManager.System<SharedMapSystem>();
  33. var xformSystem = entManager.System<SharedTransformSystem>();
  34. var mapId = map.MapId;
  35. await server.WaitAssertion(() =>
  36. {
  37. entManager.DeleteEntity(map.Grid);
  38. var grid1 = mapManager.CreateGridEntity(mapId);
  39. var grid2 = mapManager.CreateGridEntity(mapId);
  40. var grid1Ent = grid1.Owner;
  41. var grid2Ent = grid2.Owner;
  42. var grid2Offset = new Vector2(50f, 50f);
  43. xformSystem.SetLocalPosition(grid2Ent, grid2Offset);
  44. // Tetris tests
  45. // Grid1 is a vertical I
  46. // Grid2 is a T
  47. var tiles1 = new List<(Vector2i Index, Tile Tile)>()
  48. {
  49. new(new Vector2i(0, 0), new Tile(1)),
  50. new(new Vector2i(0, 1), new Tile(1)),
  51. new(new Vector2i(0, 2), new Tile(1)),
  52. };
  53. mapSystem.SetTiles(grid1.Owner, grid1.Comp, tiles1);
  54. var dock1 = entManager.SpawnEntity("AirlockShuttle", new EntityCoordinates(grid1Ent, dock1Pos));
  55. var dock1Xform = entManager.GetComponent<TransformComponent>(dock1);
  56. dock1Xform.LocalRotation = dock1Angle;
  57. var tiles2 = new List<(Vector2i Index, Tile Tile)>()
  58. {
  59. new(new Vector2i(0, 0), new Tile(1)),
  60. new(new Vector2i(0, 1), new Tile(1)),
  61. new(new Vector2i(0, 2), new Tile(1)),
  62. new(new Vector2i(-1, 2), new Tile(1)),
  63. new(new Vector2i(1, 2), new Tile(1)),
  64. };
  65. mapSystem.SetTiles(grid2.Owner, grid2.Comp, tiles2);
  66. var dock2 = entManager.SpawnEntity("AirlockShuttle", new EntityCoordinates(grid2Ent, dock2Pos));
  67. var dock2Xform = entManager.GetComponent<TransformComponent>(dock2);
  68. dock2Xform.LocalRotation = dock2Angle;
  69. var config = dockingSystem.GetDockingConfig(grid1Ent, grid2Ent);
  70. Assert.That(result, Is.EqualTo(config != null));
  71. });
  72. await pair.CleanReturnAsync();
  73. }
  74. [Test]
  75. public async Task TestPlanetDock()
  76. {
  77. await using var pair = await PoolManager.GetServerClient();
  78. var server = pair.Server;
  79. var map = await pair.CreateTestMap();
  80. var otherMap = await pair.CreateTestMap();
  81. var entManager = server.ResolveDependency<IEntityManager>();
  82. var dockingSystem = entManager.System<DockingSystem>();
  83. var mapSystem = entManager.System<SharedMapSystem>();
  84. MapGridComponent mapGrid = default!;
  85. var shuttle = EntityUid.Invalid;
  86. // Spawn shuttle and affirm no valid docks.
  87. await server.WaitAssertion(() =>
  88. {
  89. mapGrid = entManager.AddComponent<MapGridComponent>(map.MapUid);
  90. entManager.DeleteEntity(map.Grid);
  91. var path = new ResPath("/Maps/Shuttles/emergency.yml");
  92. Assert.That(entManager.System<MapLoaderSystem>().TryLoadGrid(otherMap.MapId, path, out var grid));
  93. shuttle = grid!.Value.Owner;
  94. var dockingConfig = dockingSystem.GetDockingConfig(shuttle, map.MapUid);
  95. Assert.That(dockingConfig, Is.EqualTo(null));
  96. });
  97. // Spawn dock and affirm it docks with no blockers / doesn't dock with blockers
  98. await server.WaitAssertion(() =>
  99. {
  100. mapSystem.SetTile(map.MapUid, mapGrid, Vector2i.Zero, new Tile(1));
  101. var airlockEnt = entManager.SpawnEntity("AirlockShuttle", new EntityCoordinates(map.MapUid, Vector2.One / 2f));
  102. Assert.That(entManager.GetComponent<TransformComponent>(airlockEnt).Anchored);
  103. var dockingConfig = dockingSystem.GetDockingConfig(shuttle, map.MapUid);
  104. Assert.That(dockingConfig, Is.Not.EqualTo(null));
  105. });
  106. await pair.CleanReturnAsync();
  107. }
  108. }