From 4bc641e57510726d47514575d67394221e5b4e06 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Sun, 6 Dec 2015 09:54:11 -0800 Subject: [PATCH] Invert test case filter buttons and mark skipped tests during discovery The filter buttons are now unchecked by default, which has the meaning of no filter applied. Clicking the filter buttons the applies that filter. In addition, we now mark skipped tests when they are discovered. --- xunit.runner.data/TestCaseData.cs | 8 +++-- xunit.runner.worker/DiscoverUtil.cs | 1 + xunit.runner.wpf/MainWindow.xaml | 16 +++++---- xunit.runner.wpf/ViewModel/MainViewModel.cs | 34 ++++++++++++------- xunit.runner.wpf/ViewModel/SearchQuery.cs | 6 ++-- .../ViewModel/TestCaseViewModel.cs | 25 +++++++++----- 6 files changed, 57 insertions(+), 33 deletions(-) diff --git a/xunit.runner.data/TestCaseData.cs b/xunit.runner.data/TestCaseData.cs index 5efad84..058ec0b 100644 --- a/xunit.runner.data/TestCaseData.cs +++ b/xunit.runner.data/TestCaseData.cs @@ -6,12 +6,14 @@ namespace Xunit.Runner.Data public sealed class TestCaseData { public string DisplayName { get; set; } + public string SkipReason { get; set; } public string AssemblyPath { get; set; } public Dictionary> TraitMap { get; set; } - public TestCaseData(string displayName, string assemblyPath, Dictionary> traitMap) + public TestCaseData(string displayName, string skipReason, string assemblyPath, Dictionary> traitMap) { DisplayName = displayName; + SkipReason = skipReason; AssemblyPath = assemblyPath; TraitMap = traitMap; } @@ -19,6 +21,7 @@ namespace Xunit.Runner.Data public static TestCaseData ReadFrom(BinaryReader reader) { var displayName = reader.ReadString(); + var skipReason = reader.ReadString(); var assemblyPath = reader.ReadString(); var count = reader.ReadInt32(); var traitMap = new Dictionary>(count); @@ -37,12 +40,13 @@ namespace Xunit.Runner.Data traitMap.Add(key, values); } - return new TestCaseData(displayName, assemblyPath, traitMap); + return new TestCaseData(displayName, skipReason, assemblyPath, traitMap); } public void WriteTo(BinaryWriter writer) { writer.Write(DisplayName); + writer.Write(SkipReason ?? string.Empty); writer.Write(AssemblyPath); writer.Write(TraitMap.Count); diff --git a/xunit.runner.worker/DiscoverUtil.cs b/xunit.runner.worker/DiscoverUtil.cs index 6b90270..cda4357 100644 --- a/xunit.runner.worker/DiscoverUtil.cs +++ b/xunit.runner.worker/DiscoverUtil.cs @@ -23,6 +23,7 @@ namespace Xunit.Runner.Worker var testCase = testCaseDiscovered.TestCase; var testCaseData = new TestCaseData( testCase.DisplayName, + testCase.SkipReason, testCaseDiscovered.TestAssembly.Assembly.AssemblyPath, testCase.Traits); diff --git a/xunit.runner.wpf/MainWindow.xaml b/xunit.runner.wpf/MainWindow.xaml index c2461af..36f88a5 100644 --- a/xunit.runner.wpf/MainWindow.xaml +++ b/xunit.runner.wpf/MainWindow.xaml @@ -215,11 +215,12 @@ - + Grid.Column="0" + Command="{Binding TestFilterChanged}"> - + Grid.Column="1" + Command="{Binding TestFilterChanged}"> - + Grid.Column="2" + Command="{Binding TestFilterChanged}"> + diff --git a/xunit.runner.wpf/ViewModel/MainViewModel.cs b/xunit.runner.wpf/ViewModel/MainViewModel.cs index dcb29ed..f2b5f73 100644 --- a/xunit.runner.wpf/ViewModel/MainViewModel.cs +++ b/xunit.runner.wpf/ViewModel/MainViewModel.cs @@ -84,19 +84,21 @@ namespace Xunit.Runner.Wpf.ViewModel } } + var noFilter = !(searchQuery.FilterFailedTests | searchQuery.FilterPassedTests | searchQuery.FilterSkippedTests); + switch (testCase.State) { case TestState.Passed: - return searchQuery.IncludePassedTests; + return noFilter || searchQuery.FilterPassedTests; case TestState.Skipped: - return searchQuery.IncludeSkippedTests; + return noFilter || searchQuery.FilterSkippedTests; case TestState.Failed: - return searchQuery.IncludeFailedTests; + return noFilter || searchQuery.FilterFailedTests; case TestState.NotRun: - return true; + return noFilter; default: Debug.Assert(false, "What state is this test case in?"); @@ -527,9 +529,15 @@ namespace Xunit.Runner.Wpf.ViewModel var testCaseViewModel = new TestCaseViewModel( testCase.DisplayName, + testCase.SkipReason, testCase.AssemblyPath, traitWorkerList); + if (testCaseViewModel.State == TestState.Skipped) + { + TestsSkipped++; + } + this.allTestCases.Add(testCaseViewModel); } } @@ -623,36 +631,36 @@ namespace Xunit.Runner.Wpf.ViewModel RemoveAssemblies(Assemblies.ToArray()); } - public bool IncludePassedTests + public bool FilterPassedTests { - get { return searchQuery.IncludePassedTests; } + get { return searchQuery.FilterPassedTests; } set { - if (Set(ref searchQuery.IncludePassedTests, value)) + if (Set(ref searchQuery.FilterPassedTests, value)) { FilterAfterDelay(); } } } - public bool IncludeFailedTests + public bool FilterFailedTests { - get { return searchQuery.IncludeFailedTests; } + get { return searchQuery.FilterFailedTests; } set { - if (Set(ref searchQuery.IncludeFailedTests, value)) + if (Set(ref searchQuery.FilterFailedTests, value)) { FilterAfterDelay(); } } } - public bool IncludeSkippedTests + public bool FilterSkippedTests { - get { return searchQuery.IncludeSkippedTests; } + get { return searchQuery.FilterSkippedTests; } set { - if (Set(ref searchQuery.IncludeSkippedTests, value)) + if (Set(ref searchQuery.FilterSkippedTests, value)) { FilterAfterDelay(); } diff --git a/xunit.runner.wpf/ViewModel/SearchQuery.cs b/xunit.runner.wpf/ViewModel/SearchQuery.cs index 65ea5b2..2105fce 100644 --- a/xunit.runner.wpf/ViewModel/SearchQuery.cs +++ b/xunit.runner.wpf/ViewModel/SearchQuery.cs @@ -4,9 +4,9 @@ namespace Xunit.Runner.Wpf.ViewModel { public class SearchQuery { - public bool IncludeFailedTests = true; - public bool IncludePassedTests = true; - public bool IncludeSkippedTests = true; + public bool FilterFailedTests = false; + public bool FilterPassedTests = false; + public bool FilterSkippedTests = false; public string SearchString = string.Empty; public ISet TraitSet = new HashSet(TraitViewModel.EqualityComparer); } diff --git a/xunit.runner.wpf/ViewModel/TestCaseViewModel.cs b/xunit.runner.wpf/ViewModel/TestCaseViewModel.cs index 14cfb76..67a07a0 100644 --- a/xunit.runner.wpf/ViewModel/TestCaseViewModel.cs +++ b/xunit.runner.wpf/ViewModel/TestCaseViewModel.cs @@ -9,14 +9,12 @@ namespace Xunit.Runner.Wpf.ViewModel { private TestState _state = TestState.NotRun; - public TestCaseViewModel(string displayName, string assemblyFileName, IEnumerable traits) - { - this.DisplayName = displayName; - this.AssemblyFileName = assemblyFileName; - this.Traits = traits.ToImmutableArray(); - } - public string DisplayName { get; } + public string SkipReason { get; } + public string AssemblyFileName { get; } + public ImmutableArray Traits { get; } + + public bool HasSkipReason => !string.IsNullOrEmpty(this.SkipReason); public TestState State { @@ -24,8 +22,17 @@ namespace Xunit.Runner.Wpf.ViewModel set { Set(ref _state, value); } } - public string AssemblyFileName { get; } + public TestCaseViewModel(string displayName, string skipReason, string assemblyFileName, IEnumerable traits) + { + this.DisplayName = displayName; + this.SkipReason = skipReason; + this.AssemblyFileName = assemblyFileName; + this.Traits = traits.ToImmutableArray(); - public ImmutableArray Traits { get; } + if (!string.IsNullOrEmpty(skipReason)) + { + _state = TestState.Skipped; + } + } } }