Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

73 lines
2.5 KiB
C#

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Data.Entity.Meta
{
using System;
using System.Linq;
using Xunit;
using System.Reflection;
/// <summary>
/// Meta tests. These tests check the test suite for common issues.
/// </summary>
public class MetaTests : TestBase
{
[Fact]
public void All_functional_tests_implement_TestBase()
{
var currentAssembly = Assembly.GetExecutingAssembly();
var types = currentAssembly.GetTypes();
foreach (var type in types)
{
if(IsTypeTestClass(type) && !DoesTypeImplementTestBase(type))
{
throw new Exception(String.Format("Test class '{0}' does not implement TestBase.", type.Name));
}
}
}
#region Helper methods
/// <summary>
/// Checks the type for any test methods.
/// Assumes any method attribute with an Xunit namespace indicates a test method.
/// </summary>
/// <param name="type"> Type to be checked. </param>
/// <returns> True if the type is a test class, false otherwise. </returns>
private bool IsTypeTestClass(Type type)
{
return type.GetMethods()
.Any(method => method.GetCustomAttributes(inherit: true)
.Any(attribute =>
{
var attribType = (attribute as Attribute).TypeId as Type;
return attribType != null
? attribType.Namespace == "Xunit"
: false;
}));
}
/// <summary>
/// Checks base types of the given types for TestBase
/// </summary>
/// <param name="type"> Type to be checked. </param>
/// <returns> True if the type implements TestBase, false otherwise. </returns>
private bool DoesTypeImplementTestBase(Type type)
{
var baseType = type.BaseType;
while (baseType != null)
{
if (baseType.Name == "TestBase")
{
return true;
}
baseType = baseType.BaseType;
}
return false;
}
#endregion
}
}