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;
        }
    }
}