DefaultSuiteBuilder
Built-in SuiteBuilder for all types of test classes.
using NUnit.Framework.Interfaces;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace NUnit.Framework.Internal.Builders
{
[NullableContext(1)]
[Nullable(0)]
public class DefaultSuiteBuilder : ISuiteBuilder
{
private readonly 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)
{
return BuildFrom(typeInfo, PreFilter.Empty);
}
public TestSuite BuildFrom(ITypeInfo typeInfo, IPreFilter filter)
{
List<TestSuite> list = new List<TestSuite>();
try {
IFixtureBuilder[] fixtureBuilderAttributes = GetFixtureBuilderAttributes(typeInfo);
IFixtureBuilder[] array = fixtureBuilderAttributes;
foreach (IFixtureBuilder fixtureBuilder in array) {
foreach (TestSuite item in (fixtureBuilder as IFixtureBuilder2)?.BuildFrom(typeInfo, filter) ?? fixtureBuilder.BuildFrom(typeInfo)) {
list.Add(item);
}
}
if (!typeInfo.IsGenericType) {
switch (list.Count) {
case 0:
return _defaultBuilder.BuildFrom(typeInfo, filter);
case 1:
return list[0];
default:
return BuildMultipleFixtures(typeInfo, list);
}
}
return BuildMultipleFixtures(typeInfo, list);
} catch (Exception exception) {
return new TestFixture(typeInfo, exception.Unwrap());
}
}
private TestSuite BuildMultipleFixtures(ITypeInfo typeInfo, IEnumerable<TestSuite> fixtures)
{
TestSuite testSuite = new ParameterizedFixtureSuite(typeInfo);
testSuite.ApplyAttributesToTestSuite(typeInfo.Type);
foreach (TestSuite fixture in fixtures) {
testSuite.Add(fixture);
}
return testSuite;
}
private IFixtureBuilder[] GetFixtureBuilderAttributes([Nullable(2)] ITypeInfo typeInfo)
{
IFixtureBuilder[] array = Array.Empty<IFixtureBuilder>();
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;
IFixtureBuilder[] array4 = array;
foreach (IFixtureBuilder fixtureBuilder in array4) {
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;
}
}
}