// **************************************************************** // Copyright 2007, Charlie Poole // This is free software licensed under the NUnit license. You may // obtain a copy of the license at http://nunit.org/?p=license&r=2.4 // **************************************************************** namespace NUnit.Util { using System; using System.Collections; using System.IO; using NUnit.Core; /// /// ProxyTestRunner is the abstract base for all client-side /// TestRunner implementations that delegate to a remote /// TestRunner. All calls are simply passed on to the /// TestRunner that is provided to the constructor. /// /// This class is similar to DelegatingTestRunner in the /// NUnit core, but is separate because of how it is used. /// /// Although the class is abstract, it has no abstract /// methods specified because each implementation will /// need to override different methods. All methods are /// specified using interface syntax and the derived class /// must explicitly implement TestRunner in order to /// redefine the selected methods. /// public abstract class ProxyTestRunner : TestRunner { #region Instance Variables /// /// Our runner ID /// protected int runnerID; /// /// The downstream TestRunner /// private TestRunner testRunner; /// /// The event listener for the currently running test /// protected EventListener listener; #endregion #region Construction public ProxyTestRunner(TestRunner testRunner) { this.testRunner = testRunner; this.runnerID = testRunner.ID; } /// /// Protected constructor for runners that create their own /// specialized downstream runner. /// protected ProxyTestRunner( int runnerID ) { this.runnerID = runnerID; } #endregion #region Properties public virtual int ID { get { return runnerID; } } public virtual bool Running { get { return testRunner != null && testRunner.Running; } } public virtual IList AssemblyInfo { get { return testRunner == null ? null : testRunner.AssemblyInfo; } } public virtual ITest Test { get { return testRunner == null ? null : testRunner.Test; } } public virtual TestResult TestResult { get { return testRunner == null ? null : testRunner.TestResult; } } /// /// Protected property copies any settings to the downstream test runner /// when it is set. Derived runners overriding this should call the base /// or copy the settings themselves. /// protected virtual TestRunner TestRunner { get { return testRunner; } set { testRunner = value; } } #endregion #region Load and Unload Methods public virtual bool Load( TestPackage package ) { return this.testRunner.Load( package ); } public virtual void Unload() { if ( this.testRunner != null ) this.testRunner.Unload(); } #endregion #region CountTestCases public virtual int CountTestCases( ITestFilter filter ) { return this.testRunner.CountTestCases( filter ); } #endregion #region Methods for Running Tests public virtual TestResult Run(EventListener listener) { // Save active listener for derived classes this.listener = listener; return this.testRunner.Run(listener); } public virtual TestResult Run(EventListener listener, ITestFilter filter) { // Save active listener for derived classes this.listener = listener; return this.testRunner.Run(listener, filter); } public virtual void BeginRun( EventListener listener ) { // Save active listener for derived classes this.listener = listener; this.testRunner.BeginRun( listener ); } public virtual void BeginRun( EventListener listener, ITestFilter filter ) { // Save active listener for derived classes this.listener = listener; this.testRunner.BeginRun( listener, filter ); } public virtual TestResult EndRun() { return this.testRunner.EndRun(); } public virtual void CancelRun() { this.testRunner.CancelRun(); } public virtual void Wait() { this.testRunner.Wait(); } #endregion #region InitializeLifetimeService Override // public override object InitializeLifetimeService() // { // return null; // } #endregion } }