From 7ef7135bdd374aa547f2623ab56cfb3baa2a0ff2 Mon Sep 17 00:00:00 2001 From: rowo360 <59574371+rowo360@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:08:51 +0200 Subject: [PATCH] Disable toolbar item 'Run selected tests' if no tests are selected --- .../Presenters/TestCentricPresenter.cs | 8 ++-- .../tests/Presenters/Main/CommandTests.cs | 46 ++++++++++++++++--- .../Presenters/Main/WhenTestRunCompletes.cs | 1 + .../Presenters/Main/WhenTestsAreLoaded.cs | 1 + .../Presenters/Main/WhenTestsAreReloaded.cs | 1 + src/TestModel/model/ITestEvents.cs | 2 + src/TestModel/model/TestEventArgs.cs | 10 ++++ src/TestModel/model/TestEventDispatcher.cs | 6 +++ src/TestModel/model/TestModel.cs | 7 ++- 9 files changed, 71 insertions(+), 11 deletions(-) diff --git a/src/TestCentric/testcentric.gui/Presenters/TestCentricPresenter.cs b/src/TestCentric/testcentric.gui/Presenters/TestCentricPresenter.cs index 45989bf5..36a13bad 100644 --- a/src/TestCentric/testcentric.gui/Presenters/TestCentricPresenter.cs +++ b/src/TestCentric/testcentric.gui/Presenters/TestCentricPresenter.cs @@ -231,6 +231,8 @@ void OnRunFinished(ResultNode result) } }; + _model.Events.SelectedTestsChanged += (e) => UpdateViewCommands(); + _settings.Changed += (s, e) => { switch (e.SettingName) @@ -754,10 +756,11 @@ private void UpdateViewCommands(bool testLoading = false) bool hasFailures = _model.HasResults && _model.ResultSummary.FailedCount > 0; _view.RunAllButton.Enabled = - _view.RunSelectedButton.Enabled = _view.DisplayFormatButton.Enabled = _view.RunParametersButton.Enabled = testLoaded && !testRunning; + _view.RunSelectedButton.Enabled = testLoaded && !testRunning && _model.SelectedTests != null && _model.SelectedTests.Any(); + _view.RerunButton.Enabled = testLoaded && !testRunning && hasResults; _view.RunFailedButton.Enabled = testLoaded && !testRunning && hasFailures; @@ -954,8 +957,7 @@ private void RunAllTests() private void RunSelectedTests() { var testSelection = _model.SelectedTests; - if (testSelection != null) - _model.RunTests(testSelection); + _model.RunTests(testSelection); } private void RunFailedTests() diff --git a/src/TestCentric/tests/Presenters/Main/CommandTests.cs b/src/TestCentric/tests/Presenters/Main/CommandTests.cs index cc9272cb..95f78b6a 100644 --- a/src/TestCentric/tests/Presenters/Main/CommandTests.cs +++ b/src/TestCentric/tests/Presenters/Main/CommandTests.cs @@ -256,13 +256,6 @@ public void RunButton_RunsSelectedTests() _model.Received().RunTests(testSelection); } - [Test] - public void RunButton_NoTestSelected_DidnotRunTests() - { - _view.RunSelectedButton.Execute += Raise.Event(); - _model.DidNotReceiveWithAnyArgs().RunTests(Arg.Any()); - } - [Test] public void RerunButton_RerunsTests() { @@ -317,5 +310,44 @@ public void ForceStopButton_ForcesTestsToStop() _view.ForceStopButton.Execute += Raise.Event(); _model.Received().StopTestRun(true); } + + [Test] + public void RunSelectedTestCommand_NoTestsSelected_IsDisabled() + { + // Arrange + _model.HasTests.Returns(true); + _model.SelectedTests = null; + + // Act + Assert + Assert.That(_view.RunSelectedButton.Enabled, Is.False); + } + + [Test] + public void SelectedTestsChanged_NoTestSelected_CommandIsDisabled() + { + // Arrange + _model.HasTests.Returns(true); + _model.SelectedTests.Returns(new TestSelection()); + + // Act + _model.Events.SelectedTestsChanged += Raise.Event(new TestSelectionEventArgs(null)); + + // Assert + Assert.That(_view.RunSelectedButton.Enabled, Is.False); + } + + [Test] + public void SelectedTestsChanged_TestSelected_CommandIsEnabled() + { + // Arrange + _model.HasTests.Returns(true); + _model.SelectedTests.Returns(new TestSelection(new[] { new TestNode("") })); + + // Act + _model.Events.SelectedTestsChanged += Raise.Event(new TestSelectionEventArgs(null)); + + // Assert + Assert.That(_view.RunSelectedButton.Enabled, Is.True); + } } } diff --git a/src/TestCentric/tests/Presenters/Main/WhenTestRunCompletes.cs b/src/TestCentric/tests/Presenters/Main/WhenTestRunCompletes.cs index 3b62f1f5..ba8fbbb3 100644 --- a/src/TestCentric/tests/Presenters/Main/WhenTestRunCompletes.cs +++ b/src/TestCentric/tests/Presenters/Main/WhenTestRunCompletes.cs @@ -21,6 +21,7 @@ public void SimulateTestRunFinish() _model.HasResults.Returns(true); _model.ResultSummary.Returns(new ResultSummary() { FailureCount = 1 }); _model.IsTestRunning.Returns(false); + _model.SelectedTests.Returns(new TestSelection(new[] { new TestNode("") })); var resultNode = new ResultNode(""); FireRunFinishedEvent(resultNode); diff --git a/src/TestCentric/tests/Presenters/Main/WhenTestsAreLoaded.cs b/src/TestCentric/tests/Presenters/Main/WhenTestsAreLoaded.cs index 3705909b..f9ff1ce9 100644 --- a/src/TestCentric/tests/Presenters/Main/WhenTestsAreLoaded.cs +++ b/src/TestCentric/tests/Presenters/Main/WhenTestsAreLoaded.cs @@ -22,6 +22,7 @@ public void SimulateTestLoad() TestNode testNode = new TestNode(""); _model.LoadedTests.Returns(testNode); + _model.SelectedTests.Returns(new TestSelection(new[] { testNode })); var project = new TestCentricProject(_model, "dummy.dll"); _model.TestCentricProject.Returns(project); diff --git a/src/TestCentric/tests/Presenters/Main/WhenTestsAreReloaded.cs b/src/TestCentric/tests/Presenters/Main/WhenTestsAreReloaded.cs index 06939bc1..d23f0bd9 100644 --- a/src/TestCentric/tests/Presenters/Main/WhenTestsAreReloaded.cs +++ b/src/TestCentric/tests/Presenters/Main/WhenTestsAreReloaded.cs @@ -22,6 +22,7 @@ public void SimulateTestReload() TestNode testNode = new TestNode(""); _model.LoadedTests.Returns(testNode); + _model.SelectedTests.Returns(new TestSelection(new[] { testNode })); FireTestReloadedEvent(testNode); } diff --git a/src/TestModel/model/ITestEvents.cs b/src/TestModel/model/ITestEvents.cs index bd0ec17b..07cdc5c7 100644 --- a/src/TestModel/model/ITestEvents.cs +++ b/src/TestModel/model/ITestEvents.cs @@ -13,6 +13,7 @@ namespace TestCentric.Gui.Model public delegate void TestNodeEventHandler(TestNodeEventArgs args); public delegate void TestResultEventHandler(TestResultEventArgs args); public delegate void TestItemEventHandler(TestItemEventArgs args); + public delegate void TestSelectionEventHandler(TestSelectionEventArgs args); public delegate void TestOutputEventHandler(TestOutputEventArgs args); public delegate void UnhandledExceptionEventHandler(UnhandledExceptionEventArgs args); public delegate void TestFilesLoadingEventHandler(TestFilesLoadingEventArgs args); @@ -57,6 +58,7 @@ public interface ITestEvents // Event used to broadcast a change in the selected // item, so that all presenters may be notified. event TestItemEventHandler SelectedItemChanged; + event TestSelectionEventHandler SelectedTestsChanged; event TestEventHandler CategorySelectionChanged; } diff --git a/src/TestModel/model/TestEventArgs.cs b/src/TestModel/model/TestEventArgs.cs index 317c648a..61972f62 100644 --- a/src/TestModel/model/TestEventArgs.cs +++ b/src/TestModel/model/TestEventArgs.cs @@ -61,6 +61,16 @@ public TestItemEventArgs(ITestItem testItem) public ITestItem TestItem { get; private set; } } + public class TestSelectionEventArgs : TestEventArgs + { + public TestSelectionEventArgs(TestSelection testSelection) + { + TestSelection = testSelection; + } + + public TestSelection TestSelection { get; private set; } + } + public class TestOutputEventArgs : TestEventArgs { public TestOutputEventArgs(string testName, string stream, string text) diff --git a/src/TestModel/model/TestEventDispatcher.cs b/src/TestModel/model/TestEventDispatcher.cs index 6614e5d9..a61a1860 100644 --- a/src/TestModel/model/TestEventDispatcher.cs +++ b/src/TestModel/model/TestEventDispatcher.cs @@ -114,6 +114,11 @@ public void FireActiveItemChanged(ITestItem testItem) SelectedItemChanged?.Invoke(new TestItemEventArgs(testItem)); } + public void FireSelectedTestsChanged(TestSelection testSelection) + { + SelectedTestsChanged?.Invoke(new TestSelectionEventArgs(testSelection)); + } + public void FireCategorySelectionChanged() { CategorySelectionChanged?.Invoke(new TestEventArgs()); @@ -156,6 +161,7 @@ public void FireCategorySelectionChanged() // Test Selection Event public event TestItemEventHandler SelectedItemChanged; + public event TestSelectionEventHandler SelectedTestsChanged; public event TestEventHandler CategorySelectionChanged; diff --git a/src/TestModel/model/TestModel.cs b/src/TestModel/model/TestModel.cs index ce197fad..6cf0d057 100644 --- a/src/TestModel/model/TestModel.cs +++ b/src/TestModel/model/TestModel.cs @@ -194,7 +194,12 @@ public ITestItem ActiveTestItem /// /// Gets or sets the list of selected tests. /// - public TestSelection SelectedTests { get; set; } + public TestSelection SelectedTests + { + get { return _selectedTests; } + set { _selectedTests = value; _events?.FireSelectedTestsChanged(_selectedTests); } + } + private TestSelection _selectedTests; public List SelectedCategories { get; private set; }