Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs =================================================================== diff -u -r67b333d96775b6b14ca2f64fa10f929f9448d143 -re50cfd6e9701cc0bdada71078a5019a1bea6f595 --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision 67b333d96775b6b14ca2f64fa10f929f9448d143) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision e50cfd6e9701cc0bdada71078a5019a1bea6f595) @@ -638,7 +638,7 @@ } // Remove any outdated nodes at the end - IEnumerable outdatedTreeNodes = treeNode.Nodes.Cast().Skip(newChildNodeObjects.Length); + IEnumerable outdatedTreeNodes = treeNode.Nodes.Cast().Skip(newChildNodeObjects.Length).ToList(); foreach (TreeNode outdatedNode in outdatedTreeNodes) { treeNode.Nodes.Remove(outdatedNode); Index: Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControlTest.cs =================================================================== diff -u -r13e84953f949f1d673f7e3303ad64259ec816349 -re50cfd6e9701cc0bdada71078a5019a1bea6f595 --- Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControlTest.cs (.../TreeViewControlTest.cs) (revision 13e84953f949f1d673f7e3303ad64259ec816349) +++ Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControlTest.cs (.../TreeViewControlTest.cs) (revision e50cfd6e9701cc0bdada71078a5019a1bea6f595) @@ -20,6 +20,8 @@ // All rights reserved. using System; +using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Windows.Forms; using Core.Common.Base; @@ -1637,55 +1639,41 @@ } [Test] - public void GivenObservableDataOnTreeControl_WhenObserversNotified_ThenNodeChildNodesOrderUpdated() + [TestCaseSource(nameof(GetDataModifiers))] + public void GivenObservableDataOnTreeControlThatIsModified_WhenObserversNotified_ThenNodeChildNodesUpdated(DataModifier dataModifier) { // Given var observable = new TestObservable(); using (var treeViewControl = new TreeViewControl()) { - var a = new object(); - var b = new object(); - var c = new object(); - - object[] dataItems = - { - a, - b, - c - }; - var treeChildNodeInfo = new TreeNodeInfo { TagType = typeof(object) }; var treeNodeInfo = new TreeNodeInfo { TagType = typeof(IObservable), - ChildNodeObjects = o => dataItems + ChildNodeObjects = o => dataModifier.Data }; treeViewControl.RegisterTreeNodeInfo(treeNodeInfo); treeViewControl.RegisterTreeNodeInfo(treeChildNodeInfo); treeViewControl.Data = observable; TreeNode node = ((System.Windows.Forms.TreeView) treeViewControl.Controls[0]).Nodes[0]; - dataItems[0] = c; - dataItems[1] = b; - dataItems[2] = a; + object[] originalData = dataModifier.Data; + dataModifier.ModifyData(); + // Precondition - Assert.AreSame(a, node.Nodes[0].Tag); - Assert.AreSame(b, node.Nodes[1].Tag); - Assert.AreSame(c, node.Nodes[2].Tag); + TestHelper.AssertCollectionAreSame(originalData, node.Nodes.Cast().Select(n => n.Tag)); // When observable.NotifyObservers(); // Then - Assert.AreSame(c, node.Nodes[0].Tag); - Assert.AreSame(b, node.Nodes[1].Tag); - Assert.AreSame(a, node.Nodes[2].Tag); + TestHelper.AssertCollectionAreSame(dataModifier.Data, node.Nodes.Cast().Select(n => n.Tag)); } } @@ -1752,8 +1740,7 @@ [Apartment(ApartmentState.STA)] [TestCase(true)] [TestCase(false)] - public void GivenTreeViewControl_WhenTreeViewItemDragOnNode_SelectThatNode( - bool canRenameNode) + public void GivenTreeViewControl_WhenTreeViewItemDragOnNode_SelectThatNode(bool canRenameNode) { // Given using (var treeViewControl = new TreeViewControl()) @@ -1850,6 +1837,82 @@ Assert.AreEqual(expandOnCreate, treeNode.IsExpanded); } } + + private static IEnumerable GetDataModifiers() + { + var a = new object(); + var b = new object(); + var c = new object(); + + yield return new TestCaseData(new DataModifier( + new List + { + a, + b, + c + }, items => items.Remove(a)) + ).SetName("FirstItemRemoved"); + + yield return new TestCaseData(new DataModifier( + new List + { + a, + b, + c + }, items => items.Remove(b)) + ).SetName("MiddleItemRemoved"); + + yield return new TestCaseData(new DataModifier( + new List + { + a, + b, + c + }, items => items.Remove(c)) + ).SetName("LastItemRemoved"); + + yield return new TestCaseData(new DataModifier( + new List + { + a, + b, + c + }, items => items.Clear()) + ).SetName("AllItemsRemoved"); + } + + /// + /// Helper class for performing data modifications. + /// + public class DataModifier + { + private readonly IList data; + private readonly Action> modificationAction; + + /// + /// Creates a new instance of . + /// + /// The data to modify. + /// The modification action to perform. + public DataModifier(IList data, Action> modificationAction) + { + this.data = data; + this.modificationAction = modificationAction; + } + + /// + /// Gets the data (before or after modification). + /// + public object[] Data => data.ToArray(); + + /// + /// Modifies the data. + /// + public void ModifyData() + { + modificationAction(data); + } + } } public class TestObservable : Observable {}