DefaultSuiteBuilder
Built-in SuiteBuilder for all types of test classes.
using NUnit.Framework.Interfaces;
using System;
using System.Collections.Generic;
using System.Reflection;
namespace NUnit.Framework.Internal.Builders
{
public class DefaultSuiteBuilder : ISuiteBuilder
{
private NUnitTestFixtureBuilder _defaultBuilder = new NUnitTestFixtureBuilder();
public bool CanBuildFrom(ITypeInfo typeInfo)
{
if (typeInfo.IsAbstract && !typeInfo.IsSealed)
return false;
if (typeInfo.IsDefined<IFixtureBuilder>(true))
return true;
if (typeInfo.IsGenericTypeDefinition)
return false;
return typeInfo.HasMethodWithAttribute(typeof(IImplyFixture));
}
public TestSuite BuildFrom(ITypeInfo typeInfo)
{
List<TestSuite> list = new List<TestSuite>();
try {
IFixtureBuilder[] fixtureBuilderAttributes = GetFixtureBuilderAttributes(typeInfo);
for (int i = 0; i < fixtureBuilderAttributes.Length; i++) {
foreach (TestSuite item in fixtureBuilderAttributes[i].BuildFrom(typeInfo)) {
list.Add(item);
}
}
if (!typeInfo.IsGenericType) {
switch (list.Count) {
case 0:
return _defaultBuilder.BuildFrom(typeInfo);
case 1:
return list[0];
default:
return BuildMultipleFixtures(typeInfo, list);
}
}
return BuildMultipleFixtures(typeInfo, list);
} catch (Exception ex) {
Exception ex2 = ex;
TestFixture obj = new TestFixture(typeInfo) {
RunState = RunState.NotRunnable
};
if (ex2 is TargetInvocationException)
ex2 = ex2.InnerException;
string value = "An exception was thrown while loading the test." + Env.NewLine + ex2.ToString();
obj.Properties.Add("_SKIPREASON", value);
return obj;
}
}
private TestSuite BuildMultipleFixtures(ITypeInfo typeInfo, IEnumerable<TestSuite> fixtures)
{
TestSuite testSuite = new ParameterizedFixtureSuite(typeInfo);
foreach (TestSuite fixture in fixtures) {
testSuite.Add(fixture);
}
return testSuite;
}
private IFixtureBuilder[] GetFixtureBuilderAttributes(ITypeInfo typeInfo)
{
IFixtureBuilder[] array = new IFixtureBuilder[0];
while (typeInfo != null && !typeInfo.IsType(typeof(object))) {
array = typeInfo.GetCustomAttributes<IFixtureBuilder>(false);
if (array.Length != 0) {
if (array.Length == 1)
return array;
int num = 0;
IFixtureBuilder[] array2 = array;
foreach (IFixtureBuilder attr in array2) {
if (HasArguments(attr))
num++;
}
if (num == array.Length)
return array;
if (num == 0)
return new IFixtureBuilder[1] {
array[0]
};
IFixtureBuilder[] array3 = new IFixtureBuilder[num];
int num2 = 0;
array2 = array;
foreach (IFixtureBuilder fixtureBuilder in array2) {
if (HasArguments(fixtureBuilder))
array3[num2++] = fixtureBuilder;
}
return array3;
}
typeInfo = typeInfo.BaseType;
}
return array;
}
private bool HasArguments(IFixtureBuilder attr)
{
TestFixtureAttribute testFixtureAttribute = attr as TestFixtureAttribute;
if (testFixtureAttribute != null && testFixtureAttribute.Arguments.Length == 0)
return testFixtureAttribute.TypeArgs.Length != 0;
return true;
}
}
}