1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.Linq; 6 using Xunit; 7 8 namespace System.Composition.UnitTests 9 { 10 public class ConstraintTests : ContainerTests 11 { 12 public interface IThing { } 13 public interface ICar : IThing { } 14 public interface IBook : IThing { } 15 public interface IHandler<T> where T : IThing { } 16 17 [Export(typeof(IHandler<>))] 18 public class ThingHandler<T> : IHandler<T> 19 where T : IThing 20 { 21 } 22 23 [Export(typeof(IHandler<>))] 24 public class BookHandler<T> : IHandler<T> 25 where T : IBook 26 { 27 } 28 29 [Fact] 30 [ActiveIssue(24903, TargetFrameworkMonikers.NetFramework)] GenericPartDiscoveryIgnoresAPartAndDoesntThrowAnExceptionWhenItsConstraintOnTypeParameterIsNotAssignableFromTheExportTarget()31 public void GenericPartDiscoveryIgnoresAPartAndDoesntThrowAnExceptionWhenItsConstraintOnTypeParameterIsNotAssignableFromTheExportTarget() 32 { 33 var container = CreateContainer(typeof(ThingHandler<>), typeof(BookHandler<>)); 34 var carHandlers = container.GetExports<IHandler<ICar>>(); 35 var handlerTypes = carHandlers.Select(h => h.GetType()); 36 37 Assert.Equal(1, carHandlers.Count()); 38 Assert.Contains<Type>(typeof(ThingHandler<ICar>), handlerTypes); 39 } 40 41 [Fact] 42 [ActiveIssue(24903, TargetFrameworkMonikers.NetFramework)] GenericPartDiscoveryIncludesAPartWhenItsConstraintOnTypeParameterIsAssignableFromTheExportTarget()43 public void GenericPartDiscoveryIncludesAPartWhenItsConstraintOnTypeParameterIsAssignableFromTheExportTarget() 44 { 45 var container = CreateContainer(typeof(ThingHandler<>), typeof(BookHandler<>)); 46 var bookHandlers = container.GetExports<IHandler<IBook>>(); 47 var handlerTypes = bookHandlers.Select(h => h.GetType()); 48 49 Assert.Equal(2, bookHandlers.Count()); 50 Assert.Contains<Type>(typeof(ThingHandler<IBook>), handlerTypes); 51 Assert.Contains<Type>(typeof(BookHandler<IBook>), handlerTypes); 52 } 53 } 54 } 55