1 // ****************************************************************
2 // This is free software licensed under the NUnit license. You
3 // may obtain a copy of the license as well as information regarding
4 // copyright ownership at http://nunit.org/?p=license&r=2.4.
5 // ****************************************************************
6 namespace NUnit.Core
7 {
8 	using System;
9 	using System.Collections;
10 	using System.IO;
11 
12 	/// <summary>
13 	/// DelegatingTestRUnner is the abstract base for core TestRunner
14 	/// implementations that operate by controlling a downstream
15 	/// TestRunner. All calls are simply passed on to the
16 	/// TestRunner that is provided to the constructor.
17 	///
18 	/// Although the class is abstract, it has no abstract
19 	/// methods specified because each implementation will
20 	/// need to override different methods. All methods are
21 	/// specified using interface syntax and the derived class
22 	/// must explicitly implement TestRunner in order to
23 	/// redefine the selected methods.
24 	/// </summary>
25 	public abstract class DelegatingTestRunner : MarshalByRefObject, TestRunner
26 	{
27 		#region Instance Variables
28 
29 		/// <summary>
30 		/// Our runner ID
31 		/// </summary>
32 		protected int runnerID;
33 
34 		/// <summary>
35 		/// The downstream TestRunner
36 		/// </summary>
37 		private TestRunner testRunner;
38 
39 		/// <summary>
40 		/// The event listener for the currently running test
41 		/// </summary>
42 		protected EventListener listener;
43 
44 		#endregion
45 
46 		#region Construction
DelegatingTestRunner(TestRunner testRunner)47 		public DelegatingTestRunner(TestRunner testRunner)
48 		{
49 			this.testRunner = testRunner;
50 			this.runnerID = testRunner.ID;
51 		}
52 
53 		/// <summary>
54 		/// Protected constructor for runners that delay creation
55 		/// of their downstream runner.
56 		/// </summary>
DelegatingTestRunner( int runnerID )57 		protected DelegatingTestRunner( int runnerID )
58 		{
59 			this.runnerID = runnerID;
60 		}
61 		#endregion
62 
63 		#region Properties
64 		public virtual int ID
65 		{
66 			get { return runnerID; }
67 		}
68 
69 		public virtual bool Running
70 		{
71 			get { return testRunner != null && testRunner.Running; }
72 		}
73 
74 		public virtual IList AssemblyInfo
75 		{
76 			get { return testRunner == null ? null : testRunner.AssemblyInfo; }
77 		}
78 
79 		public virtual ITest Test
80 		{
81 			get { return testRunner == null ? null : testRunner.Test; }
82 		}
83 
84 		public virtual TestResult TestResult
85 		{
86 			get { return testRunner == null ? null : testRunner.TestResult; }
87 		}
88 
89 		/// <summary>
90 		/// Protected property copies any settings to the downstream test runner
91 		/// when it is set. Derived runners overriding this should call the base
92 		/// or copy the settings themselves.
93 		/// </summary>
94 		protected virtual TestRunner TestRunner
95 		{
96 			get { return testRunner; }
97 			set { testRunner = value; }
98 		}
99 		#endregion
100 
101 		#region Load and Unload Methods
Load( TestPackage package )102 		public virtual bool Load( TestPackage package )
103 		{
104 			return this.testRunner.Load( package );
105 		}
106 
Unload()107 		public virtual void Unload()
108 		{
109             if ( this.testRunner != null )
110 			    this.testRunner.Unload();
111 		}
112 		#endregion
113 
114 		#region CountTestCases
CountTestCases( ITestFilter filter )115 		public virtual int CountTestCases( ITestFilter filter )
116 		{
117 			return this.testRunner.CountTestCases( filter );
118 		}
119 		#endregion
120 
121 		#region Methods for Running Tests
Run(EventListener listener)122 		public virtual TestResult Run(EventListener listener)
123 		{
124 			// Save active listener for derived classes
125 			this.listener = listener;
126 			return this.testRunner.Run(listener);
127 		}
128 
Run(EventListener listener, ITestFilter filter)129 		public virtual TestResult Run(EventListener listener, ITestFilter filter)
130 		{
131 			// Save active listener for derived classes
132 			this.listener = listener;
133 			return this.testRunner.Run(listener, filter);
134 		}
135 
BeginRun( EventListener listener )136 		public virtual void BeginRun( EventListener listener )
137 		{
138 			// Save active listener for derived classes
139 			this.listener = listener;
140 			this.testRunner.BeginRun( listener );
141 		}
142 
BeginRun( EventListener listener, ITestFilter filter )143 		public virtual void BeginRun( EventListener listener, ITestFilter filter )
144 		{
145 			// Save active listener for derived classes
146 			this.listener = listener;
147 			this.testRunner.BeginRun( listener, filter );
148 		}
149 
EndRun()150 		public virtual TestResult EndRun()
151 		{
152 			return this.testRunner.EndRun();
153 		}
154 
CancelRun()155 		public virtual void CancelRun()
156 		{
157 			this.testRunner.CancelRun();
158 		}
159 
Wait()160 		public virtual void Wait()
161 		{
162 			this.testRunner.Wait();
163 		}
164 		#endregion
165 
166 		#region InitializeLifetimeService Override
InitializeLifetimeService()167 		public override object InitializeLifetimeService()
168 		{
169 			return null;
170 		}
171 		#endregion
172 
173 	}
174 }
175