blob: 65ae19f4c2a1e9d3a6b586c6b2d4db5eaed0f611 [file] [log] [blame]
using NUnit.Framework;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Threading;
namespace Lucene.Net.Util
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/// <summary>
/// Custom class to build the assembly-wide setup/teardown. NUnit doesn't scan attributes from dependent assemblies,
/// so this is a workaround to inject our initializer so we can get a teardown for the assembly.
/// </summary>
internal class LuceneSetUpFixtureBuilder
{
[SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "By design")]
public TestSuite BuildFrom(ITypeInfo typeInfo)
{
var setUpFixtureType = new DefaultNamespaceTypeWrapper(typeof(LuceneTestCase.SetUpFixture));
SetUpFixture fixture = new SetUpFixture(setUpFixtureType);
if (fixture.RunState != RunState.NotRunnable)
{
string reason = null;
if (!IsValidFixtureType(setUpFixtureType, ref reason))
fixture.MakeInvalid(reason);
}
fixture.ApplyAttributesToTest(setUpFixtureType.Type.GetTypeInfo());
return fixture;
}
#region Helper Methods
private static bool IsValidFixtureType(ITypeInfo typeInfo, ref string reason)
{
if (!typeInfo.IsStaticClass)
{
if (typeInfo.IsAbstract)
{
reason = string.Format("{0} is an abstract class", typeInfo.FullName);
return false;
}
if (!typeInfo.HasConstructor(new Type[0]))
{
reason = string.Format("{0} does not have a default constructor", typeInfo.FullName);
return false;
}
}
var invalidAttributes = new Type[] {
typeof(SetUpAttribute),
typeof(TearDownAttribute)
};
foreach (Type invalidType in invalidAttributes)
if (typeInfo.HasMethodWithAttribute(invalidType))
{
reason = invalidType.Name + $" attribute not allowed in a {nameof(LuceneTestCase.SetUpFixture)}.";
return false;
}
return true;
}
#endregion
}
}