--- /dev/null
+using Content.IntegrationTests.Tests.Interaction;
+using Content.Server.Construction.Components;
+using Content.Shared.Temperature;
+
+namespace Content.IntegrationTests.Tests.Construction.Interaction;
+
+public sealed class EdgeClobbering : InteractionTest
+{
+ [TestPrototypes]
+ private const string Prototypes = @"
+- type: constructionGraph
+ id: ExampleGraph
+ start: A
+ graph:
+ - node: A
+ edges:
+ - to: B
+ steps:
+ - tool: Anchoring
+ doAfter: 1
+ - to: C
+ steps:
+ - tool: Screwing
+ doAfter: 1
+ - node: B
+ - node: C
+
+- type: entity
+ id: ExampleEntity
+ components:
+ - type: Construction
+ graph: ExampleGraph
+ node: A
+
+ ";
+
+ [Test]
+ public async Task EnsureNoEdgeClobbering()
+ {
+ await SpawnTarget("ExampleEntity");
+ var sTarget = SEntMan.GetEntity(Target!.Value);
+
+ await InteractUsing(Screw, false);
+ SEntMan.EventBus.RaiseLocalEvent(sTarget, new OnTemperatureChangeEvent(0f, 0f, 0f));
+ await AwaitDoAfters();
+
+ Assert.That(SEntMan.GetComponent<ConstructionComponent>(sTarget).Node, Is.EqualTo("C"));
+ }
+}
handled.Handled = true;
}
+ // Make sure the event passes validation before enqueuing it
+ if (HandleEvent(uid, args, true, construction) != HandleResult.Validated)
+ return;
+
// Enqueue this event so it'll be handled in the next tick.
// This prevents some issues that could occur from entity deletion, component deletion, etc in a handler.
construction.InteractionQueue.Enqueue(args);