]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix wire layout inheritance. (#26289)
authorPieter-Jan Briers <pieterjan.briers+git@gmail.com>
Wed, 20 Mar 2024 15:22:47 +0000 (16:22 +0100)
committerGitHub <noreply@github.com>
Wed, 20 Mar 2024 15:22:47 +0000 (16:22 +0100)
Wire layouts manually navigate the inheritance hierarchy, but the data fields on the prototypes were also automatically inherited already. This meant that inheriting a wire layout prototype and changing nothing would cause the wires to be duplicated unless they were manually modified on top.

Fix is easy: just disable inheritance on the data fields.

Also, integration test for it.

Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs [new file with mode: 0644]
Content.Server/Wires/WireLayout.cs

diff --git a/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs b/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs
new file mode 100644 (file)
index 0000000..920dc08
--- /dev/null
@@ -0,0 +1,103 @@
+using Content.Server.Doors;
+using Content.Server.Power;
+using Content.Server.Wires;
+using Robust.Shared.GameObjects;
+using Robust.Shared.IoC;
+using Robust.Shared.Map;
+
+namespace Content.IntegrationTests.Tests.Wires;
+
+[TestFixture]
+[Parallelizable(ParallelScope.All)]
+[TestOf(typeof(WiresSystem))]
+public sealed class WireLayoutTest
+{
+    [TestPrototypes]
+    public const string Prototypes = """
+        - type: wireLayout
+          id: WireLayoutTest
+          dummyWires: 2
+          wires:
+          - !type:PowerWireAction
+          - !type:DoorBoltWireAction
+
+        - type: wireLayout
+          id: WireLayoutTest2
+          parent: WireLayoutTest
+          wires:
+          - !type:PowerWireAction
+
+        - type: wireLayout
+          id: WireLayoutTest3
+          parent: WireLayoutTest
+
+        - type: entity
+          id: WireLayoutTest
+          components:
+          - type: Wires
+            layoutId: WireLayoutTest
+
+        - type: entity
+          id: WireLayoutTest2
+          components:
+          - type: Wires
+            layoutId: WireLayoutTest2
+
+        - type: entity
+          id: WireLayoutTest3
+          components:
+          - type: Wires
+            layoutId: WireLayoutTest3
+        """;
+
+    [Test]
+    public async Task TestLayoutInheritance()
+    {
+        await using var pair = await PoolManager.GetServerClient();
+        var server = pair.Server;
+        var testMap = await pair.CreateTestMap();
+
+        await server.WaitAssertion(() =>
+        {
+            var wires = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<WiresSystem>();
+
+            // Need to spawn these entities to make sure the wire layouts are initialized.
+            var ent1 = SpawnWithComp<WiresComponent>(server.EntMan, "WireLayoutTest", testMap.MapCoords);
+            var ent2 = SpawnWithComp<WiresComponent>(server.EntMan, "WireLayoutTest2", testMap.MapCoords);
+            var ent3 = SpawnWithComp<WiresComponent>(server.EntMan, "WireLayoutTest3", testMap.MapCoords);
+
+            // Assert.That(wires.TryGetLayout("WireLayoutTest", out var layout1));
+            // Assert.That(wires.TryGetLayout("WireLayoutTest2", out var layout2));
+            // Assert.That(wires.TryGetLayout("WireLayoutTest3", out var layout3));
+
+            Assert.Multiple(() =>
+            {
+                // Entity 1.
+                Assert.That(ent1.Comp.WiresList, Has.Count.EqualTo(4));
+                Assert.That(ent1.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires");
+                Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf<PowerWireAction>(), "1 power wire");
+                Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf<DoorBoltWireAction>(), "1 door bolt wire");
+
+                Assert.That(ent2.Comp.WiresList, Has.Count.EqualTo(5));
+                Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires");
+                Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").InstanceOf<PowerWireAction>(), "2 power wire");
+                Assert.That(ent2.Comp.WiresList, Has.One.With.Property("Action").InstanceOf<DoorBoltWireAction>(), "1 door bolt wire");
+
+                Assert.That(ent3.Comp.WiresList, Has.Count.EqualTo(4));
+                Assert.That(ent3.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires");
+                Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf<PowerWireAction>(), "1 power wire");
+                Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf<DoorBoltWireAction>(), "1 door bolt wire");
+            });
+        });
+
+        await pair.CleanReturnAsync();
+    }
+
+    private static Entity<T> SpawnWithComp<T>(IEntityManager entityManager, string prototype, MapCoordinates coords)
+        where T : IComponent, new()
+    {
+        var ent = entityManager.Spawn(prototype, coords);
+        var comp = entityManager.EnsureComponent<T>(ent);
+        return new Entity<T>(ent, comp);
+    }
+}
index ecafba013e0cd9b82d97701256cb3d5e45eb0ae4..621992c915a0d9b04bc391ace490f12cf5e367ca 100644 (file)
@@ -28,11 +28,13 @@ public sealed partial class WireLayoutPrototype : IPrototype, IInheritingPrototy
     ///     initialization)
     /// </summary>
     [DataField("dummyWires")]
+    [NeverPushInheritance]
     public int DummyWires { get; private set; } = default!;
 
     /// <summary>
     ///     All the valid IWireActions currently in this layout.
     /// </summary>
     [DataField("wires")]
+    [NeverPushInheritance]
     public List<IWireAction>? Wires { get; private set; }
 }