// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. namespace System.Data.Entity { using System.Collections.Generic; using System.Data.Entity.TestHelpers; using System.Linq; using System.Reflection; using Xunit; using Xunit.Sdk; /// /// Attribute that is applied to a method to indicate that it is a fact that /// should be run by the test runner in partial trust. /// /// /// The class containing the method must derive from . /// /// If the test class is decorated using , the fixture data is /// instantiated in the main /// /// and then serialized to the partial trust /// sandbox. /// public class PartialTrustFactAttribute : FactAttribute { protected override IEnumerable EnumerateTestCommands(IMethodInfo method) { var fixtures = GetFixtures(method.Class); return base.EnumerateTestCommands(method).Select(tc => new PartialTrustCommand(tc, fixtures)); } private static IDictionary GetFixtures(ITypeInfo typeUnderTest) { var fixtures = new Dictionary(); foreach (var @interface in typeUnderTest.Type.GetInterfaces()) { if (@interface.IsGenericType) { var genericDefinition = @interface.GetGenericTypeDefinition(); if (genericDefinition == typeof(IUseFixture<>)) { var dataType = @interface.GetGenericArguments()[0]; var fixtureData = Activator.CreateInstance(dataType); var method = @interface.GetMethod("SetFixture", new[] { dataType }); fixtures[method] = fixtureData; } } } return fixtures; } } }