1
0

FluidSpillTest.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #nullable enable
  2. using Content.Server.Fluids.EntitySystems;
  3. using Content.Server.Spreader;
  4. using Content.Shared.Chemistry.Components;
  5. using Content.Shared.FixedPoint;
  6. using Content.Shared.Fluids.Components;
  7. using Robust.Shared.GameObjects;
  8. using Robust.Shared.Map;
  9. using Robust.Shared.Map.Components;
  10. using Robust.Shared.Maths;
  11. using Robust.Shared.Timing;
  12. namespace Content.IntegrationTests.Tests.Fluids;
  13. [TestFixture]
  14. [TestOf(typeof(SpreaderSystem))]
  15. public sealed class FluidSpill
  16. {
  17. private static PuddleComponent? GetPuddle(IEntityManager entityManager, Entity<MapGridComponent> mapGrid, Vector2i pos)
  18. {
  19. return GetPuddleEntity(entityManager, mapGrid, pos)?.Comp;
  20. }
  21. private static Entity<PuddleComponent>? GetPuddleEntity(IEntityManager entityManager, Entity<MapGridComponent> mapGrid, Vector2i pos)
  22. {
  23. var mapSys = entityManager.System<SharedMapSystem>();
  24. foreach (var uid in mapSys.GetAnchoredEntities(mapGrid, mapGrid.Comp, pos))
  25. {
  26. if (entityManager.TryGetComponent(uid, out PuddleComponent? puddleComponent))
  27. return (uid, puddleComponent);
  28. }
  29. return null;
  30. }
  31. [Test]
  32. public async Task SpillCorner()
  33. {
  34. await using var pair = await PoolManager.GetServerClient();
  35. var server = pair.Server;
  36. var mapManager = server.ResolveDependency<IMapManager>();
  37. var entityManager = server.ResolveDependency<IEntityManager>();
  38. var puddleSystem = server.System<PuddleSystem>();
  39. var mapSystem = server.System<SharedMapSystem>();
  40. var gameTiming = server.ResolveDependency<IGameTiming>();
  41. EntityUid gridId = default;
  42. /*
  43. In this test, if o is spillage puddle and # are walls, we want to ensure all tiles are empty (`.`)
  44. . . .
  45. # . .
  46. o # .
  47. */
  48. await server.WaitPost(() =>
  49. {
  50. mapSystem.CreateMap(out var mapId);
  51. var grid = mapManager.CreateGridEntity(mapId);
  52. gridId = grid.Owner;
  53. for (var x = 0; x < 3; x++)
  54. {
  55. for (var y = 0; y < 3; y++)
  56. {
  57. mapSystem.SetTile(grid, new Vector2i(x, y), new Tile(1));
  58. }
  59. }
  60. entityManager.SpawnEntity("WallReinforced", mapSystem.GridTileToLocal(grid, grid.Comp, new Vector2i(0, 1)));
  61. entityManager.SpawnEntity("WallReinforced", mapSystem.GridTileToLocal(grid, grid.Comp, new Vector2i(1, 0)));
  62. });
  63. var puddleOrigin = new Vector2i(0, 0);
  64. await server.WaitAssertion(() =>
  65. {
  66. var grid = entityManager.GetComponent<MapGridComponent>(gridId);
  67. var solution = new Solution("Blood", FixedPoint2.New(100));
  68. var tileRef = mapSystem.GetTileRef(gridId, grid, puddleOrigin);
  69. #pragma warning disable NUnit2045 // Interdependent tests
  70. Assert.That(puddleSystem.TrySpillAt(tileRef, solution, out _), Is.True);
  71. Assert.That(GetPuddle(entityManager, (gridId, grid), puddleOrigin), Is.Not.Null);
  72. #pragma warning restore NUnit2045
  73. });
  74. var sTimeToWait = (int) Math.Ceiling(2f * gameTiming.TickRate);
  75. await server.WaitRunTicks(sTimeToWait);
  76. await server.WaitAssertion(() =>
  77. {
  78. var grid = entityManager.GetComponent<MapGridComponent>(gridId);
  79. var puddle = GetPuddleEntity(entityManager, (gridId, grid), puddleOrigin);
  80. #pragma warning disable NUnit2045 // Interdependent tests
  81. Assert.That(puddle, Is.Not.Null);
  82. Assert.That(puddleSystem.CurrentVolume(puddle!.Value.Owner, puddle), Is.EqualTo(FixedPoint2.New(100)));
  83. #pragma warning restore NUnit2045
  84. for (var x = 0; x < 3; x++)
  85. {
  86. for (var y = 0; y < 3; y++)
  87. {
  88. if (x == 0 && y == 0 || x == 0 && y == 1 || x == 1 && y == 0)
  89. {
  90. continue;
  91. }
  92. var newPos = new Vector2i(x, y);
  93. var sidePuddle = GetPuddle(entityManager, (gridId, grid), newPos);
  94. Assert.That(sidePuddle, Is.Null);
  95. }
  96. }
  97. });
  98. await pair.CleanReturnAsync();
  99. }
  100. }