diff --git a/src/TestCentric/testcentric.gui/Presenters/DisplayStrategy.cs b/src/TestCentric/testcentric.gui/Presenters/DisplayStrategy.cs index 4715339a..b5059b63 100644 --- a/src/TestCentric/testcentric.gui/Presenters/DisplayStrategy.cs +++ b/src/TestCentric/testcentric.gui/Presenters/DisplayStrategy.cs @@ -136,7 +136,7 @@ protected TreeNode MakeTreeNode(TestGroup group, bool recursive) public TreeNode MakeTreeNode(TestNode testNode, bool recursive) { - string treeNodeName = GetTestNodeDisplayName(testNode); + string treeNodeName = GetTreeNodeDisplayName(testNode); TreeNode treeNode = new TreeNode(treeNodeName); treeNode.Tag = testNode; @@ -176,14 +176,19 @@ public string GroupDisplayName(TestGroup group) return string.Format("{0} ({1})", group.Name, group.Count()); } - private string GetTestNodeDisplayName(TestNode testNode) + protected virtual string GetTreeNodeName(TestNode testNode) { - string treeNodeName = testNode.Name; + return testNode.Name; + } + + private string GetTreeNodeDisplayName(TestNode testNode) + { + string treeNodeName = GetTreeNodeName(testNode); // Check if test result is available for this node ResultNode result = _model.GetResultForTest(testNode.Id); if (_settings.Gui.TestTree.ShowTestDuration && result != null) - treeNodeName = testNode.Name + $" [{result.Duration:0.000}s]"; + treeNodeName += $" [{result.Duration:0.000}s]"; return treeNodeName; } @@ -212,7 +217,7 @@ private void UpdateTreeNodeName(TreeNode treeNode) if (testNode == null) return; - string treeNodeName = GetTestNodeDisplayName(testNode); + string treeNodeName = GetTreeNodeDisplayName(testNode); _view.InvokeIfRequired(() => treeNode.Text = treeNodeName); } diff --git a/src/TestCentric/testcentric.gui/Presenters/NUnitTreeDisplayStrategy.cs b/src/TestCentric/testcentric.gui/Presenters/NUnitTreeDisplayStrategy.cs index 44385e90..99f2f328 100644 --- a/src/TestCentric/testcentric.gui/Presenters/NUnitTreeDisplayStrategy.cs +++ b/src/TestCentric/testcentric.gui/Presenters/NUnitTreeDisplayStrategy.cs @@ -8,7 +8,8 @@ namespace TestCentric.Gui.Presenters { - using System.IO; + using System.Collections.Generic; + using System.Linq; using Model; using Views; @@ -18,6 +19,8 @@ namespace TestCentric.Gui.Presenters /// public class NUnitTreeDisplayStrategy : DisplayStrategy { + private IDictionary _foldedNodeNames = new Dictionary(); + public NUnitTreeDisplayStrategy(ITestTreeView view, ITestModel model) : base(view, model) { } @@ -32,9 +35,10 @@ public override string Description public override void OnTestLoaded(TestNode testNode, VisualState visualState) { ClearTree(); + _foldedNodeNames.Clear(); foreach (var topLevelNode in testNode.Children) - _view.Add(MakeTreeNode(topLevelNode, true)); + _view.Add(CreateNUnitTreeNode(null, topLevelNode)); if (visualState != null) visualState.ApplyTo(_view.TreeView); @@ -42,7 +46,87 @@ public override void OnTestLoaded(TestNode testNode, VisualState visualState) SetDefaultInitialExpansion(); } - protected override VisualState CreateVisualState() => new VisualState("NUNIT_TREE").LoadFrom(_view.TreeView); + protected override VisualState CreateVisualState() => new VisualState("NUNIT_TREE", _settings.Gui.TestTree.ShowNamespace).LoadFrom(_view.TreeView); + + protected override string GetTreeNodeName(TestNode testNode) + { + // For folded namespace nodes use the combined name of all folded nodes ("Library.Test.Folder") + if (_foldedNodeNames.TryGetValue(testNode, out var name)) + return name; + + return base.GetTreeNodeName(testNode); + } + + private TreeNode CreateNUnitTreeNode(TreeNode parentNode, TestNode testNode) + { + TreeNode treeNode = null; + + if (ShowTreeNodeType(testNode)) + { + if (IsNamespaceNode(testNode)) + { + // Get list of all namespace nodes which can be folded + // And get name of folded namespaces and store in dictionary for later usage + IList foldedNodes = FoldNamespaceNodes(testNode); + _foldedNodeNames[foldedNodes.First()] = GetFoldedNamespaceName(foldedNodes); + + treeNode = MakeTreeNode(foldedNodes.First(), false); // Create TreeNode representing the first node + testNode = foldedNodes.Last(); // But proceed building up tree with last node + } + else + treeNode = MakeTreeNode(testNode, false); + + parentNode?.Nodes.Add(treeNode); + parentNode = treeNode; + } + + foreach (TestNode child in testNode.Children) + { + CreateNUnitTreeNode(parentNode, child); + } + + return treeNode; + } + + /// + /// Check if a tree node type should be shown or omitted + /// Currently we support only omitting the namespace nodes + /// + private bool ShowTreeNodeType(TestNode testNode) + { + if (IsNamespaceNode(testNode)) + return _settings.Gui.TestTree.ShowNamespace; + + return true; + } + + private string GetFoldedNamespaceName(IList foldedNamespaces) + { + var namespaceNames = foldedNamespaces.Select(x => x.Name); + return String.Join(".", namespaceNames); + } + + private IList FoldNamespaceNodes(TestNode testNode) + { + if (!IsNamespaceNode(testNode)) + { + return new List(); + } + + // If a namespace node only contains one child item which is also a namespace node, we can fold them. + List namespaceNodes = new List() { testNode }; + if (testNode.Children.Count == 1 && IsNamespaceNode(testNode.Children[0])) + { + namespaceNodes.AddRange(FoldNamespaceNodes(testNode.Children[0])); + } + + return namespaceNodes; + } + + private bool IsNamespaceNode(TestNode testNode) + { + return testNode.IsSuite && (testNode.Type == "TestSuite" || testNode.Type == "SetUpFixture"); + } private void SetDefaultInitialExpansion() { diff --git a/src/TestCentric/testcentric.gui/Presenters/TestCentricPresenter.cs b/src/TestCentric/testcentric.gui/Presenters/TestCentricPresenter.cs index 36a13bad..59798345 100644 --- a/src/TestCentric/testcentric.gui/Presenters/TestCentricPresenter.cs +++ b/src/TestCentric/testcentric.gui/Presenters/TestCentricPresenter.cs @@ -265,6 +265,9 @@ void OnRunFinished(ResultNode result) case "TestCentric.Gui.TestTree.FixtureList.GroupBy": _view.GroupBy.SelectedItem = _settings.Gui.TestTree.FixtureList.GroupBy; break; + case "TestCentric.Gui.TestTree.ShowNamespace": + _view.ShowNamespace.SelectedIndex = _settings.Gui.TestTree.ShowNamespace ? 0 : 1; + break; } }; @@ -489,6 +492,11 @@ void OnRunFinished(ResultNode result) _settings.Gui.TestTree.DisplayFormat = _view.DisplayFormat.SelectedItem; }; + _view.ShowNamespace.SelectionChanged += () => + { + _settings.Gui.TestTree.ShowNamespace = _view.ShowNamespace.SelectedIndex == 0; + }; + _view.GroupBy.SelectionChanged += () => { switch(_view.DisplayFormat.SelectedItem) @@ -945,6 +953,9 @@ private void UpdateTreeDisplayMenuItem() _view.GroupBy.SelectedItem = _settings.Gui.TestTree.FixtureList.GroupBy; break; } + + _view.ShowNamespace.SelectedIndex = _settings.Gui.TestTree.ShowNamespace ? 0 : 1; + _view.ShowNamespace.Enabled = displayFormat == "NUNIT_TREE"; } private void RunAllTests() diff --git a/src/TestCentric/testcentric.gui/Presenters/TreeViewPresenter.cs b/src/TestCentric/testcentric.gui/Presenters/TreeViewPresenter.cs index bb5515d1..fa317fa8 100644 --- a/src/TestCentric/testcentric.gui/Presenters/TreeViewPresenter.cs +++ b/src/TestCentric/testcentric.gui/Presenters/TreeViewPresenter.cs @@ -128,6 +128,7 @@ private void WireUpEvents() } case "TestCentric.Gui.TestTree.TestList.GroupBy": case "TestCentric.Gui.TestTree.FixtureList.GroupBy": + case "TestCentric.Gui.TestTree.ShowNamespace": Strategy?.Reload(); break; case "TestCentric.Gui.TestTree.ShowCheckBoxes": @@ -283,6 +284,8 @@ private void UpdateTreeSettingsFromVisualState(VisualState visualState) { _treeSettings.FixtureList.GroupBy = visualState.GroupBy; } + + _treeSettings.ShowNamespace = visualState.ShowNamespace; } private void EnsureNonRunnableFilesAreVisible(TestNode testNode) diff --git a/src/TestCentric/testcentric.gui/Views/IMainView.cs b/src/TestCentric/testcentric.gui/Views/IMainView.cs index 63411042..e62acaf1 100644 --- a/src/TestCentric/testcentric.gui/Views/IMainView.cs +++ b/src/TestCentric/testcentric.gui/Views/IMainView.cs @@ -76,6 +76,7 @@ public interface IMainView IViewElement DisplayFormatButton { get; } ISelection DisplayFormat { get; } ISelection GroupBy { get; } + ISelection ShowNamespace { get; } ICommand RunParametersButton { get; } IChecked RunSummaryButton { get; } diff --git a/src/TestCentric/testcentric.gui/Views/TestCentricMainView.cs b/src/TestCentric/testcentric.gui/Views/TestCentricMainView.cs index 90d02135..bd2787d9 100644 --- a/src/TestCentric/testcentric.gui/Views/TestCentricMainView.cs +++ b/src/TestCentric/testcentric.gui/Views/TestCentricMainView.cs @@ -87,6 +87,8 @@ public class TestCentricMainView : TestCentricFormBase, IMainView private ToolStripMenuItem nunitTreeMenuItem; private ToolStripMenuItem fixtureListMenuItem; private ToolStripMenuItem testListMenuItem; + private ToolStripMenuItem nunitTreeShowNamespaceMenuItem; + private ToolStripMenuItem nunitTreeHideNamespaceMenuItem; private ToolStripSeparator toolStripSeparator13; private ToolStripMenuItem byAssemblyMenuItem; private ToolStripMenuItem byFixtureMenuItem; @@ -175,6 +177,7 @@ public TestCentricMainView() : base("TestCentric") GroupBy = new CheckedToolStripMenuGroup( "testGrouping", byAssemblyMenuItem, byFixtureMenuItem, byCategoryMenuItem, byOutcomeMenuItem, byDurationMenuItem); + ShowNamespace = new CheckedToolStripMenuGroup("showNamespace", nunitTreeShowNamespaceMenuItem, nunitTreeHideNamespaceMenuItem); RunParametersButton = new ToolStripButtonElement(runParametersButton); RunSummaryButton = new CheckBoxElement(runSummaryButton); @@ -217,6 +220,8 @@ private void InitializeComponent() this.nunitTreeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fixtureListMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.testListMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.nunitTreeShowNamespaceMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.nunitTreeHideNamespaceMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.byAssemblyMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.byFixtureMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -405,6 +410,23 @@ private void InitializeComponent() this.displayFormatButton.Size = new System.Drawing.Size(29, 21); this.displayFormatButton.Text = "Display"; this.displayFormatButton.ToolTipText = "Tree Display Format"; + + // + // nunitTreeShowNamespaceMenuItem + // + this.nunitTreeShowNamespaceMenuItem.Name = "NUNIT_TREE_SHOW_NAMESPACE"; + this.nunitTreeShowNamespaceMenuItem.Size = new System.Drawing.Size(198, 22); + this.nunitTreeShowNamespaceMenuItem.Tag = "NUNIT_TREE_SHOW_NAMESPACE"; + this.nunitTreeShowNamespaceMenuItem.Text = "Show Namespace"; + + // + // nunitTreeHideNamespaceMenuItem + // + this.nunitTreeHideNamespaceMenuItem.Name = "NUNIT_TREE_HIDE_NAMESPACE"; + this.nunitTreeHideNamespaceMenuItem.Size = new System.Drawing.Size(198, 22); + this.nunitTreeHideNamespaceMenuItem.Tag = "NUNIT_TREE_HIDE_NAMESPACE"; + this.nunitTreeHideNamespaceMenuItem.Text = "Hide Namespace"; + // // nunitTreeMenuItem // @@ -412,6 +434,8 @@ private void InitializeComponent() this.nunitTreeMenuItem.Size = new System.Drawing.Size(198, 22); this.nunitTreeMenuItem.Tag = "NUNIT_TREE"; this.nunitTreeMenuItem.Text = "NUnit Tree"; + nunitTreeMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { nunitTreeShowNamespaceMenuItem, nunitTreeHideNamespaceMenuItem }); + // // fixtureListMenuItem // @@ -1124,6 +1148,7 @@ public int SplitterPosition public IViewElement DisplayFormatButton { get; private set; } public ISelection DisplayFormat { get; private set; } public ISelection GroupBy { get; private set; } + public ISelection ShowNamespace { get; private set; } public ICommand RunParametersButton { get; private set; } public IChecked RunSummaryButton { get; private set; } diff --git a/src/TestCentric/testcentric.gui/VisualState.cs b/src/TestCentric/testcentric.gui/VisualState.cs index ce59f475..8632015b 100644 --- a/src/TestCentric/testcentric.gui/VisualState.cs +++ b/src/TestCentric/testcentric.gui/VisualState.cs @@ -30,6 +30,12 @@ public VisualState(string strategyID) DisplayStrategy = strategyID; } + public VisualState(string strategyID, bool showNamespace) + { + DisplayStrategy = strategyID; + ShowNamespace = showNamespace; + } + public VisualState(string strategyID, string groupID) { if (strategyID == "NUNIT_TREE") @@ -53,6 +59,8 @@ public VisualState(string strategyID, string groupID) //[XmlAttribute, DefaultValue(false)] public bool ShowCheckBoxes; + public bool ShowNamespace; + // TODO: Categories not yet supported //public List SelectedCategories; //public bool ExcludeCategories; @@ -250,6 +258,7 @@ public void ReadXml(XmlReader reader) // GroupBy is null for NUnitTree strategy, otherwise required if (GroupBy == null && strategy != "NUNIT_TREE") GroupBy = "ASSEMBLY"; ShowCheckBoxes = reader.GetAttribute("ShowCheckBoxes") == "True"; + ShowNamespace = reader.GetAttribute("ShowNamespace") == "True"; while (reader.Read()) { @@ -364,7 +373,9 @@ public void WriteXml(XmlWriter writer) writer.WriteAttributeString("GroupBy", GroupBy); if (ShowCheckBoxes) writer.WriteAttributeString("ShowCheckBoxes", "True"); - + if (ShowNamespace) + writer.WriteAttributeString("ShowNamespace", "True"); + WriteVisualTreeNodes(Nodes); void WriteVisualTreeNodes(List nodes) diff --git a/src/TestCentric/tests/Presenters/Main/CommandTests.cs b/src/TestCentric/tests/Presenters/Main/CommandTests.cs index 95f78b6a..a278a8b8 100644 --- a/src/TestCentric/tests/Presenters/Main/CommandTests.cs +++ b/src/TestCentric/tests/Presenters/Main/CommandTests.cs @@ -349,5 +349,19 @@ public void SelectedTestsChanged_TestSelected_CommandIsEnabled() // Assert Assert.That(_view.RunSelectedButton.Enabled, Is.True); } + + [TestCase(0, true)] + [TestCase(1, false)] + public void ShowNamespaceChanged_ChangesModelSetting(int selectedMenuItem, bool expectedShowNamespace) + { + // Arrange + _view.ShowNamespace.SelectedIndex.Returns(selectedMenuItem); + + // Act + _view.ShowNamespace.SelectionChanged += Raise.Event(); + + // Assert + Assert.That(_model.Settings.Gui.TestTree.ShowNamespace, Is.EqualTo(expectedShowNamespace)); + } } } diff --git a/src/TestCentric/tests/Presenters/Main/WhenSettingsChanged.cs b/src/TestCentric/tests/Presenters/Main/WhenSettingsChanged.cs index 224b5c4c..3e495527 100644 --- a/src/TestCentric/tests/Presenters/Main/WhenSettingsChanged.cs +++ b/src/TestCentric/tests/Presenters/Main/WhenSettingsChanged.cs @@ -44,5 +44,16 @@ public void TestListGroupBy_SettingChanged_MenuItemIsUpdated(string groupBy) // 2. Assert _view.GroupBy.SelectedItem = groupBy; } + + [TestCase(true, 0)] + [TestCase(false, 1)] + public void ShowNamespace_SettingChanged_MenuItemIsUpdated(bool showNamespace, int expectedMenuIndex) + { + // 1. Act + _settings.Gui.TestTree.ShowNamespace = showNamespace; + + // 2. Assert + _view.ShowNamespace.SelectedIndex = expectedMenuIndex; + } } } diff --git a/src/TestCentric/tests/Presenters/NUnitTreeDisplayStrategyTests.cs b/src/TestCentric/tests/Presenters/NUnitTreeDisplayStrategyTests.cs index 4f8f8d3c..d43f07a5 100644 --- a/src/TestCentric/tests/Presenters/NUnitTreeDisplayStrategyTests.cs +++ b/src/TestCentric/tests/Presenters/NUnitTreeDisplayStrategyTests.cs @@ -180,6 +180,156 @@ public void MakeTreeNode_ShowDurationIsInactive_TreeNodeName_ContainsTestName() // Assert Assert.That(treeNode.Text, Does.Match(@"Test1")); } + + [Test] + public void OnTestLoaded_Namespaces_AreShown_NamespaceNodes_AreCreated() + { + // Arrange + _settings.Gui.TestTree.ShowNamespace = true; + string xml = + "" + + "" + + "" + + ""; + + // Act + _strategy.OnTestLoaded(new TestNode(xml), null); + + // Assert + _view.Received().Add(Arg.Compat.Is(tn => (tn.Tag as TestNode).Id == "1-1031")); + } + + [Test] + public void OnTestLoaded_Namespaces_AreNotShown_NamespaceNodes_AreNotCreated() + { + // Arrange + _settings.Gui.TestTree.ShowNamespace = false; + string xml = + "" + + "" + + "" + + ""; + + // Act + _strategy.OnTestLoaded(new TestNode(xml), null); + + // Assert + _view.DidNotReceive().Add(Arg.Compat.Is(tn => (tn.Tag as TestNode).Id == "1-1031")); + } + + [Test] + public void OnTestLoaded_NamespacesNodes_ContainingOneNamespace_AreFolded() + { + // Arrange + string xml = + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + + TreeNode treeNode = null; + _view.Add(Arg.Do(tn => treeNode = tn)); + + // Act + _strategy.OnTestLoaded(new TestNode(xml), null); + + // Assert + Assert.That((treeNode.Tag as TestNode).Id, Is.EqualTo("1-1031")); + Assert.That(treeNode.Text, Is.EqualTo("Library.Test.Folder")); + Assert.That(treeNode.Nodes.Count, Is.EqualTo(0)); + } + + [Test] + public void OnTestLoaded_NamespacesNode_ContainingTwoNamespaces_AreNotFolded() + { + // Arrange + string xml = + "" + + "" + + @"" + + @"" + + "" + + ""; + + TreeNode treeNode = null; + _view.Add(Arg.Do(tn => treeNode = tn)); + + // Act + _strategy.OnTestLoaded(new TestNode(xml), null); + + // Assert + Assert.That((treeNode.Tag as TestNode).Id, Is.EqualTo("1-1031")); + Assert.That(treeNode.Text, Is.EqualTo("Library")); + + var child1 = treeNode.Nodes[0]; + Assert.That((child1.Tag as TestNode).Id, Is.EqualTo("1-1032")); + Assert.That(child1.Text, Is.EqualTo("Test")); + + var child2 = treeNode.Nodes[1]; + Assert.That((child2.Tag as TestNode).Id, Is.EqualTo("1-1033")); + Assert.That(child2.Text, Is.EqualTo("Folder")); + } + + [Test] + public void OnTestLoaded_SetupFixtureNode_ContainingOneNamespace_AreFolded() + { + // Arrange + string xml = + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + + TreeNode treeNode = null; + _view.Add(Arg.Do(tn => treeNode = tn)); + + // Act + _strategy.OnTestLoaded(new TestNode(xml), null); + + // Assert + Assert.That((treeNode.Tag as TestNode).Id, Is.EqualTo("1-1031")); + Assert.That(treeNode.Text, Is.EqualTo("Library.Test.Folder")); + Assert.That(treeNode.Nodes.Count, Is.EqualTo(0)); + } + + [Test] + public void OnTestLoaded_SetupFixtureNode_ContainingTwoNamespaces_AreNotFolded() + { + // Arrange + string xml = + "" + + "" + + @"" + + @"" + + "" + + ""; + + TreeNode treeNode = null; + _view.Add(Arg.Do(tn => treeNode = tn)); + + // Act + _strategy.OnTestLoaded(new TestNode(xml), null); + + // Assert + Assert.That((treeNode.Tag as TestNode).Id, Is.EqualTo("1-1031")); + Assert.That(treeNode.Text, Is.EqualTo("Library")); + + var child1 = treeNode.Nodes[0]; + Assert.That((child1.Tag as TestNode).Id, Is.EqualTo("1-1032")); + Assert.That(child1.Text, Is.EqualTo("Test")); + + var child2 = treeNode.Nodes[1]; + Assert.That((child2.Tag as TestNode).Id, Is.EqualTo("1-1033")); + Assert.That(child2.Text, Is.EqualTo("Folder")); + } } diff --git a/src/TestCentric/tests/Presenters/TestTree/TreeViewPresenterTests.cs b/src/TestCentric/tests/Presenters/TestTree/TreeViewPresenterTests.cs index 03863f79..ca41acc6 100644 --- a/src/TestCentric/tests/Presenters/TestTree/TreeViewPresenterTests.cs +++ b/src/TestCentric/tests/Presenters/TestTree/TreeViewPresenterTests.cs @@ -27,6 +27,21 @@ public void WhenSettingsAreChanged_ShowCheckBoxes_NewSettingIsApplied(bool showC Assert.That(_view.ShowCheckBoxes.Checked, Is.EqualTo(showCheckBoxSetting)); } + [TestCase(true)] + [TestCase(false)] + public void WhenSettingsAreChanged_ShowNamespace_StrategyIsReloaed(bool showNamespace) + { + 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 + strategy.Received(2).Reload(); + } + [TestCase("Default")] [TestCase("VisualStudio")] public void WhenSettingsAreChanged_AlternateImageSet_NewSettingIsApplied(string imageSet) diff --git a/src/TestCentric/tests/Presenters/TestTree/WhenTestsAreLoaded.cs b/src/TestCentric/tests/Presenters/TestTree/WhenTestsAreLoaded.cs index fb29bcde..be95fd6e 100644 --- a/src/TestCentric/tests/Presenters/TestTree/WhenTestsAreLoaded.cs +++ b/src/TestCentric/tests/Presenters/TestTree/WhenTestsAreLoaded.cs @@ -86,6 +86,44 @@ public void TestLoaded_WithVisualState_ShowCheckBox_IsAppliedFromVisualState(boo Assert.That(_view.ShowCheckBoxes.Checked, Is.EqualTo(showCheckBox)); } + [TestCase(true)] + [TestCase(false)] + public void TestLoaded_NoVisualState_ShowNamespace_IsAppliedFromSettings(bool showNamespace) + { + // Arrange: adapt settings + _model.Settings.Gui.TestTree.ShowNamespace = showNamespace; + + // Act: load tests + TestNode testNode = new TestNode(""); + _model.LoadedTests.Returns(testNode); + FireTestLoadedEvent(testNode); + + // Assert + Assert.That(_model.Settings.Gui.TestTree.ShowNamespace, Is.EqualTo(showNamespace)); + } + + [TestCase(true)] + [TestCase(false)] + public void TestLoaded_WithVisualState_ShowNamespace_IsAppliedFromVisualState(bool showNamespace) + { + // Arrange: Create and save VisualState file + VisualState visualState = new VisualState(); + visualState.ShowNamespace = showNamespace; + string fileName = VisualState.GetVisualStateFileName(TestFileName); + visualState.Save(fileName); + + var tv = new TreeView(); + _view.TreeView.Returns(tv); + + // Act: Load tests + TestNode testNode = new TestNode(""); + _model.LoadedTests.Returns(testNode); + FireTestLoadedEvent(testNode); + + // Assert + Assert.That(_settings.Gui.TestTree.ShowNamespace, Is.EqualTo(showNamespace)); + } + [TestCase("NUNIT_TREE", typeof(NUnitTreeDisplayStrategy))] [TestCase("FIXTURE_LIST", typeof(FixtureListDisplayStrategy))] [TestCase("TEST_LIST", typeof(TestListDisplayStrategy))] diff --git a/src/TestCentric/tests/VisualStateSerializationTests.cs b/src/TestCentric/tests/VisualStateSerializationTests.cs index c9b8f582..93dc3c83 100644 --- a/src/TestCentric/tests/VisualStateSerializationTests.cs +++ b/src/TestCentric/tests/VisualStateSerializationTests.cs @@ -68,6 +68,7 @@ public void SerializeVisualState(VisualState vs) Assert.That(docElement.Name, Is.EqualTo("VisualState")); Assert.That(docElement.GetAttribute("DisplayStrategy"), Is.EqualTo(vs.DisplayStrategy)); Assert.That(docElement.GetAttribute("ShowCheckBoxes"), Is.EqualTo(vs.ShowCheckBoxes ? "True" : "")); + Assert.That(docElement.GetAttribute("ShowNamespace"), Is.EqualTo(vs.ShowNamespace ? "True" : "")); Assert.That(firstChild.Name, Is.EqualTo("Nodes")); Assert.That(topNodes.Count, Is.EqualTo(vs.Nodes.Count)); for (int i = 0; i < topNodes.Count; i++) @@ -147,6 +148,14 @@ public IEnumerator GetEnumerator() checkBoxes: true)) .SetName("NUnitTree_EmptyWithOneAttribute)"); + yield return new TestCaseData( + VisualStateTestData.CreateVisualState( + "NUNIT_TREE", + null, + checkBoxes: true, + showNamespace: true)) + .SetName("NUnitTree_EmptyWithTwoAttributes)"); + yield return new TestCaseData( VisualStateTestData.CreateVisualState( "NUNIT_TREE", diff --git a/src/TestCentric/tests/VisualStateTestData.cs b/src/TestCentric/tests/VisualStateTestData.cs index a143b7eb..92f0b4c2 100644 --- a/src/TestCentric/tests/VisualStateTestData.cs +++ b/src/TestCentric/tests/VisualStateTestData.cs @@ -133,6 +133,8 @@ public VisualState GetExpectedVisualState() case "NUNIT_TREE": return CreateVisualState( DisplayStrategy, + null, + true, true, VTN("Assembly1", EXP + TOP, VTN("NUnit", EXP, @@ -351,6 +353,11 @@ public static VisualState CreateVisualState(string strategy, bool checkBoxes = f } public static VisualState CreateVisualState(string strategy, string grouping, bool checkBoxes = false, params VisualTreeNode[] visualTreeNodes) + { + return CreateVisualState(strategy, grouping, checkBoxes, false, visualTreeNodes); + } + + public static VisualState CreateVisualState(string strategy, string grouping, bool checkBoxes = false, bool showNamespace = false, params VisualTreeNode[] visualTreeNodes) { VisualState visualState; diff --git a/src/TestCentric/tests/VisualStateTests.cs b/src/TestCentric/tests/VisualStateTests.cs index 7effe2ee..b75f0733 100644 --- a/src/TestCentric/tests/VisualStateTests.cs +++ b/src/TestCentric/tests/VisualStateTests.cs @@ -139,6 +139,7 @@ public void CanSaveAndReloadVisualStateAfterTestRun() Assert.Multiple(() => { Assert.That(restoredState.ShowCheckBoxes, Is.EqualTo(visualState.ShowCheckBoxes)); + Assert.That(restoredState.ShowNamespace, Is.EqualTo(visualState.ShowNamespace)); // TODO: Categories not yet supported //Assert.AreEqual(ExpectedVisualState.SelectedCategories, restoredState.SelectedCategories); //Assert.AreEqual(ExpectedVisualState.ExcludeCategories, restoredState.ExcludeCategories); diff --git a/src/TestModel/model/Settings/TestTreeSettings.cs b/src/TestModel/model/Settings/TestTreeSettings.cs index ee2b5c2e..3b521e7c 100644 --- a/src/TestModel/model/Settings/TestTreeSettings.cs +++ b/src/TestModel/model/Settings/TestTreeSettings.cs @@ -50,6 +50,12 @@ public string DisplayFormat set { SaveSetting(nameof(DisplayFormat), value); } } + public bool ShowNamespace + { + get { return GetSetting(nameof(ShowNamespace), true); } + set { SaveSetting(nameof(ShowNamespace), value); } + } + public class FixtureListSettings : SettingsGroup { public FixtureListSettings(ISettings settings, string prefix) : base(settings, prefix + "FixtureList") { }