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