Skip to content

Commit d8e3bad

Browse files
authored
Merge pull request #2169 from glopesdev/issue-1523
Ensure topological sort before deletion
2 parents 3896276 + 5dd5371 commit d8e3bad

File tree

4 files changed

+37
-2
lines changed

4 files changed

+37
-2
lines changed

Bonsai.Core.Tests/TestWorkflow.cs

+5
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ public TestWorkflow AppendOutput()
8787
return Append(new WorkflowOutputBuilder());
8888
}
8989

90+
public TestWorkflow AppendNamed(string name)
91+
{
92+
return Append(new GroupWorkflowBuilder { Name = name });
93+
}
94+
9095
public TestWorkflow AppendPropertyMapping(params string[] propertyNames)
9196
{
9297
var mappingBuilder = new PropertyMappingBuilder();

Bonsai.Editor.Tests/EditorHelper.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using Bonsai.Editor.GraphModel;
45
using Bonsai.Expressions;
@@ -45,6 +46,11 @@ internal static GraphNode FindNode(this WorkflowEditor editor, ExpressionBuilder
4546
return editor.FindGraphNode(node.Value);
4647
}
4748

49+
internal static IEnumerable<GraphNode> FindNodes(this WorkflowEditor editor, params string[] names)
50+
{
51+
return Array.ConvertAll(names, name => editor.FindNode(name));
52+
}
53+
4854
internal static void ConnectNodes(this WorkflowEditor editor, string source, string target)
4955
{
5056
var sourceNodes = new[] { editor.FindNode(source) };

Bonsai.Editor.Tests/WorkflowEditorTests.cs

+24
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,30 @@ public void DisconnectGraphNodes_TargetIsNotRoot_InsertAfterClosestRoot()
230230
assertIsReversible();
231231
}
232232

233+
[TestMethod]
234+
public void DeleteGraphNodes_SinglePathWithMultipleMergePoints_KeepConnectedPath()
235+
{
236+
var workflow = new TestWorkflow()
237+
.AppendNamed("A")
238+
.AppendNamed("B")
239+
.AppendBranch(source => source.AddArguments(source.AppendInput(index: 0)))
240+
.AppendNamed("C")
241+
.AppendBranch(source => source.AddArguments(source.AppendInput(index: 1)))
242+
.AppendNamed("D")
243+
.TopologicalSort()
244+
.ToInspectableGraph();
245+
246+
var (editor, assertIsReversible) = CreateMockEditor(workflow);
247+
var nodesToDelete = editor.FindNodes("B", "Source1", "C", "Source2");
248+
editor.DeleteGraphNodes(nodesToDelete);
249+
250+
var sourceNode = editor.FindNode("A");
251+
var targetNode = editor.FindNode("D");
252+
Assert.AreEqual(expected: 1, sourceNode.Successors.Count());
253+
Assert.IsTrue(sourceNode.Successors.Any(edge => edge.Node == targetNode));
254+
assertIsReversible();
255+
}
256+
233257
[TestMethod]
234258
public void CreateAnnotation_EmptySelection_InsertAfterClosestRoot()
235259
{

Bonsai.Editor/GraphModel/WorkflowEditor.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,7 @@ public void DeleteGraphNodes(IEnumerable<GraphNode> nodes)
15021502
var updateGraphLayout = CreateUpdateGraphLayoutDelegate();
15031503
commandExecutor.BeginCompositeCommand();
15041504
commandExecutor.Execute(EmptyAction, reorder.Undo + updateGraphLayout);
1505-
foreach (var node in nodes)
1505+
foreach (var node in nodes.SortSelection(Workflow).ToList())
15061506
{
15071507
DeleteGraphNode(node);
15081508
}

0 commit comments

Comments
 (0)