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