// 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;
///
/// Meta tests. These tests check the test suite for common issues.
///
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
///
/// Checks the type for any test methods.
/// Assumes any method attribute with an Xunit namespace indicates a test method.
///
/// Type to be checked.
/// True if the type is a test class, false otherwise.
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;
}));
}
///
/// Checks base types of the given types for TestBase
///
/// Type to be checked.
/// True if the type implements TestBase, false otherwise.
private bool DoesTypeImplementTestBase(Type type)
{
var baseType = type.BaseType;
while (baseType != null)
{
if (baseType.Name == "TestBase")
{
return true;
}
baseType = baseType.BaseType;
}
return false;
}
#endregion
}
}