diff --git a/src/NUnitEngine/nunit.engine/Runners/AbstractTestRunner.cs b/src/NUnitEngine/nunit.engine/Runners/AbstractTestRunner.cs
index 686b2bcee..e6fc72b33 100644
--- a/src/NUnitEngine/nunit.engine/Runners/AbstractTestRunner.cs
+++ b/src/NUnitEngine/nunit.engine/Runners/AbstractTestRunner.cs
@@ -23,7 +23,6 @@
using System;
using System.ComponentModel;
-using System.IO;
using NUnit.Engine.Services;
namespace NUnit.Engine.Runners
@@ -59,29 +58,7 @@ public AbstractTestRunner(IServiceLocator services, TestPackage package)
///
/// The TestPackage for which this is the runner
///
- protected TestPackage TestPackage
- {
- get
- {
- return _testPackage;
- }
-
- set
- {
- _testPackage = value;
-
- if (IsProjectPackage(_testPackage) && _testPackage.SubPackages.Count == 0)
- {
- // Some files in the top level package may be projects.
- // Expand them so that they contain subprojects for
- // each contained assembly.
- if (File.Exists(TestPackage.FullName) && ProjectService.CanLoadFrom(TestPackage.FullName))
- {
- ProjectService.ExpandProjectPackage(_testPackage);
- }
- }
- }
- }
+ protected TestPackage TestPackage { get; set; }
///
/// The result of the last call to LoadPackage
@@ -237,7 +214,7 @@ public AsyncTestEngineResult RunAsync(ITestEventListener listener, TestFilter fi
{
return RunTestsAsync(listener, filter);
}
-
+
#endregion
#region IDisposable Members
@@ -250,8 +227,6 @@ public void Dispose()
protected bool _disposed = false;
- private TestPackage _testPackage;
-
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
@@ -264,17 +239,5 @@ protected virtual void Dispose(bool disposing)
}
#endregion
-
- #region Helper Methods
-
- protected bool IsProjectPackage(TestPackage package)
- {
- return package != null
- && ProjectService != null
- && !string.IsNullOrEmpty(package.FullName)
- && ProjectService.CanLoadFrom(package.FullName);
- }
-
- #endregion
}
}
diff --git a/src/NUnitEngine/nunit.engine/Runners/AggregatingTestRunner.cs b/src/NUnitEngine/nunit.engine/Runners/AggregatingTestRunner.cs
index 920719754..2431804c6 100644
--- a/src/NUnitEngine/nunit.engine/Runners/AggregatingTestRunner.cs
+++ b/src/NUnitEngine/nunit.engine/Runners/AggregatingTestRunner.cs
@@ -66,11 +66,7 @@ public override TestEngineResult Explore(TestFilter filter)
foreach (ITestEngineRunner runner in _runners)
results.Add(runner.Explore(filter));
- TestEngineResult result = ResultHelper.Merge(results);
-
- return IsProjectPackage(TestPackage)
- ? result.MakePackageResult(TestPackage.Name, TestPackage.FullName)
- : result;
+ return ResultHelper.Merge(results);
}
///
@@ -159,11 +155,7 @@ protected override TestEngineResult RunTests(ITestEventListener listener, TestFi
if (disposeRunners) _runners.Clear();
- TestEngineResult result = ResultHelper.Merge(results);
-
- return IsProjectPackage(TestPackage)
- ? result.MakePackageResult(TestPackage.Name, TestPackage.FullName)
- : result;
+ return ResultHelper.Merge(results);
}
///
diff --git a/src/NUnitEngine/nunit.engine/Runners/DirectTestRunner.cs b/src/NUnitEngine/nunit.engine/Runners/DirectTestRunner.cs
index 914c3d0a6..c3e1a4f29 100644
--- a/src/NUnitEngine/nunit.engine/Runners/DirectTestRunner.cs
+++ b/src/NUnitEngine/nunit.engine/Runners/DirectTestRunner.cs
@@ -73,9 +73,6 @@ public override TestEngineResult Explore(TestFilter filter)
foreach (IFrameworkDriver driver in _drivers)
result.Add(driver.Explore(filter.Text));
- if (IsProjectPackage(TestPackage))
- result = result.MakePackageResult(TestPackage.Name, TestPackage.FullName);
-
return result;
}
@@ -115,9 +112,6 @@ protected override TestEngineResult LoadPackage()
_drivers.Add(driver);
}
- if (IsProjectPackage(TestPackage))
- result = result.MakePackageResult(TestPackage.Name, TestPackage.FullName);
-
return result;
}
@@ -159,9 +153,6 @@ protected override TestEngineResult RunTests(ITestEventListener listener, TestFi
result.Add(driver.Run(listener, filter.Text));
}
- if (IsProjectPackage(TestPackage))
- result = result.MakePackageResult(TestPackage.Name, TestPackage.FullName);
-
if (_assemblyResolver != null)
{
var packages = TestPackage.SubPackages;
diff --git a/src/NUnitEngine/nunit.engine/Runners/MasterTestRunner.cs b/src/NUnitEngine/nunit.engine/Runners/MasterTestRunner.cs
index 63d0d5076..407340e0a 100644
--- a/src/NUnitEngine/nunit.engine/Runners/MasterTestRunner.cs
+++ b/src/NUnitEngine/nunit.engine/Runners/MasterTestRunner.cs
@@ -22,7 +22,6 @@
// ***********************************************************************
using System;
-using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
@@ -36,25 +35,25 @@ namespace NUnit.Engine.Runners
public class MasterTestRunner : ITestRunner
{
private const string TEST_RUN_ELEMENT = "test-run";
-
- private ITestEngineRunner _engineRunner;
-
- private IServiceLocator _services;
- private IRuntimeFrameworkService _runtimeService;
- private ExtensionService _extensionService;
- private IProjectService _projectService;
- private ITestRunnerFactory _testRunnerFactory;
+ private readonly ITestEngineRunner _engineRunner;
+ private readonly IServiceLocator _services;
+ private readonly IRuntimeFrameworkService _runtimeService;
+ private readonly ExtensionService _extensionService;
+ private readonly IProjectService _projectService;
+ private bool _disposed;
public MasterTestRunner(IServiceLocator services, TestPackage package)
{
+ if (services == null) throw new ArgumentNullException("services");
+ if (package == null) throw new ArgumentNullException("package");
+
_services = services;
TestPackage = package;
- _testRunnerFactory = _services.GetService();
_projectService = _services.GetService();
_runtimeService = _services.GetService();
_extensionService = _services.GetService();
- _engineRunner = _testRunnerFactory.MakeTestRunner(package);
+ _engineRunner = _services.GetService().MakeTestRunner(package);
}
#region Properties
@@ -139,7 +138,8 @@ public int CountTestCases(TestFilter filter)
/// An XmlNode giving the result of the test execution
public XmlNode Run(ITestEventListener listener, TestFilter filter)
{
- return RunTests(listener, filter).Xml;
+ LoadPackage();
+ return PrepareResult(RunTests(listener, filter)).Xml;
}
///
@@ -151,6 +151,7 @@ public XmlNode Run(ITestEventListener listener, TestFilter filter)
///
public ITestRun RunAsync(ITestEventListener listener, TestFilter filter)
{
+ LoadPackage();
return _engineRunner.RunAsync(listener, filter);
}
@@ -171,7 +172,8 @@ public void StopRun(bool force)
/// An XmlNode representing the tests found.
public XmlNode Explore(TestFilter filter)
{
- return _engineRunner.Explore(filter)
+ LoadPackage();
+ return PrepareResult(_engineRunner.Explore(filter))
.Aggregate(TEST_RUN_ELEMENT, TestPackage.Name, TestPackage.FullName).Xml;
}
@@ -185,8 +187,6 @@ public void Dispose()
GC.SuppressFinalize(this);
}
- private bool _disposed = false;
-
///
/// Dispose of this object.
///
@@ -215,6 +215,11 @@ private void LoadPackage()
// in case the client runner missed them.
ValidatePackageSettings();
+ // Some files in the top level package may be projects.
+ // Expand them so that they contain subprojects for
+ // each contained assembly.
+ EnsurePackagesAreExpanded(TestPackage);
+
// Use SelectRuntimeFramework for its side effects.
// Info will be left behind in the package about
// each contained assembly, which will subsequently
@@ -231,6 +236,54 @@ private void LoadPackage()
LoadResult = _engineRunner.Load().Aggregate(TEST_RUN_ELEMENT, TestPackage.Name, TestPackage.FullName);
}
+ private TestEngineResult PrepareResult(TestEngineResult result)
+ {
+ if (result == null) throw new ArgumentNullException("result");
+
+ if (!IsProjectPackage(TestPackage))
+ {
+ return result;
+ }
+
+ return result.MakePackageResult(TestPackage.Name, TestPackage.FullName);
+ }
+
+ private void EnsurePackagesAreExpanded(TestPackage package)
+ {
+ if (package == null) throw new ArgumentNullException("package");
+
+ foreach (var subPackage in package.SubPackages)
+ {
+ EnsurePackagesAreExpanded(subPackage);
+ }
+
+ if (package.SubPackages.Count == 0 && IsProjectPackage(package))
+ {
+ ExpandProjects(package);
+ }
+ }
+
+ private bool IsProjectPackage(TestPackage package)
+ {
+ if (package == null) throw new ArgumentNullException("package");
+
+ return
+ _projectService != null
+ && !string.IsNullOrEmpty(package.FullName)
+ && _projectService.CanLoadFrom(package.FullName);
+ }
+
+ private void ExpandProjects(TestPackage package)
+ {
+ if (package == null) throw new ArgumentNullException("package");
+
+ string packageName = package.FullName;
+ if (File.Exists(packageName) && _projectService.CanLoadFrom(packageName))
+ {
+ _projectService.ExpandProjectPackage(package);
+ }
+ }
+
// Any Errors thrown from this method indicate that the client
// runner is putting invalid values into the package.
private void ValidatePackageSettings()
@@ -327,6 +380,11 @@ private static void InsertCommandLineElement(XmlNode resultNode)
{
var doc = resultNode.OwnerDocument;
+ if (doc == null)
+ {
+ return;
+ }
+
XmlNode cmd = doc.CreateElement("command-line");
resultNode.InsertAfter(cmd, null);
@@ -340,12 +398,19 @@ private static void InsertFilterElement(XmlNode resultNode, TestFilter filter)
var tempNode = XmlHelper.CreateXmlNode(filter.Text);
// Don't include it if it's an empty filter
- if (tempNode.ChildNodes.Count > 0)
+ if (tempNode.ChildNodes.Count <= 0)
{
- var doc = resultNode.OwnerDocument;
- var filterElement = doc.ImportNode(tempNode, true);
- resultNode.InsertAfter(filterElement, null);
+ return;
}
+
+ var doc = resultNode.OwnerDocument;
+ if (doc == null)
+ {
+ return;
+ }
+
+ var filterElement = doc.ImportNode(tempNode, true);
+ resultNode.InsertAfter(filterElement, null);
}
#endregion
diff --git a/src/NUnitEngine/nunit.engine/Services/DriverService.cs b/src/NUnitEngine/nunit.engine/Services/DriverService.cs
index 8fbb24642..cc75ce2d2 100644
--- a/src/NUnitEngine/nunit.engine/Services/DriverService.cs
+++ b/src/NUnitEngine/nunit.engine/Services/DriverService.cs
@@ -38,7 +38,7 @@ namespace NUnit.Engine.Services
///
public class DriverService : Service, IDriverService
{
- IList _factories = new List();
+ readonly IList _factories = new List();
#region IDriverService Members