#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig /************************************************************************************ ' ' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole ' Copyright © 2000-2003 Philip A. Craig ' ' This software is provided 'as-is', without any express or implied warranty. In no ' event will the authors be held liable for any damages arising from the use of this ' software. ' ' Permission is granted to anyone to use this software for any purpose, including ' commercial applications, and to alter it and redistribute it freely, subject to the ' following restrictions: ' ' 1. The origin of this software must not be misrepresented; you must not claim that ' you wrote the original software. If you use this software in a product, an ' acknowledgment (see the following) in the product documentation is required. ' ' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole ' or Copyright © 2000-2003 Philip A. Craig ' ' 2. Altered source versions must be plainly marked as such, and must not be ' misrepresented as being the original software. ' ' 3. This notice may not be removed or altered from any source distribution. ' '***********************************************************************************/ #endregion namespace NUnit.Core { using System; using System.Reflection; using System.Collections; /// /// Summary description for TestCaseBuilder. /// public class TestCaseBuilder { private static Hashtable builders; private static ITestBuilder normalBuilder = new NormalBuilder(); private static void InitBuilders() { builders = new Hashtable(); builders[typeof(NUnit.Framework.ExpectedExceptionAttribute)] = new ExpectedExceptionBuilder(); } private static ITestBuilder GetBuilder(MethodInfo method) { if (builders == null) InitBuilders(); object[] attributes = method.GetCustomAttributes(false); foreach (object attribute in attributes) { ITestBuilder builder = (ITestBuilder) builders[attribute.GetType()]; if (builder != null) return builder; } return normalBuilder; } /// /// Make a test case from a given fixture type and method /// /// The fixture type /// MethodInfo for the particular method /// A test case or null public static TestCase Make(Type fixtureType, MethodInfo method) { TestCase testCase = null; if( Reflect.HasTestAttribute(method) || Reflect.IsObsoleteTestMethod( method ) ) { if( Reflect.IsTestMethodSignatureCorrect( method ) ) { ITestBuilder builder = GetBuilder(method); testCase = builder.Make(fixtureType, method); if(Reflect.HasIgnoreAttribute(method)) { testCase.ShouldRun = false; testCase.IgnoreReason = Reflect.GetIgnoreReason(method); } if (Reflect.HasCategoryAttribute(method)) { IList categories = Reflect.GetCategories(method); CategoryManager.Add(categories); testCase.Categories = categories; } testCase.IsExplicit = Reflect.HasExplicitAttribute(method); testCase.Description = Reflect.GetDescription(method); } else { testCase = new NotRunnableTestCase(method); } } return testCase; } #region Make Test Cases with pre-created fixtures // TODO: These methods are only used by our tests, since we no longer // create the fixture in advance. They should be phased out. public static TestCase Make(object fixture, MethodInfo method) { TestCase testCase = Make( fixture.GetType(), method ); testCase.Fixture = fixture; return testCase; } public static TestCase Make(object fixture, string methodName) { MethodInfo method = Reflect.GetMethod( fixture.GetType(), methodName ); if ( method != null ) return Make(fixture, method); return null; } #endregion } internal interface ITestBuilder { TestCase Make(Type fixtureType, MethodInfo method); TestCase Make(object fixture, MethodInfo method); } internal class ExpectedExceptionBuilder : ITestBuilder { #region ITestBuilder Members public TestCase Make(Type fixtureType, MethodInfo method) { return new ExpectedExceptionTestCase( fixtureType, method ); } public TestCase Make(object fixture, MethodInfo method) { return new ExpectedExceptionTestCase( fixture, method ); } #endregion } internal class NormalBuilder : ITestBuilder { #region ITestBuilder Members public TestCase Make(Type fixtureType, MethodInfo method) { return new NormalTestCase(fixtureType, method); } public TestCase Make(object fixture, MethodInfo method) { return new NormalTestCase(fixture, method); } #endregion } }