From 12c1d4b36d0306af1d435c568d9eba36f35aaa6a Mon Sep 17 00:00:00 2001 From: Kevin Pilch-Bisson Date: Sat, 15 Aug 2015 21:43:24 -0700 Subject: [PATCH] Add command line support for config files Fixes #8. --- .../ViewModel/AssemblyAndConfigFile.cs | 19 +++++++++ xunit.runner.wpf/ViewModel/MainViewModel.cs | 40 +++++++++++++++---- .../ViewModel/TestAssemblyViewModel.cs | 12 +++--- xunit.runner.wpf/xunit.runner.wpf.csproj | 1 + 4 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 xunit.runner.wpf/ViewModel/AssemblyAndConfigFile.cs diff --git a/xunit.runner.wpf/ViewModel/AssemblyAndConfigFile.cs b/xunit.runner.wpf/ViewModel/AssemblyAndConfigFile.cs new file mode 100644 index 0000000..e1dbfa6 --- /dev/null +++ b/xunit.runner.wpf/ViewModel/AssemblyAndConfigFile.cs @@ -0,0 +1,19 @@ +using System.IO; + +namespace xunit.runner.wpf.ViewModel +{ + public class AssemblyAndConfigFile + { + public string AssemblyFileName { get; } + public string ConfigFileName { get; } + + public AssemblyAndConfigFile(string assemblyFileName, string configFileName) + { + this.AssemblyFileName = Path.GetFullPath(assemblyFileName); + if (configFileName != null) + { + this.ConfigFileName = Path.GetFullPath(configFileName); + } + } + } +} \ No newline at end of file diff --git a/xunit.runner.wpf/ViewModel/MainViewModel.cs b/xunit.runner.wpf/ViewModel/MainViewModel.cs index b2f4f5a..33abd6b 100644 --- a/xunit.runner.wpf/ViewModel/MainViewModel.cs +++ b/xunit.runner.wpf/ViewModel/MainViewModel.cs @@ -13,6 +13,7 @@ using System.Collections.Specialized; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; +using System.IO; namespace xunit.runner.wpf.ViewModel { @@ -29,7 +30,7 @@ namespace xunit.runner.wpf.ViewModel { if (IsInDesignMode) { - this.Assemblies.Add(new TestAssemblyViewModel(@"C:\Code\TestAssembly.dll")); + this.Assemblies.Add(new TestAssemblyViewModel(new AssemblyAndConfigFile(@"C:\Code\TestAssembly.dll", null))); } CommandBindings = CreateCommandBindings(); @@ -190,10 +191,10 @@ namespace xunit.runner.wpf.ViewModel } var fileName = fileDialog.FileName; - await AddAssemblies(new[] { fileName }); + await AddAssemblies(new[] { new AssemblyAndConfigFile(fileName, configFileName: null) }); } - private async Task AddAssemblies(IEnumerable fileNames) + private async Task AddAssemblies(IEnumerable assemblies) { var loadingDialog = new LoadingDialog { Owner = MainWindow.Instance }; try @@ -201,13 +202,14 @@ namespace xunit.runner.wpf.ViewModel using (AssemblyHelper.SubscribeResolve()) { loadingDialog.Show(); - foreach (var fileName in fileNames) + foreach (var assembly in assemblies) { - loadingDialog.AssemblyFileName = fileName; + loadingDialog.AssemblyFileName = assembly.AssemblyFileName; using (var xunit = new XunitFrontController( useAppDomain: true, - assemblyFileName: fileName, + assemblyFileName: assembly.AssemblyFileName, + configFileName: assembly.ConfigFileName, diagnosticMessageSink: new DiagnosticMessageVisitor(), shadowCopy: false)) using (var testDiscoveryVisitor = new TestDiscoveryVisitor(xunit)) @@ -219,7 +221,7 @@ namespace xunit.runner.wpf.ViewModel }); allTestCases.AddRange(testDiscoveryVisitor.TestCases); - Assemblies.Add(new TestAssemblyViewModel(fileName)); + Assemblies.Add(new TestAssemblyViewModel(assembly)); } } } @@ -345,7 +347,7 @@ namespace xunit.runner.wpf.ViewModel try { IsBusy = true; - await AddAssemblies(Environment.GetCommandLineArgs().Skip(1)); + await AddAssemblies(ParseCommandLine(Environment.GetCommandLineArgs().Skip(1))); } finally { @@ -353,6 +355,28 @@ namespace xunit.runner.wpf.ViewModel } } + private IEnumerable ParseCommandLine(IEnumerable enumerable) + { + while (enumerable.Any()) + { + var assemblyFileName = enumerable.First(); + enumerable = enumerable.Skip(1); + + var configFileName = (string)null; + if (IsConfigFile(enumerable.FirstOrDefault())) + { + configFileName = enumerable.First(); + enumerable = enumerable.Skip(1); + } + + yield return new AssemblyAndConfigFile(assemblyFileName, configFileName); + } + } + + private bool IsConfigFile(string fileName) + => (fileName?.EndsWith(".config", StringComparison.OrdinalIgnoreCase) ?? false) || + (fileName?.EndsWith(".json", StringComparison.OrdinalIgnoreCase) ?? false); + private bool CanExecuteRun() => !IsBusy && TestCases.Any(); diff --git a/xunit.runner.wpf/ViewModel/TestAssemblyViewModel.cs b/xunit.runner.wpf/ViewModel/TestAssemblyViewModel.cs index 93defc7..073016d 100644 --- a/xunit.runner.wpf/ViewModel/TestAssemblyViewModel.cs +++ b/xunit.runner.wpf/ViewModel/TestAssemblyViewModel.cs @@ -10,13 +10,15 @@ namespace xunit.runner.wpf.ViewModel { public class TestAssemblyViewModel : ViewModelBase { - public TestAssemblyViewModel(string fileName) + private readonly AssemblyAndConfigFile assembly; + + public TestAssemblyViewModel(AssemblyAndConfigFile assembly) { - this.FileName = fileName; + this.assembly = assembly; } - public string FileName { get; } - - public string DisplayName => Path.GetFileNameWithoutExtension(FileName); + public string FileName => assembly.AssemblyFileName; + public string ConfigFileName => Path.GetFileNameWithoutExtension(assembly.ConfigFileName); + public string DisplayName => Path.GetFileNameWithoutExtension(assembly.AssemblyFileName); } } diff --git a/xunit.runner.wpf/xunit.runner.wpf.csproj b/xunit.runner.wpf/xunit.runner.wpf.csproj index c95283e..f514416 100644 --- a/xunit.runner.wpf/xunit.runner.wpf.csproj +++ b/xunit.runner.wpf/xunit.runner.wpf.csproj @@ -92,6 +92,7 @@ LoadingDialog.xaml +