]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Allow InteractionTests to load other maps (#41226)
authorslarticodefast <161409025+slarticodefast@users.noreply.github.com>
Sat, 1 Nov 2025 04:00:17 +0000 (05:00 +0100)
committerGitHub <noreply@github.com>
Sat, 1 Nov 2025 04:00:17 +0000 (04:00 +0000)
* load maps and marker

* cleanup

* sneaky doc

* sneaky doc2

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Content.IntegrationTests/Pair/TestPair.Helpers.cs
Content.IntegrationTests/Tests/Interaction/InteractionTest.cs
Content.IntegrationTests/Tests/Interaction/InteractionTestTests.cs [new file with mode: 0644]
Content.Shared/Tests/TestMarkerComponent.cs [new file with mode: 0644]
Resources/Maps/Test/empty.yml
Resources/Prototypes/Entities/Markers/integration_test.yml [new file with mode: 0644]

index 1a3b38e829710b2973c5d3f64d43ff10c72d31bc..4d02b560c97dd13cabb1a1bd19a922df7f34ba26 100644 (file)
@@ -4,8 +4,13 @@ using System.Linq;
 using Content.Server.Preferences.Managers;
 using Content.Shared.Preferences;
 using Content.Shared.Roles;
+using Robust.Shared.EntitySerialization;
+using Robust.Shared.EntitySerialization.Systems;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Map;
 using Robust.Shared.Network;
 using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
 
 namespace Content.IntegrationTests.Pair;
 
@@ -15,13 +20,49 @@ public sealed partial class TestPair
     public Task<TestMapData> CreateTestMap(bool initialized = true)
         => CreateTestMap(initialized, "Plating");
 
+    /// <summary>
+    /// Loads a test map and returns a <see cref="TestMapData"/> representing it.
+    /// </summary>
+    /// <param name="testMapPath">The <see cref="ResPath"/> to the test map to load.</param>
+    /// <param name="initialized">Whether to initialize the map on load.</param>
+    /// <returns>A <see cref="TestMapData"/> representing the loaded map.</returns>
+    public async Task<TestMapData> LoadTestMap(ResPath testMapPath, bool initialized = true)
+    {
+        TestMapData mapData = new();
+        var deserializationOptions = DeserializationOptions.Default with { InitializeMaps = initialized };
+        var mapLoaderSys = Server.EntMan.System<MapLoaderSystem>();
+        var mapSys = Server.System<SharedMapSystem>();
+
+        // Load our test map in and assert that it exists.
+        await Server.WaitAssertion(() =>
+        {
+            Assert.That(mapLoaderSys.TryLoadMap(testMapPath, out var map, out var gridSet, deserializationOptions),
+                $"Failed to load map {testMapPath}.");
+            Assert.That(gridSet, Is.Not.Empty, "There were no grids loaded from the map!");
+
+            mapData.MapUid = map!.Value.Owner;
+            mapData.MapId = map!.Value.Comp.MapId;
+            mapData.Grid = gridSet!.First();
+            mapData.GridCoords = new EntityCoordinates(mapData.Grid, 0, 0);
+            mapData.MapCoords = new MapCoordinates(0, 0, mapData.MapId);
+            mapData.Tile = mapSys.GetAllTiles(mapData.Grid.Owner, mapData.Grid.Comp).First();
+        });
+
+        await RunTicksSync(10);
+        mapData.CMapUid = ToClientUid(mapData.MapUid);
+        mapData.CGridUid = ToClientUid(mapData.Grid);
+        mapData.CGridCoords = new EntityCoordinates(mapData.CGridUid, 0, 0);
+
+        return mapData;
+    }
+
     /// <summary>
     /// Set a user's antag preferences. Modified preferences are automatically reset at the end of the test.
     /// </summary>
     public async Task SetAntagPreference(ProtoId<AntagPrototype> id, bool value, NetUserId? user = null)
     {
         user ??= Client.User!.Value;
-        if (user is not {} userId)
+        if (user is not { } userId)
             return;
 
         var prefMan = Server.ResolveDependency<IServerPreferencesManager>();
@@ -30,7 +71,7 @@ public sealed partial class TestPair
         // Automatic preference resetting only resets slot 0.
         Assert.That(prefs.SelectedCharacterIndex, Is.EqualTo(0));
 
-        var profile = (HumanoidCharacterProfile) prefs.Characters[0];
+        var profile = (HumanoidCharacterProfile)prefs.Characters[0];
         var newProfile = profile.WithAntagPreference(id, value);
         _modifiedProfiles.Add(userId);
         await Server.WaitPost(() => prefMan.SetProfile(userId, 0, newProfile).Wait());
@@ -58,7 +99,7 @@ public sealed partial class TestPair
 
         var prefMan = Server.ResolveDependency<IServerPreferencesManager>();
         var prefs = prefMan.GetPreferences(user);
-        var profile = (HumanoidCharacterProfile) prefs.Characters[0];
+        var profile = (HumanoidCharacterProfile)prefs.Characters[0];
         var dictionary = new Dictionary<ProtoId<JobPrototype>, JobPriority>(profile.JobPriorities);
 
         // Automatic preference resetting only resets slot 0.
index 4a33fdc03b66b10a011d4008d60c52936827a8d4..746717e7856f1671bcf6c2168a562b20bf0d11e2 100644 (file)
@@ -24,6 +24,7 @@ using Robust.Shared.Map;
 using Robust.Shared.Player;
 using Robust.Shared.Prototypes;
 using Robust.Shared.Timing;
+using Robust.Shared.Utility;
 using Robust.UnitTesting;
 
 namespace Content.IntegrationTests.Tests.Interaction;
@@ -39,10 +40,20 @@ namespace Content.IntegrationTests.Tests.Interaction;
 [FixtureLifeCycle(LifeCycle.InstancePerTestCase)]
 public abstract partial class InteractionTest
 {
+    /// <summary>
+    /// The prototype that will be spawned for the player entity at <see cref="PlayerCoords"/>.
+    /// This is not a full humanoid and only has one hand by default.
+    /// </summary>
     protected virtual string PlayerPrototype => "InteractionTestMob";
 
+    /// <summary>
+    /// The map path to load for the integration test.
+    /// If null an empty map with a single 1x1 plating grid will be generated.
+    /// </summary>
+    protected virtual ResPath? TestMapPath => null;
+
     protected TestPair Pair = default!;
-    protected TestMapData MapData => Pair.TestMap!;
+    protected TestMapData MapData = default!;
 
     protected RobustIntegrationTest.ServerIntegrationInstance Server => Pair.Server;
     protected RobustIntegrationTest.ClientIntegrationInstance Client => Pair.Client;
@@ -199,7 +210,10 @@ public abstract partial class InteractionTest
         CUiSys = CEntMan.System<SharedUserInterfaceSystem>();
 
         // Setup map.
-        await Pair.CreateTestMap();
+        if (TestMapPath == null)
+            MapData = await Pair.CreateTestMap();
+        else
+            MapData = await Pair.LoadTestMap(TestMapPath.Value);
 
         PlayerCoords = SEntMan.GetNetCoordinates(Transform.WithEntityId(MapData.GridCoords.Offset(new Vector2(0.5f, 0.5f)), MapData.MapUid));
         TargetCoords = SEntMan.GetNetCoordinates(Transform.WithEntityId(MapData.GridCoords.Offset(new Vector2(1.5f, 0.5f)), MapData.MapUid));
diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTestTests.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTestTests.cs
new file mode 100644 (file)
index 0000000..54417b6
--- /dev/null
@@ -0,0 +1,31 @@
+using System.Linq;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Utility;
+
+namespace Content.IntegrationTests.Tests.Interaction;
+
+/// <summary>
+/// Makes sure that interaction test helper methods are working as intended.
+/// </summary>
+public sealed class InteractionTestTests : InteractionTest
+{
+    protected override ResPath? TestMapPath => new("Maps/Test/empty.yml");
+
+    /// <summary>
+    /// Tests that map loading is working correctly.
+    /// </summary>
+    [Test]
+    public void MapLoadingTest()
+    {
+        // Make sure that there is only one grid.
+        var grids = SEntMan.AllEntities<MapGridComponent>().ToList();
+        Assert.That(grids, Has.Count.EqualTo(1), "Test map did not have exactly one grid.");
+        Assert.That(grids, Does.Contain(MapData.Grid), "MapData did not contain the loaded grid.");
+
+        // Make sure we loaded the right map.
+        // This name is defined in empty.yml
+        Assert.That(SEntMan.GetComponent<MetaDataComponent>(MapData.MapUid).EntityName, Is.EqualTo("Empty Debug Map"));
+    }
+}
+
diff --git a/Content.Shared/Tests/TestMarkerComponent.cs b/Content.Shared/Tests/TestMarkerComponent.cs
new file mode 100644 (file)
index 0000000..7c9ff86
--- /dev/null
@@ -0,0 +1,16 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Tests;
+
+/// <summary>
+/// Component that is used by integration tests to mark and easily find certain entities on a test map.
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class TestMarkerComponent : Component
+{
+    /// <summary>
+    /// A string to keep multiple markers on the same map distinct.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public string Id = "marker";
+}
index e54a18422b41ffa9a05382c167a26eb0d9ad5055..d7f1cad57424d8e75678d7842964f0ee5fea2cd1 100644 (file)
@@ -56,7 +56,7 @@ entities:
   - uid: 3
     components:
     - type: MetaData
-      name: map 89
+      name: "Empty Debug Map"
     - type: Transform
     - type: Map
       mapPaused: True
diff --git a/Resources/Prototypes/Entities/Markers/integration_test.yml b/Resources/Prototypes/Entities/Markers/integration_test.yml
new file mode 100644 (file)
index 0000000..a18f793
--- /dev/null
@@ -0,0 +1,8 @@
+- type: entity
+  parent: MarkerBase
+  id: IntegrationTestMarker
+  name: Integration Test Marker
+  components:
+  - type: TestMarker
+  - type: Sprite
+    state: pink