diff --git a/xunit.runner.wpf/MainWindow.xaml b/xunit.runner.wpf/MainWindow.xaml
index 424bf6e..6a73b57 100644
--- a/xunit.runner.wpf/MainWindow.xaml
+++ b/xunit.runner.wpf/MainWindow.xaml
@@ -63,7 +63,7 @@
-
+
@@ -82,11 +82,12 @@
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -113,7 +135,7 @@
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
diff --git a/xunit.runner.wpf/ViewModel/MainViewModel.cs b/xunit.runner.wpf/ViewModel/MainViewModel.cs
index 4c35344..aa78a1d 100644
--- a/xunit.runner.wpf/ViewModel/MainViewModel.cs
+++ b/xunit.runner.wpf/ViewModel/MainViewModel.cs
@@ -28,6 +28,10 @@ namespace xunit.runner.wpf.ViewModel
private bool isBusy;
private SearchQuery searchQuery = new SearchQuery();
+ public ObservableCollection Assemblies { get; } = new ObservableCollection();
+ public FilteredCollectionView FilteredTestCases { get; }
+ public ObservableCollection Traits => this.traitCollectionView.Collection;
+
public MainViewModel()
{
if (IsInDesignMode)
@@ -39,10 +43,10 @@ namespace xunit.runner.wpf.ViewModel
this.testUtil = new xunit.runner.wpf.Impl.RemoteTestUtil(Dispatcher.CurrentDispatcher);
this.TestCasesCaption = "Test Cases (0)";
- TestCases = new FilteredCollectionView(
+ this.FilteredTestCases = new FilteredCollectionView(
allTestCases, TestCaseMatches, searchQuery, TestComparer.Instance);
- this.TestCases.CollectionChanged += TestCases_CollectionChanged;
+ this.FilteredTestCases.CollectionChanged += TestCases_CollectionChanged;
this.WindowLoadedCommand = new RelayCommand(OnExecuteWindowLoaded);
this.RunCommand = new RelayCommand(OnExecuteRun, CanExecuteRun);
this.CancelCommand = new RelayCommand(OnExecuteCancel, CanExecuteCancel);
@@ -101,8 +105,8 @@ namespace xunit.runner.wpf.ViewModel
private void TestCases_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
- TestCasesCaption = $"Test Cases ({TestCases.Count:#,0})";
- MaximumProgress = TestCases.Count;
+ TestCasesCaption = $"Test Cases ({FilteredTestCases.Count:#,0})";
+ MaximumProgress = FilteredTestCases.Count;
}
public ICommand ExitCommand { get; } = new RelayCommand(OnExecuteExit);
@@ -202,7 +206,7 @@ namespace xunit.runner.wpf.ViewModel
.ContinueWith(
x =>
{
- TestCases.FilterArgument = searchQuery;
+ FilteredTestCases.FilterArgument = searchQuery;
},
token,
TaskContinuationOptions.None,
@@ -220,10 +224,6 @@ namespace xunit.runner.wpf.ViewModel
};
}
- public ObservableCollection Assemblies { get; } = new ObservableCollection();
- public FilteredCollectionView TestCases { get; }
- public ObservableCollection Traits => this.traitCollectionView.Collection;
-
private async void OnExecuteOpen(object sender, ExecutedRoutedEventArgs e)
{
var fileDialog = new OpenFileDialog
@@ -249,16 +249,23 @@ namespace xunit.runner.wpf.ViewModel
}
var loadingDialog = new LoadingDialog { Owner = MainWindow.Instance };
+ var newAssemblyViewModels = new List();
+
try
{
- await ExecuteTestSessionOperation(() =>
+ await this.ExecuteTestSessionOperation(() =>
{
var taskList = new List();
foreach (var assembly in assemblies)
{
- var assemblyPath = assembly.AssemblyFileName;
- taskList.Add(this.testUtil.Discover(assemblyPath, OnTestDiscovered, cancellationTokenSource.Token));
- Assemblies.Add(new TestAssemblyViewModel(assembly));
+ taskList.Add(this.testUtil.Discover(assembly.AssemblyFileName, this.OnTestDiscovered, this.cancellationTokenSource.Token));
+
+ var assemblyViewModel = new TestAssemblyViewModel(assembly);
+
+ newAssemblyViewModels.Add(assemblyViewModel);
+ this.Assemblies.Add(assemblyViewModel);
+
+ assemblyViewModel.State = AssemblyState.Loading;
}
return taskList;
@@ -266,6 +273,11 @@ namespace xunit.runner.wpf.ViewModel
}
finally
{
+ foreach (var assemblyViewModel in newAssemblyViewModels)
+ {
+ assemblyViewModel.State = AssemblyState.Ready;
+ }
+
loadingDialog.Close();
}
}
@@ -278,9 +290,11 @@ namespace xunit.runner.wpf.ViewModel
await ExecuteTestSessionOperation(() =>
{
var taskList = new List();
- foreach (var assembly in assemblies)
+ foreach (var assemblyViewModel in assemblies)
{
- var assemblyPath = assembly.FileName;
+ assemblyViewModel.State = AssemblyState.Loading;
+
+ var assemblyPath = assemblyViewModel.FileName;
RemoveAssemblyTestCases(assemblyPath);
taskList.Add(this.testUtil.Discover(assemblyPath, OnTestDiscovered, cancellationTokenSource.Token));
@@ -293,6 +307,11 @@ namespace xunit.runner.wpf.ViewModel
}
finally
{
+ foreach (var assemblyViewModel in assemblies)
+ {
+ assemblyViewModel.State = AssemblyState.Ready;
+ }
+
loadingDialog.Close();
}
}
@@ -313,7 +332,7 @@ namespace xunit.runner.wpf.ViewModel
var i = 0;
while (i < this.allTestCases.Count)
{
- if (this.allTestCases[i].AssemblyFileName == assemblyPath)
+ if (string.Compare(this.allTestCases[i].AssemblyFileName, assemblyPath, StringComparison.OrdinalIgnoreCase) == 0)
{
this.allTestCases.RemoveAt(i);
}
@@ -383,7 +402,7 @@ namespace xunit.runner.wpf.ViewModel
(fileName?.EndsWith(".json", StringComparison.OrdinalIgnoreCase) ?? false);
private bool CanExecuteRun()
- => !IsBusy && TestCases.Any();
+ => !IsBusy && FilteredTestCases.Any();
private async void OnExecuteRun()
{
@@ -402,15 +421,15 @@ namespace xunit.runner.wpf.ViewModel
CurrentRunState = TestState.NotRun;
Output = string.Empty;
- foreach (var tc in TestCases)
+ foreach (var tc in FilteredTestCases)
{
tc.State = TestState.NotRun;
}
- var runAll = TestCases.Count == this.allTestCases.Count;
+ var runAll = FilteredTestCases.Count == this.allTestCases.Count;
var testSessionList = new List();
- foreach (var assemblyPath in TestCases.Select(x => x.AssemblyFileName).Distinct())
+ foreach (var assemblyPath in FilteredTestCases.Select(x => x.AssemblyFileName).Distinct())
{
Task task;
if (runAll)
@@ -419,7 +438,7 @@ namespace xunit.runner.wpf.ViewModel
}
else
{
- var testCaseDisplayNames = TestCases
+ var testCaseDisplayNames = FilteredTestCases
.Where(x => x.AssemblyFileName == assemblyPath)
.Select(x => x.DisplayName)
.ToImmutableArray();
@@ -468,7 +487,7 @@ namespace xunit.runner.wpf.ViewModel
private void OnTestFinished(TestResultData testResultData)
{
- var testCase = TestCases.Single(x => x.DisplayName == testResultData.TestCaseDisplayName);
+ var testCase = FilteredTestCases.Single(x => x.DisplayName == testResultData.TestCaseDisplayName);
testCase.State = testResultData.TestState;
TestsCompleted++;
diff --git a/xunit.runner.wpf/ViewModel/TestAssemblyViewModel.cs b/xunit.runner.wpf/ViewModel/TestAssemblyViewModel.cs
index deb8f96..74fe2e1 100644
--- a/xunit.runner.wpf/ViewModel/TestAssemblyViewModel.cs
+++ b/xunit.runner.wpf/ViewModel/TestAssemblyViewModel.cs
@@ -1,10 +1,5 @@
using GalaSoft.MvvmLight;
-using System;
-using System.Collections.Generic;
using System.IO;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
namespace xunit.runner.wpf.ViewModel
{
@@ -12,6 +7,7 @@ namespace xunit.runner.wpf.ViewModel
{
private readonly AssemblyAndConfigFile _assembly;
private bool _isSelected;
+ private AssemblyState _state;
public TestAssemblyViewModel(AssemblyAndConfigFile assembly)
{
@@ -27,5 +23,17 @@ namespace xunit.runner.wpf.ViewModel
get { return _isSelected; }
set { Set(ref _isSelected, value, nameof(IsSelected)); }
}
+
+ public AssemblyState State
+ {
+ get { return _state; }
+ set { Set(ref _state, value, nameof(State)); }
+ }
+ }
+
+ public enum AssemblyState
+ {
+ Ready,
+ Loading
}
}