Add Nunit2
[mono.git] / mcs / nunit20 / framework / Test.cs
1 #region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
2 /************************************************************************************
3 '
4 ' Copyright © 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
5 ' Copyright © 2000-2002 Philip A. Craig
6 '
7 ' This software is provided 'as-is', without any express or implied warranty. In no 
8 ' event will the authors be held liable for any damages arising from the use of this 
9 ' software.
10
11 ' Permission is granted to anyone to use this software for any purpose, including 
12 ' commercial applications, and to alter it and redistribute it freely, subject to the 
13 ' following restrictions:
14 '
15 ' 1. The origin of this software must not be misrepresented; you must not claim that 
16 ' you wrote the original software. If you use this software in a product, an 
17 ' acknowledgment (see the following) in the product documentation is required.
18 '
19 ' Portions Copyright © 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
20 ' or Copyright © 2000-2002 Philip A. Craig
21 '
22 ' 2. Altered source versions must be plainly marked as such, and must not be 
23 ' misrepresented as being the original software.
24 '
25 ' 3. This notice may not be removed or altered from any source distribution.
26 '
27 '***********************************************************************************/
28 #endregion
29
30 namespace NUnit.Core
31 {
32         using System;
33         using System.Collections;
34         using System.Reflection;
35
36         /// <summary>
37         ///             Test Class.
38         /// </summary>
39         public abstract class Test : LongLivingMarshalByRefObject, TestInfo
40         {
41                 private string fullName;
42                 private string testName;
43                 private bool shouldRun;
44                 private string ignoreReason;
45
46                 protected Test(string pathName, string testName) 
47                 { 
48                         fullName = pathName + "." + testName;
49                         this.testName = testName;
50                         shouldRun = true;
51                 }
52
53                 public string IgnoreReason
54                 {
55                         get { return ignoreReason; }
56                         set { ignoreReason = value; }
57                 }
58
59                 public bool ShouldRun
60                 {
61                         get { return shouldRun; }
62                         set { shouldRun = value; }
63                 }
64
65                 public Test(string name)
66                 {
67                         fullName = testName = name;
68                 }
69
70                 public string FullName 
71                 {
72                         get { return fullName; }
73                 }
74
75                 public string Name
76                 {
77                         get { return testName; }
78                 }
79
80                 public abstract int CountTestCases { get; }
81                 public abstract bool IsSuite { get; }
82                 public abstract ArrayList Tests { get; }
83
84                 public abstract TestResult Run(EventListener listener);
85
86                 protected MethodInfo FindMethodByAttribute(object fixture, Type type)
87                 {
88                         foreach(MethodInfo method in fixture.GetType().GetMethods(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic))
89                         {
90                                 if(method.IsDefined(type,true)) 
91                                 {
92                                         return method;
93                                 }
94                         }
95                         return null;
96                 }
97
98                 protected void InvokeMethod(MethodInfo method, object fixture) 
99                 {
100                         if(method != null)
101                         {
102                                 try
103                                 {
104                                         method.Invoke(fixture, null);
105                                 }
106                                 catch(TargetInvocationException e)
107                                 {
108                                         Exception inner = e.InnerException;
109                                         throw new NunitException("Rethrown",inner);
110                                 }
111                         }
112                 }
113         }
114 }