Skip to content

Commit

Permalink
Tree view sorting - simplify solution
Browse files Browse the repository at this point in the history
  • Loading branch information
rowo360 committed Feb 9, 2025
1 parent 9c0b971 commit dd59d86
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 120 deletions.
40 changes: 3 additions & 37 deletions src/TestCentric/testcentric.gui/Presenters/TreeViewNodeComparer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
/// </summary>
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);
}

/// <summary>
/// The FullnameComparer uses the FullName of the TestNodes (Namespace + class + method name)
/// It's indented to provide the same order as provided by NUnit
/// </summary>
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);
}

/// <summary>
/// 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
/// </summary>
private class NameComparer : IComparer
{
Expand Down
10 changes: 5 additions & 5 deletions src/TestCentric/testcentric.gui/Presenters/TreeViewPresenter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down Expand Up @@ -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":
Expand Down Expand Up @@ -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 += () =>
{
Expand Down Expand Up @@ -302,15 +302,15 @@ private void WireUpEvents()
//};
}

private void SortTreeView()
private void UpdateTreeViewSortMode()
{
var sortMode = _view.SortCommand.SelectedItem;

// Activate 'ShowTestDuration' in case sort by duration is selected
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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<ITreeDisplayStrategy>();
_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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

using NUnit.Framework;
using NSubstitute;
using System.Collections;

namespace TestCentric.Gui.Presenters.TestTree
{
Expand All @@ -31,6 +32,12 @@ public void ShowTestDurationIsSet()
_view.ShowTestDuration.Received().Checked = showTestDuration;
}

[Test]
public void SortingMode_IsUpdated_ToDefaultSorter()
{
_view.Received().Sort(Arg.Is<IComparer>(c => c.GetType().Name == "NameComparer"));
}

//[Test]
//public void StrategyIsSet()
//{
Expand Down
73 changes: 11 additions & 62 deletions src/TestCentric/tests/Presenters/TreeViewNodeComparerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<ITestModel>();

// Act
IComparer comparer = TreeViewNodeComparer.GetComparer(model, sortMode, sortDirection, showNamespace);
IComparer comparer = TreeViewNodeComparer.GetComparer(model, sortMode, sortDirection);

// Assert
string classname = comparer.GetType().Name;
Expand All @@ -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
Expand All @@ -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<ITestModel>();
TestNode testNode1 = new TestNode($"<test-start fullname='{text1}'/>");
TestNode testNode2 = new TestNode($"<test-start fullname='{text2}'/>");

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<ITestModel>();

TestNode testNode1 = new TestNode($"<test-start fullname='{text1}'/>");
TestNode testNode2 = new TestNode($"<test-start fullname='{text2}'/>");

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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down

0 comments on commit dd59d86

Please sign in to comment.