From bc914a911c64c43dc5e6586abeccfad1748b30e2 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Wed, 3 Oct 2018 16:07:26 -0400 Subject: [PATCH 1/9] Adding test to prove the error --- src/GitHub.Api/UI/TreeBase.cs | 1 - src/tests/UnitTests/UI/TreeBaseTests.cs | 73 +++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/GitHub.Api/UI/TreeBase.cs b/src/GitHub.Api/UI/TreeBase.cs index 915abe89f..771ae4290 100644 --- a/src/GitHub.Api/UI/TreeBase.cs +++ b/src/GitHub.Api/UI/TreeBase.cs @@ -332,7 +332,6 @@ private List GetLeafNodes(TNode node, int idx) return results; } - private void ToggleParentFoldersChecked(int idx, TNode node, bool isChecked) { while (true) diff --git a/src/tests/UnitTests/UI/TreeBaseTests.cs b/src/tests/UnitTests/UI/TreeBaseTests.cs index ec0c03467..6ba2d7419 100644 --- a/src/tests/UnitTests/UI/TreeBaseTests.cs +++ b/src/tests/UnitTests/UI/TreeBaseTests.cs @@ -185,6 +185,11 @@ public override TestTreeNode SelectedNode } } + public new void ToggleNodeChecked(int idx, TestTreeNode node) + { + base.ToggleNodeChecked(idx, node); + } + protected override List Nodes { get @@ -308,6 +313,8 @@ protected override bool PromoteMetaFiles return TestTreeListener.PromoteMetaFiles; } } + + } [TestFixture] @@ -606,6 +613,72 @@ public void ShouldPopulateTreeWithSingleEntryWithMetaInPath() } }); } + + + [Test] + public void ShouldCheckParentOfMetaFile() + { + var testTree = new TestTree(true); + var testTreeListener = testTree.TestTreeListener; + + testTreeListener.GetCollapsedFolders().Returns(new string[0]); + testTreeListener.SelectedNode.Returns((TestTreeNode)null); + testTreeListener.GetCheckedFiles().Returns(new string[0]); + testTreeListener.Nodes.Returns(new List()); + testTreeListener.PathSeparator.Returns(@"\"); + testTreeListener.DisplayRootNode.Returns(true); + testTreeListener.IsSelectable.Returns(false); + testTreeListener.Title.Returns("Test Tree"); + testTreeListener.PromoteMetaFiles.Returns(true); + + var testTreeData = new[] { + new TestTreeData { + Path = "Folder\\Default Scene.unity" + }, + new TestTreeData { + Path = "Folder\\Default Scene.unity.meta" + } + }; + testTree.Load(testTreeData); + + testTree.CreatedTreeNodes.ShouldAllBeEquivalentTo(new[] { + new TestTreeNode { + Path = "Test Tree", + Label = "Test Tree", + IsFolder = true + }, + new TestTreeNode { + Path = "Folder", + Label = "Folder", + Level = 1, + IsFolder = true + }, + new TestTreeNode { + Path = "Folder\\Default Scene.unity", + Label = "Default Scene.unity", + Level = 2, + TreeData = testTreeData[0], + IsContainer = true + }, + new TestTreeNode { + Path = "Folder\\Default Scene.unity.meta", + Label = "Default Scene.unity.meta", + Level = 3, + TreeData = testTreeData[1] + } + }); + + var sceneNode = testTree.CreatedTreeNodes[2]; + var sceneMetaNode = testTree.CreatedTreeNodes[3]; + + testTree.ToggleNodeChecked(3, sceneMetaNode); + + Assert.AreEqual(CheckState.Checked, sceneNode.CheckState); + Assert.AreEqual(CheckState.Checked, sceneMetaNode.CheckState); + + testTreeListener.Received(2).AddCheckedNode(Arg.Any()); + } + [Test] public void ShouldPopulateTreeWithSingleEntryWithNonPromotedMetaInPath() { From ecbdffe05b9cb0a331e99ba4374ab1c76ee47b4d Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Wed, 3 Oct 2018 16:16:50 -0400 Subject: [PATCH 2/9] Functionality to set parent node from meta --- src/GitHub.Api/UI/TreeBase.cs | 95 +++++++++++-------------- src/tests/UnitTests/UI/TreeBaseTests.cs | 3 + 2 files changed, 46 insertions(+), 52 deletions(-) diff --git a/src/GitHub.Api/UI/TreeBase.cs b/src/GitHub.Api/UI/TreeBase.cs index 771ae4290..1db09de94 100644 --- a/src/GitHub.Api/UI/TreeBase.cs +++ b/src/GitHub.Api/UI/TreeBase.cs @@ -183,23 +183,9 @@ protected bool PromoteNode(TNode previouslyAddedNode, string nextLabel) public void SetCheckStateOnAll(bool isChecked) { - var nodeCheckState = isChecked ? CheckState.Checked : CheckState.Empty; foreach (var node in Nodes) { - var wasChecked = node.CheckState == CheckState.Checked; - node.CheckState = nodeCheckState; - - if (!node.IsFolder) - { - if (isChecked && !wasChecked) - { - AddCheckedNode(node); - } - else if (!isChecked && wasChecked) - { - RemoveCheckedNode(node); - } - } + SetCheckStateOnNode(node, isChecked ? CheckState.Checked : CheckState.Empty); } } @@ -250,39 +236,32 @@ protected void ToggleNodeVisibility(int idx, TNode node) protected void ToggleNodeChecked(int idx, TNode node) { + CheckState checkState; var isChecked = false; - switch (node.CheckState) { case CheckState.Mixed: case CheckState.Empty: - node.CheckState = CheckState.Checked; + checkState = CheckState.Checked; isChecked = true; break; case CheckState.Checked: - node.CheckState = CheckState.Empty; + checkState = CheckState.Empty; break; - } - if (!node.IsFolder) - { - if (isChecked) - { - AddCheckedNode(node); - } - else - { - RemoveCheckedNode(node); - } + default: + throw new ArgumentOutOfRangeException("Unknown CheckState"); } + SetCheckStateOnNode(node, checkState); + if (node.IsFolderOrContainer) { ToggleChildrenChecked(idx, node, isChecked); } - ToggleParentFoldersChecked(idx, node, isChecked); + ToggleParentFolderAndContainersChecked(idx, node, isChecked); } private void ToggleChildrenChecked(int idx, TNode node, bool isChecked) @@ -290,20 +269,9 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked) for (var i = idx + 1; i < Nodes.Count && node.Level < Nodes[i].Level; i++) { var childNode = Nodes[i]; - var wasChecked = childNode.CheckState == CheckState.Checked; - childNode.CheckState = isChecked ? CheckState.Checked : CheckState.Empty; - if (!childNode.IsFolder) - { - if (isChecked && !wasChecked) - { - AddCheckedNode(childNode); - } - else if (!isChecked && wasChecked) - { - RemoveCheckedNode(childNode); - } - } + var wasChecked = childNode.CheckState == CheckState.Checked; + SetCheckStateOnNode(node, isChecked ? CheckState.Checked : CheckState.Empty); if (childNode.IsFolderOrContainer) { @@ -332,7 +300,29 @@ private List GetLeafNodes(TNode node, int idx) return results; } - private void ToggleParentFoldersChecked(int idx, TNode node, bool isChecked) + private void SetCheckStateOnNode(TNode node, CheckState nodeCheckState) + { + var isChecked = nodeCheckState == CheckState.Checked + || nodeCheckState == CheckState.Mixed; + + var wasChecked = node.CheckState == CheckState.Checked; + + node.CheckState = nodeCheckState; + + if (!node.IsFolder) + { + if (isChecked && !wasChecked) + { + AddCheckedNode(node); + } + else if (!isChecked && wasChecked) + { + RemoveCheckedNode(node); + } + } + } + + private void ToggleParentFolderAndContainersChecked(int idx, TNode node, bool isChecked) { while (true) { @@ -383,14 +373,15 @@ private void ToggleParentFoldersChecked(int idx, TNode node, bool isChecked) var parentIndex = firstSiblingIndex - 1; var parentNode = Nodes[parentIndex]; - if (siblingsInSameState) - { - parentNode.CheckState = isChecked ? CheckState.Checked : CheckState.Empty; - } - else - { - parentNode.CheckState = CheckState.Mixed; - } + + var parentNodeState = + siblingsInSameState + ? isChecked + ? CheckState.Checked + : CheckState.Empty + : CheckState.Mixed; + + SetCheckStateOnNode(parentNode, parentNodeState); idx = parentIndex; node = parentNode; diff --git a/src/tests/UnitTests/UI/TreeBaseTests.cs b/src/tests/UnitTests/UI/TreeBaseTests.cs index 6ba2d7419..434e54884 100644 --- a/src/tests/UnitTests/UI/TreeBaseTests.cs +++ b/src/tests/UnitTests/UI/TreeBaseTests.cs @@ -671,6 +671,9 @@ public void ShouldCheckParentOfMetaFile() var sceneNode = testTree.CreatedTreeNodes[2]; var sceneMetaNode = testTree.CreatedTreeNodes[3]; + Assert.AreEqual(CheckState.Empty, sceneNode.CheckState); + Assert.AreEqual(CheckState.Empty, sceneMetaNode.CheckState); + testTree.ToggleNodeChecked(3, sceneMetaNode); Assert.AreEqual(CheckState.Checked, sceneNode.CheckState); From 5802234958060c1f19d181c64ad1ff31bc2126a5 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Wed, 3 Oct 2018 16:26:04 -0400 Subject: [PATCH 3/9] Adding an overload --- src/GitHub.Api/UI/TreeBase.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/GitHub.Api/UI/TreeBase.cs b/src/GitHub.Api/UI/TreeBase.cs index 1db09de94..73692a8c9 100644 --- a/src/GitHub.Api/UI/TreeBase.cs +++ b/src/GitHub.Api/UI/TreeBase.cs @@ -185,7 +185,7 @@ public void SetCheckStateOnAll(bool isChecked) { foreach (var node in Nodes) { - SetCheckStateOnNode(node, isChecked ? CheckState.Checked : CheckState.Empty); + SetCheckStateOnNode(node, isChecked); } } @@ -271,7 +271,7 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked) var childNode = Nodes[i]; var wasChecked = childNode.CheckState == CheckState.Checked; - SetCheckStateOnNode(node, isChecked ? CheckState.Checked : CheckState.Empty); + SetCheckStateOnNode(node, isChecked); if (childNode.IsFolderOrContainer) { @@ -300,6 +300,11 @@ private List GetLeafNodes(TNode node, int idx) return results; } + private void SetCheckStateOnNode(TNode node, bool isChecked) + { + SetCheckStateOnNode(node, isChecked ? CheckState.Checked : CheckState.Empty); + } + private void SetCheckStateOnNode(TNode node, CheckState nodeCheckState) { var isChecked = nodeCheckState == CheckState.Checked From 6d65f91bc91231400ea303c9f49e0d5516dc86dc Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Wed, 3 Oct 2018 16:27:22 -0400 Subject: [PATCH 4/9] Cleanup --- src/tests/UnitTests/UI/TreeBaseTests.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/tests/UnitTests/UI/TreeBaseTests.cs b/src/tests/UnitTests/UI/TreeBaseTests.cs index 434e54884..399d15846 100644 --- a/src/tests/UnitTests/UI/TreeBaseTests.cs +++ b/src/tests/UnitTests/UI/TreeBaseTests.cs @@ -313,8 +313,6 @@ protected override bool PromoteMetaFiles return TestTreeListener.PromoteMetaFiles; } } - - } [TestFixture] @@ -614,7 +612,6 @@ public void ShouldPopulateTreeWithSingleEntryWithMetaInPath() }); } - [Test] public void ShouldCheckParentOfMetaFile() { From d8d92c990278df1306754c22ed90de05193686ae Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Wed, 3 Oct 2018 16:36:05 -0400 Subject: [PATCH 5/9] Rename variables --- src/GitHub.Api/UI/TreeBase.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/GitHub.Api/UI/TreeBase.cs b/src/GitHub.Api/UI/TreeBase.cs index 73692a8c9..d752af48d 100644 --- a/src/GitHub.Api/UI/TreeBase.cs +++ b/src/GitHub.Api/UI/TreeBase.cs @@ -300,19 +300,19 @@ private List GetLeafNodes(TNode node, int idx) return results; } - private void SetCheckStateOnNode(TNode node, bool isChecked) + private void SetCheckStateOnNode(TNode node, bool setChecked) { - SetCheckStateOnNode(node, isChecked ? CheckState.Checked : CheckState.Empty); + SetCheckStateOnNode(node, setChecked ? CheckState.Checked : CheckState.Empty); } - private void SetCheckStateOnNode(TNode node, CheckState nodeCheckState) + private void SetCheckStateOnNode(TNode node, CheckState setCheckState) { - var isChecked = nodeCheckState == CheckState.Checked - || nodeCheckState == CheckState.Mixed; + var isChecked = setCheckState == CheckState.Checked + || setCheckState == CheckState.Mixed; var wasChecked = node.CheckState == CheckState.Checked; - node.CheckState = nodeCheckState; + node.CheckState = setCheckState; if (!node.IsFolder) { From 4a8171d69da42b5913e72bd4d0b0f7e1c3183d26 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Thu, 4 Oct 2018 09:05:24 -0400 Subject: [PATCH 6/9] Adding an additional test and catching some bugs --- src/GitHub.Api/UI/TreeBase.cs | 12 ++- src/tests/UnitTests/UI/TreeBaseTests.cs | 114 ++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 7 deletions(-) diff --git a/src/GitHub.Api/UI/TreeBase.cs b/src/GitHub.Api/UI/TreeBase.cs index d752af48d..4804558ce 100644 --- a/src/GitHub.Api/UI/TreeBase.cs +++ b/src/GitHub.Api/UI/TreeBase.cs @@ -261,7 +261,7 @@ protected void ToggleNodeChecked(int idx, TNode node) ToggleChildrenChecked(idx, node, isChecked); } - ToggleParentFolderAndContainersChecked(idx, node, isChecked); + ToggleParentFolderAndContainersChecked(idx, node, checkState); } private void ToggleChildrenChecked(int idx, TNode node, bool isChecked) @@ -270,8 +270,7 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked) { var childNode = Nodes[i]; - var wasChecked = childNode.CheckState == CheckState.Checked; - SetCheckStateOnNode(node, isChecked); + SetCheckStateOnNode(childNode, isChecked); if (childNode.IsFolderOrContainer) { @@ -327,8 +326,9 @@ private void SetCheckStateOnNode(TNode node, CheckState setCheckState) } } - private void ToggleParentFolderAndContainersChecked(int idx, TNode node, bool isChecked) + private void ToggleParentFolderAndContainersChecked(int idx, TNode node, CheckState checkState) { + var isChecked = checkState != CheckState.Empty; while (true) { if (node.Level > 0) @@ -381,9 +381,7 @@ private void ToggleParentFolderAndContainersChecked(int idx, TNode node, bool is var parentNodeState = siblingsInSameState - ? isChecked - ? CheckState.Checked - : CheckState.Empty + ? node.CheckState : CheckState.Mixed; SetCheckStateOnNode(parentNode, parentNodeState); diff --git a/src/tests/UnitTests/UI/TreeBaseTests.cs b/src/tests/UnitTests/UI/TreeBaseTests.cs index 399d15846..de37c9455 100644 --- a/src/tests/UnitTests/UI/TreeBaseTests.cs +++ b/src/tests/UnitTests/UI/TreeBaseTests.cs @@ -679,6 +679,120 @@ public void ShouldCheckParentOfMetaFile() testTreeListener.Received(2).AddCheckedNode(Arg.Any()); } + [Test] + public void ShouldRippleUncheckCorrectly() + { + var testTree = new TestTree(true); + var testTreeListener = testTree.TestTreeListener; + + testTreeListener.GetCollapsedFolders().Returns(new string[0]); + testTreeListener.SelectedNode.Returns((TestTreeNode)null); + testTreeListener.GetCheckedFiles().Returns(new string[0]); + testTreeListener.Nodes.Returns(new List()); + testTreeListener.PathSeparator.Returns(@"\"); + testTreeListener.DisplayRootNode.Returns(true); + testTreeListener.IsSelectable.Returns(false); + testTreeListener.Title.Returns("Test Tree"); + testTreeListener.PromoteMetaFiles.Returns(true); + + var testTreeData = new[] { + new TestTreeData { + Path = "Root\\Parent\\A.txt" + }, + new TestTreeData { + Path = "Root\\Parent\\B.txt" + }, + new TestTreeData { + Path = "Root\\Parent\\C.txt" + } + }; + + testTree.Load(testTreeData); + + testTree.CreatedTreeNodes.ShouldAllBeEquivalentTo(new[] { + new TestTreeNode { + Path = "Test Tree", + Label = "Test Tree", + IsFolder = true + }, + new TestTreeNode { + Path = "Root", + Label = "Root", + Level = 1, + IsFolder = true + }, + new TestTreeNode { + Path = "Root\\Parent", + Label = "Parent", + Level = 2, + IsFolder = true + }, + new TestTreeNode { + Path = "Root\\Parent\\A.txt", + Label = "A.txt", + Level = 3, + TreeData = testTreeData[0], + }, + new TestTreeNode { + Path = "Root\\Parent\\B.txt", + Label = "B.txt", + Level = 3, + TreeData = testTreeData[1], + }, + new TestTreeNode { + Path = "Root\\Parent\\C.txt", + Label = "C.txt", + Level = 3, + TreeData = testTreeData[2], + } + }); + + var rootNode = testTree.CreatedTreeNodes[1]; + var parentNode = testTree.CreatedTreeNodes[2]; + var aNode = testTree.CreatedTreeNodes[3]; + var bNode = testTree.CreatedTreeNodes[4]; + var cNode = testTree.CreatedTreeNodes[5]; + + Assert.AreEqual(CheckState.Empty, rootNode.CheckState); + Assert.AreEqual(CheckState.Empty, parentNode.CheckState); + Assert.AreEqual(CheckState.Empty, aNode.CheckState); + Assert.AreEqual(CheckState.Empty, bNode.CheckState); + Assert.AreEqual(CheckState.Empty, cNode.CheckState); + + testTree.ToggleNodeChecked(1, rootNode); + + Assert.AreEqual(CheckState.Checked, rootNode.CheckState); + Assert.AreEqual(CheckState.Checked, parentNode.CheckState); + Assert.AreEqual(CheckState.Checked, aNode.CheckState); + Assert.AreEqual(CheckState.Checked, bNode.CheckState); + Assert.AreEqual(CheckState.Checked, cNode.CheckState); + + testTreeListener.Received(3).AddCheckedNode(Arg.Any()); + testTreeListener.ClearReceivedCalls(); + + testTree.ToggleNodeChecked(5, cNode); + + Assert.AreEqual(CheckState.Mixed, rootNode.CheckState); + Assert.AreEqual(CheckState.Mixed, parentNode.CheckState); + Assert.AreEqual(CheckState.Checked, aNode.CheckState); + Assert.AreEqual(CheckState.Checked, bNode.CheckState); + Assert.AreEqual(CheckState.Empty, cNode.CheckState); + + testTreeListener.Received(1).RemoveCheckedNode(Arg.Any()); + testTreeListener.ClearReceivedCalls(); + + testTree.ToggleNodeChecked(5, cNode); + + Assert.AreEqual(CheckState.Checked, rootNode.CheckState); + Assert.AreEqual(CheckState.Checked, parentNode.CheckState); + Assert.AreEqual(CheckState.Checked, aNode.CheckState); + Assert.AreEqual(CheckState.Checked, bNode.CheckState); + Assert.AreEqual(CheckState.Checked, cNode.CheckState); + + testTreeListener.Received(1).AddCheckedNode(Arg.Any()); + testTreeListener.ClearReceivedCalls(); + } + [Test] public void ShouldPopulateTreeWithSingleEntryWithNonPromotedMetaInPath() { From ce52b22553ab22625d7b4bdb66658b701c3dfb81 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Thu, 4 Oct 2018 09:07:24 -0400 Subject: [PATCH 7/9] Adding comments --- src/tests/UnitTests/UI/TreeBaseTests.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/tests/UnitTests/UI/TreeBaseTests.cs b/src/tests/UnitTests/UI/TreeBaseTests.cs index de37c9455..ff45a5799 100644 --- a/src/tests/UnitTests/UI/TreeBaseTests.cs +++ b/src/tests/UnitTests/UI/TreeBaseTests.cs @@ -753,6 +753,8 @@ public void ShouldRippleUncheckCorrectly() var bNode = testTree.CreatedTreeNodes[4]; var cNode = testTree.CreatedTreeNodes[5]; + // Initial state, everything unchecked + Assert.AreEqual(CheckState.Empty, rootNode.CheckState); Assert.AreEqual(CheckState.Empty, parentNode.CheckState); Assert.AreEqual(CheckState.Empty, aNode.CheckState); @@ -761,6 +763,8 @@ public void ShouldRippleUncheckCorrectly() testTree.ToggleNodeChecked(1, rootNode); + // Checked the root node, everything checked + Assert.AreEqual(CheckState.Checked, rootNode.CheckState); Assert.AreEqual(CheckState.Checked, parentNode.CheckState); Assert.AreEqual(CheckState.Checked, aNode.CheckState); @@ -770,6 +774,8 @@ public void ShouldRippleUncheckCorrectly() testTreeListener.Received(3).AddCheckedNode(Arg.Any()); testTreeListener.ClearReceivedCalls(); + // Unchecked c.txt, c.txt unchecked, parents mixed + testTree.ToggleNodeChecked(5, cNode); Assert.AreEqual(CheckState.Mixed, rootNode.CheckState); @@ -783,6 +789,8 @@ public void ShouldRippleUncheckCorrectly() testTree.ToggleNodeChecked(5, cNode); + // Checked c.txt, everything checked + Assert.AreEqual(CheckState.Checked, rootNode.CheckState); Assert.AreEqual(CheckState.Checked, parentNode.CheckState); Assert.AreEqual(CheckState.Checked, aNode.CheckState); From 16907561184d8e7c2198db052d594ad556f812f4 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Thu, 4 Oct 2018 09:14:35 -0400 Subject: [PATCH 8/9] Rename test --- src/tests/UnitTests/UI/TreeBaseTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/UnitTests/UI/TreeBaseTests.cs b/src/tests/UnitTests/UI/TreeBaseTests.cs index ff45a5799..b76e88cdd 100644 --- a/src/tests/UnitTests/UI/TreeBaseTests.cs +++ b/src/tests/UnitTests/UI/TreeBaseTests.cs @@ -680,7 +680,7 @@ public void ShouldCheckParentOfMetaFile() } [Test] - public void ShouldRippleUncheckCorrectly() + public void ShouldRippleChecksCorrectly() { var testTree = new TestTree(true); var testTreeListener = testTree.TestTreeListener; From 77265ae635831eda557af13ec3841606a5cab676 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Fri, 5 Oct 2018 11:11:11 -0400 Subject: [PATCH 9/9] Added final clause to test --- src/tests/UnitTests/UI/TreeBaseTests.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/tests/UnitTests/UI/TreeBaseTests.cs b/src/tests/UnitTests/UI/TreeBaseTests.cs index b76e88cdd..e2e5e07ed 100644 --- a/src/tests/UnitTests/UI/TreeBaseTests.cs +++ b/src/tests/UnitTests/UI/TreeBaseTests.cs @@ -799,6 +799,21 @@ public void ShouldRippleChecksCorrectly() testTreeListener.Received(1).AddCheckedNode(Arg.Any()); testTreeListener.ClearReceivedCalls(); + + // Unchecked a.txt b.txt and c.txt, everything checked + + testTree.ToggleNodeChecked(3, aNode); + testTree.ToggleNodeChecked(4, bNode); + testTree.ToggleNodeChecked(5, cNode); + + Assert.AreEqual(CheckState.Empty, rootNode.CheckState); + Assert.AreEqual(CheckState.Empty, parentNode.CheckState); + Assert.AreEqual(CheckState.Empty, aNode.CheckState); + Assert.AreEqual(CheckState.Empty, bNode.CheckState); + Assert.AreEqual(CheckState.Empty, cNode.CheckState); + + testTreeListener.Received(3).RemoveCheckedNode(Arg.Any()); + testTreeListener.ClearReceivedCalls(); } [Test]