Load assemblies from command line on startup

Also, display a dialog while loading

Fixes #10
This commit is contained in:
Kevin Pilch-Bisson
2015-08-15 20:27:04 -07:00
parent eeeb04c78e
commit 4e22e89d6e
6 changed files with 134 additions and 12 deletions
+46 -12
View File
@@ -22,6 +22,7 @@ namespace xunit.runner.wpf.ViewModel
private bool isBusy;
private bool isCancelRequested;
public MainViewModel()
{
if (IsInDesignMode)
@@ -36,6 +37,7 @@ namespace xunit.runner.wpf.ViewModel
allTestCases, TestCaseMatches, Tuple.Create(string.Empty, TestState.All), TestComparer.Instance);
this.TestCases.CollectionChanged += TestCases_CollectionChanged;
this.WindowLoadedCommand = new RelayCommand(OnExecuteWindowLoaded);
this.RunCommand = new RelayCommand(OnExecuteRun, CanExecuteRun);
this.CancelCommand = new RelayCommand(OnExecuteCancel, CanExecuteCancel);
}
@@ -50,6 +52,7 @@ namespace xunit.runner.wpf.ViewModel
}
public ICommand ExitCommand { get; } = new RelayCommand(OnExecuteExit);
public ICommand WindowLoadedCommand { get; }
public RelayCommand RunCommand { get; }
public RelayCommand CancelCommand { get; }
@@ -162,7 +165,7 @@ namespace xunit.runner.wpf.ViewModel
public ObservableCollection<TestAssemblyViewModel> Assemblies { get; } = new ObservableCollection<TestAssemblyViewModel>();
public FilteredCollectionView<TestCaseViewModel, Tuple<string, TestState>> TestCases { get; }
private void OnExecuteOpen(object sender, ExecutedRoutedEventArgs e)
private async void OnExecuteOpen(object sender, ExecutedRoutedEventArgs e)
{
var fileDialog = new OpenFileDialog
{
@@ -175,30 +178,48 @@ namespace xunit.runner.wpf.ViewModel
}
var fileName = fileDialog.FileName;
await AddAssemblies(new[] { fileName });
}
private async Task AddAssemblies(IEnumerable<string> fileNames)
{
var loadingDialog = new LoadingDialog { Owner = MainWindow.Instance };
try
{
using (AssemblyHelper.SubscribeResolve())
{
using (var xunit = new XunitFrontController(
useAppDomain: true,
assemblyFileName: fileName,
diagnosticMessageSink: new DiagnosticMessageVisitor(),
shadowCopy: false))
using (var testDiscoveryVisitor = new TestDiscoveryVisitor(xunit))
loadingDialog.Show();
foreach (var fileName in fileNames)
{
xunit.Find(includeSourceInformation: false, messageSink: testDiscoveryVisitor, discoveryOptions: TestFrameworkOptions.ForDiscovery());
testDiscoveryVisitor.Finished.WaitOne();
allTestCases.AddRange(testDiscoveryVisitor.TestCases);
loadingDialog.AssemblyFileName = fileName;
using (var xunit = new XunitFrontController(
useAppDomain: true,
assemblyFileName: fileName,
diagnosticMessageSink: new DiagnosticMessageVisitor(),
shadowCopy: false))
using (var testDiscoveryVisitor = new TestDiscoveryVisitor(xunit))
{
await Task.Run(() =>
{
xunit.Find(includeSourceInformation: false, messageSink: testDiscoveryVisitor, discoveryOptions: TestFrameworkOptions.ForDiscovery());
testDiscoveryVisitor.Finished.WaitOne();
});
allTestCases.AddRange(testDiscoveryVisitor.TestCases);
Assemblies.Add(new TestAssemblyViewModel(fileName));
}
}
}
Assemblies.Add(new TestAssemblyViewModel(fileName));
}
catch (Exception ex)
{
MessageBox.Show(Application.Current.MainWindow, ex.ToString());
}
finally
{
loadingDialog.Close();
}
}
private class DiagnosticMessageVisitor : TestMessageVisitor
@@ -307,6 +328,19 @@ namespace xunit.runner.wpf.ViewModel
Application.Current.Shutdown();
}
private async void OnExecuteWindowLoaded()
{
try
{
IsBusy = true;
await AddAssemblies(Environment.GetCommandLineArgs().Skip(1));
}
finally
{
IsBusy = false;
}
}
private bool CanExecuteRun()
=> !IsBusy && TestCases.Any();