feat(commons): add surgical remove members to ISurgicalAddressSpaceSink + deferred forwarding (guard-verified) (R2-07 T7)

This commit is contained in:
Joseph Doherty
2026-07-13 12:07:01 -04:00
parent 4f1853b21f
commit 438004e371
9 changed files with 210 additions and 1 deletions
@@ -114,6 +114,44 @@ public class DeferredAddressSpaceSinkTests
surgical.FolderRenameCalled.ShouldBeTrue();
}
// ---------- R2-07 Phase 2: surgical remove forwarding ----------
[Fact]
public void Remove_members_return_false_for_non_surgical_inner()
{
var sink = new DeferredAddressSpaceSink();
sink.SetSink(new SpySink());
sink.RemoveVariableNode("v-1").ShouldBeFalse();
sink.RemoveAlarmConditionNode("a-1").ShouldBeFalse();
sink.RemoveEquipmentSubtree("eq-1").ShouldBeFalse();
}
[Fact]
public void Remove_members_forward_to_surgical_inner()
{
var surgical = new SpySurgicalSink();
var sink = new DeferredAddressSpaceSink();
sink.SetSink(surgical);
sink.RemoveVariableNode("v-1").ShouldBeTrue();
sink.RemoveAlarmConditionNode("a-1").ShouldBeTrue();
sink.RemoveEquipmentSubtree("eq-1").ShouldBeTrue();
surgical.RemoveVariableCalled.ShouldBeTrue();
surgical.RemoveAlarmCalled.ShouldBeTrue();
surgical.RemoveSubtreeCalled.ShouldBeTrue();
}
[Fact]
public void Before_SetSink_remove_members_return_false()
{
var sink = new DeferredAddressSpaceSink();
sink.RemoveVariableNode("v-1").ShouldBeFalse();
sink.RemoveAlarmConditionNode("a-1").ShouldBeFalse();
sink.RemoveEquipmentSubtree("eq-1").ShouldBeFalse();
}
// ---------- SetSink(null) reverts to null sink ----------
[Fact]
@@ -183,5 +221,13 @@ public class DeferredAddressSpaceSinkTests
FolderRenameCalled = true;
return true;
}
public bool RemoveVariableCalled { get; private set; }
public bool RemoveAlarmCalled { get; private set; }
public bool RemoveSubtreeCalled { get; private set; }
public bool RemoveVariableNode(string variableNodeId) { RemoveVariableCalled = true; return true; }
public bool RemoveAlarmConditionNode(string alarmNodeId) { RemoveAlarmCalled = true; return true; }
public bool RemoveEquipmentSubtree(string equipmentNodeId) { RemoveSubtreeCalled = true; return true; }
}
}