Fix wire layout inheritance. (#26289)
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.
This commit is contained in:
committed by
GitHub
parent
fc76996dc5
commit
a4692004de
103
Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs
Normal file
103
Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,11 +28,13 @@ public sealed partial class WireLayoutPrototype : IPrototype, IInheritingPrototy
|
|||||||
/// initialization)
|
/// initialization)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("dummyWires")]
|
[DataField("dummyWires")]
|
||||||
|
[NeverPushInheritance]
|
||||||
public int DummyWires { get; private set; } = default!;
|
public int DummyWires { get; private set; } = default!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// All the valid IWireActions currently in this layout.
|
/// All the valid IWireActions currently in this layout.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("wires")]
|
[DataField("wires")]
|
||||||
|
[NeverPushInheritance]
|
||||||
public List<IWireAction>? Wires { get; private set; }
|
public List<IWireAction>? Wires { get; private set; }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user