From dd59d866558d7c0aadc5cf418f2cf1845fe62812 Mon Sep 17 00:00:00 2001 From: rowo360 <59574371+rowo360@users.noreply.github.com> Date: Sun, 9 Feb 2025 08:03:11 +0100 Subject: [PATCH] Tree view sorting - simplify solution --- .../Presenters/TreeViewNodeComparer.cs | 40 +--------- .../Presenters/TreeViewPresenter.cs | 10 +-- .../TestTree/TreeViewPresenterTests.cs | 16 ---- .../TestTree/WhenPresenterIsCreated.cs | 7 ++ .../Presenters/TreeViewNodeComparerTests.cs | 73 +++---------------- 5 files changed, 26 insertions(+), 120 deletions(-) diff --git a/src/TestCentric/testcentric.gui/Presenters/TreeViewNodeComparer.cs b/src/TestCentric/testcentric.gui/Presenters/TreeViewNodeComparer.cs index d691f36c..da47c2ca 100644 --- a/src/TestCentric/testcentric.gui/Presenters/TreeViewNodeComparer.cs +++ b/src/TestCentric/testcentric.gui/Presenters/TreeViewNodeComparer.cs @@ -25,53 +25,19 @@ public class TreeViewNodeComparer /// Get a IComparer implementation used to sort the tree nodes /// The sortModes are used by the context menu items in their Tag property /// - public static IComparer GetComparer(ITestModel model, string sortMode, string sortDirection, bool showNamespaces) + public static IComparer GetComparer(ITestModel model, string sortMode, string sortDirection) { bool ascending = sortDirection == Ascending; - if (sortMode == Name && !showNamespaces) - return new NameComparer(ascending); if (sortMode == Duration) return new DurationComparer(model, ascending); - return new FullnameComparer(ascending); - } - - /// - /// The FullnameComparer uses the FullName of the TestNodes (Namespace + class + method name) - /// It's indented to provide the same order as provided by NUnit - /// - private class FullnameComparer : IComparer - { - private bool _ascending; - - internal FullnameComparer(bool ascending) - { - _ascending = ascending; - } - - public int Compare(object x, object y) - { - TreeNode node1 = x as TreeNode; - TreeNode node2 = y as TreeNode; - - TestNode testNode1 = node1.Tag as TestNode; - TestNode testNode2 = node2.Tag as TestNode; - - if (!_ascending) - Swap(ref testNode1, ref testNode2); - - if (testNode1 == null || testNode2 == null) - return 1; - - return testNode1.FullName.CompareTo(testNode2.FullName); - } + return new NameComparer(ascending); } /// /// The NameComparer uses the Name of the TestNodes (either Namespace or class or method name) - /// If Namespaces are shown in the tree, it will provide the same results as the FullnameComparer - /// However if Namespaces are hidden, the NameComparer will sort the class names properly. + /// It's invoked by Windows Forms for all nodes of one hierarchy level to provide a proper ordering /// private class NameComparer : IComparer { diff --git a/src/TestCentric/testcentric.gui/Presenters/TreeViewPresenter.cs b/src/TestCentric/testcentric.gui/Presenters/TreeViewPresenter.cs index aef85ed8..044b34c7 100644 --- a/src/TestCentric/testcentric.gui/Presenters/TreeViewPresenter.cs +++ b/src/TestCentric/testcentric.gui/Presenters/TreeViewPresenter.cs @@ -41,6 +41,7 @@ public TreeViewPresenter(ITestTreeView treeView, ITestModel model, ITreeDisplayS _view.ShowCheckBoxes.Checked = _view.CheckBoxes = _treeSettings.ShowCheckBoxes; _view.ShowTestDuration.Checked = _treeSettings.ShowTestDuration; _view.AlternateImageSet = _treeSettings.AlternateImageSet; + UpdateTreeViewSortMode(); WireUpEvents(); } @@ -133,7 +134,6 @@ private void WireUpEvents() case "TestCentric.Gui.TestTree.TestList.GroupBy": case "TestCentric.Gui.TestTree.FixtureList.GroupBy": case "TestCentric.Gui.TestTree.ShowNamespace": - SortTreeView(); Strategy?.Reload(); break; case "TestCentric.Gui.TestTree.ShowCheckBoxes": @@ -170,9 +170,9 @@ private void WireUpEvents() Strategy?.UpdateTreeNodeNames(); }; - _view.SortCommand.SelectionChanged += () => SortTreeView(); + _view.SortCommand.SelectionChanged += () => UpdateTreeViewSortMode(); - _view.SortDirectionCommand.SelectionChanged += () => SortTreeView(); + _view.SortDirectionCommand.SelectionChanged += () => UpdateTreeViewSortMode(); _view.RunContextCommand.Execute += () => { @@ -302,7 +302,7 @@ private void WireUpEvents() //}; } - private void SortTreeView() + private void UpdateTreeViewSortMode() { var sortMode = _view.SortCommand.SelectedItem; @@ -310,7 +310,7 @@ private void SortTreeView() if (sortMode == TreeViewNodeComparer.Duration) _view.ShowTestDuration.Checked = true; - IComparer comparer = TreeViewNodeComparer.GetComparer(_model, sortMode, _view.SortDirectionCommand.SelectedItem, _treeSettings.ShowNamespace); + IComparer comparer = TreeViewNodeComparer.GetComparer(_model, sortMode, _view.SortDirectionCommand.SelectedItem); _view.Sort(comparer); } diff --git a/src/TestCentric/tests/Presenters/TestTree/TreeViewPresenterTests.cs b/src/TestCentric/tests/Presenters/TestTree/TreeViewPresenterTests.cs index b7685503..3f5b971b 100644 --- a/src/TestCentric/tests/Presenters/TestTree/TreeViewPresenterTests.cs +++ b/src/TestCentric/tests/Presenters/TestTree/TreeViewPresenterTests.cs @@ -42,22 +42,6 @@ public void WhenSettingsAreChanged_ShowNamespace_StrategyIsReloaded(bool showNam strategy.Received(2).Reload(); } - [TestCase(true)] - [TestCase(false)] - public void WhenSettingsAreChanged_ShowNamespace_Tree_IsSorted(bool showNamespace) - { - // Arrange - ITreeDisplayStrategy strategy = Substitute.For(); - _treeDisplayStrategyFactory.Create(null, null, null).ReturnsForAnyArgs(strategy); - _model.Settings.Gui.TestTree.DisplayFormat = "NUNIT_TREE"; - - // Act - _model.Settings.Gui.TestTree.ShowNamespace = showNamespace; - - // Assert - _view.ReceivedWithAnyArgs().Sort(null); - } - [TestCase(true)] [TestCase(false)] public void WhenSettingsAreChanged_ShowFilter_FilterVisibilityIsCalled(bool show) diff --git a/src/TestCentric/tests/Presenters/TestTree/WhenPresenterIsCreated.cs b/src/TestCentric/tests/Presenters/TestTree/WhenPresenterIsCreated.cs index 7417a315..2e76c0d3 100644 --- a/src/TestCentric/tests/Presenters/TestTree/WhenPresenterIsCreated.cs +++ b/src/TestCentric/tests/Presenters/TestTree/WhenPresenterIsCreated.cs @@ -5,6 +5,7 @@ using NUnit.Framework; using NSubstitute; +using System.Collections; namespace TestCentric.Gui.Presenters.TestTree { @@ -31,6 +32,12 @@ public void ShowTestDurationIsSet() _view.ShowTestDuration.Received().Checked = showTestDuration; } + [Test] + public void SortingMode_IsUpdated_ToDefaultSorter() + { + _view.Received().Sort(Arg.Is(c => c.GetType().Name == "NameComparer")); + } + //[Test] //public void StrategyIsSet() //{ diff --git a/src/TestCentric/tests/Presenters/TreeViewNodeComparerTests.cs b/src/TestCentric/tests/Presenters/TreeViewNodeComparerTests.cs index 281ff390..99696521 100644 --- a/src/TestCentric/tests/Presenters/TreeViewNodeComparerTests.cs +++ b/src/TestCentric/tests/Presenters/TreeViewNodeComparerTests.cs @@ -14,19 +14,17 @@ namespace TestCentric.Gui.Presenters [TestFixture] public class TreeViewNodeComparerTests { - [TestCase(TreeViewNodeComparer.Name, TreeViewNodeComparer.Ascending, false, "NameComparer")] - [TestCase(TreeViewNodeComparer.Name, TreeViewNodeComparer.Ascending, true, "FullnameComparer")] - [TestCase(TreeViewNodeComparer.Name, TreeViewNodeComparer.Descending, false, "NameComparer")] - [TestCase(TreeViewNodeComparer.Name, TreeViewNodeComparer.Descending, true, "FullnameComparer")] - [TestCase(TreeViewNodeComparer.Duration, TreeViewNodeComparer.Ascending, false, "DurationComparer")] - [TestCase(TreeViewNodeComparer.Duration, TreeViewNodeComparer.Descending, true, "DurationComparer")] - public void GetComparer(string sortMode, string sortDirection, bool showNamespace, string expectedComparerName) + [TestCase(TreeViewNodeComparer.Name, TreeViewNodeComparer.Ascending, "NameComparer")] + [TestCase(TreeViewNodeComparer.Name, TreeViewNodeComparer.Descending, "NameComparer")] + [TestCase(TreeViewNodeComparer.Duration, TreeViewNodeComparer.Ascending, "DurationComparer")] + [TestCase(TreeViewNodeComparer.Duration, TreeViewNodeComparer.Descending, "DurationComparer")] + public void GetComparer(string sortMode, string sortDirection, string expectedComparerName) { // Arrange ITestModel model = Substitute.For(); // Act - IComparer comparer = TreeViewNodeComparer.GetComparer(model, sortMode, sortDirection, showNamespace); + IComparer comparer = TreeViewNodeComparer.GetComparer(model, sortMode, sortDirection); // Assert string classname = comparer.GetType().Name; @@ -46,7 +44,7 @@ public void Namecompare_Ascending_ReturnsExpectedResult(string text1, string tex // Act - IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Name, TreeViewNodeComparer.Ascending, false); + IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Name, TreeViewNodeComparer.Ascending); int result = comparer.Compare(treeNode1, treeNode2); // Assert @@ -66,56 +64,7 @@ public void Namecompare_Descending_ReturnsExpectedResult(string text1, string te // Act - IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Name, TreeViewNodeComparer.Descending, false); - int result = comparer.Compare(treeNode1, treeNode2); - - // Assert - Assert.That(result, Is.EqualTo(expectedCompareResult)); - } - - [TestCase("Namespace1.A", "Namespace1.B", -1)] - [TestCase("Namespace1.B", "Namespace1.A", 1)] - [TestCase("Namespace1.A", "Namespace1.A", 0)] - [TestCase("Namespace1.A", "Namespace1.a", 1)] - [TestCase("a", "b", -1)] - [TestCase("aba", "aaa", 1)] - [TestCase("", "", 0)] - public void Fullnamecompare_Ascending_ReturnsExpectedResult(string text1, string text2, int expectedCompareResult) - { - // Arrange - ITestModel model = Substitute.For(); - TestNode testNode1 = new TestNode($""); - TestNode testNode2 = new TestNode($""); - - TreeNode treeNode1 = new TreeNode() { Tag = testNode1 }; - TreeNode treeNode2 = new TreeNode() { Tag = testNode2 }; - - // Act - IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Name, TreeViewNodeComparer.Ascending, true); - int result = comparer.Compare(treeNode1, treeNode2); - - // Assert - Assert.That(result, Is.EqualTo(expectedCompareResult)); - } - - [TestCase("Namespace1.A", "Namespace1.B", 1)] - [TestCase("Namespace1.B", "Namespace1.A", -1)] - [TestCase("Namespace1.A", "Namespace1.A", 0)] - [TestCase("Namespace1.A", "Namespace1.a", -1)] - [TestCase("", "", 0)] - public void Fullnamecompare_Descending_ReturnsExpectedResult(string text1, string text2, int expectedCompareResult) - { - // Arrange - ITestModel model = Substitute.For(); - - TestNode testNode1 = new TestNode($""); - TestNode testNode2 = new TestNode($""); - - TreeNode treeNode1 = new TreeNode() { Tag = testNode1 }; - TreeNode treeNode2 = new TreeNode() { Tag = testNode2 }; - - // Act - IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Name, TreeViewNodeComparer.Descending, true); + IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Name, TreeViewNodeComparer.Descending); int result = comparer.Compare(treeNode1, treeNode2); // Assert @@ -142,7 +91,7 @@ public void Durationcompare_Ascending_ReturnsExpectedResult(string duration1, st TreeNode treeNode2 = new TreeNode() { Tag = testNode2 }; // Act - IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Duration, TreeViewNodeComparer.Ascending, true); + IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Duration, TreeViewNodeComparer.Ascending); int result = comparer.Compare(treeNode1, treeNode2); // Assert @@ -169,7 +118,7 @@ public void Durationcompare_Descending_ReturnsExpectedResult(string duration1, s TreeNode treeNode2 = new TreeNode() { Tag = testNode2 }; // Act - IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Duration, TreeViewNodeComparer.Descending, true); + IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Duration, TreeViewNodeComparer.Descending); int result = comparer.Compare(treeNode1, treeNode2); // Assert @@ -192,7 +141,7 @@ public void Durationcompare_NoTestResultAvailable_ReturnsExpectedResult(string t TreeNode treeNode2 = new TreeNode(text2) { Tag = testNode2 }; // Act - IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Duration, sortDirection, true); + IComparer comparer = TreeViewNodeComparer.GetComparer(model, TreeViewNodeComparer.Duration, sortDirection); int result = comparer.Compare(treeNode1, treeNode2); // Assert