1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.Collections.Generic;
\r
6 using System.ComponentModel.Composition;
\r
7 using System.ComponentModel.Composition.Factories;
\r
8 using System.ComponentModel.Composition.Hosting;
\r
10 using System.Linq.Expressions;
\r
11 using System.UnitTesting;
\r
12 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
14 namespace Tests.Integration
\r
17 public class RequiredCreationPolicyTests
\r
19 // Matrix that details which policy to use for a given part to satisfy a given import.
\r
20 // Part.Any Part.Shared Part.NonShared
\r
21 // Import.Any Shared Shared NonShared
\r
22 // Import.Shared Shared Shared N/A
\r
23 // Import.NonShared NonShared N/A NonShared
\r
25 public interface ICreationPolicyExport
\r
30 [Export(typeof(ICreationPolicyExport))]
\r
31 public class CreationPolicyAnyExportImplicit : ICreationPolicyExport
\r
36 [Export(typeof(ICreationPolicyExport))]
\r
37 [PartCreationPolicy(CreationPolicy.Any)]
\r
38 public class CreationPolicyAnyExportExplicit : ICreationPolicyExport
\r
43 [Export(typeof(ICreationPolicyExport))]
\r
44 [PartCreationPolicy(CreationPolicy.Shared)]
\r
45 public class CreationPolicySharedExport : ICreationPolicyExport
\r
50 [Export(typeof(ICreationPolicyExport))]
\r
51 [PartCreationPolicy(CreationPolicy.NonShared)]
\r
52 public class CreationPolicyNonSharedExport : ICreationPolicyExport
\r
58 public class RequiredAnyImporterImplicit
\r
61 public IEnumerable<ICreationPolicyExport> Exports { get; set; }
\r
65 public class RequiredAnyImporterExplicit
\r
67 [ImportMany(RequiredCreationPolicy = CreationPolicy.Any)]
\r
68 public IEnumerable<ICreationPolicyExport> Exports { get; set; }
\r
72 public class RequiredSharedImporter
\r
74 [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)]
\r
75 public IEnumerable<ICreationPolicyExport> Exports { get; set; }
\r
79 public class RequiredNonSharedImporter
\r
81 [ImportMany(RequiredCreationPolicy = CreationPolicy.NonShared)]
\r
82 public IEnumerable<ICreationPolicyExport> Exports { get; set; }
\r
85 private static CompositionContainer CreateDefaultContainer()
\r
87 return ContainerFactory.CreateWithAttributedCatalog(
\r
88 typeof(ICreationPolicyExport),
\r
90 typeof(CreationPolicyAnyExportImplicit),
\r
91 typeof(CreationPolicyAnyExportExplicit),
\r
92 typeof(CreationPolicySharedExport),
\r
93 typeof(CreationPolicyNonSharedExport),
\r
95 typeof(RequiredAnyImporterImplicit),
\r
96 typeof(RequiredAnyImporterExplicit),
\r
97 typeof(RequiredSharedImporter),
\r
98 typeof(RequiredNonSharedImporter));
\r
102 public void RequiredAnyImporterImplicit_ShouldIncludeAll()
\r
104 var container = CreateDefaultContainer();
\r
106 var importer = container.GetExportedValue<RequiredAnyImporterImplicit>();
\r
108 EnumerableAssert.AreEqual(
\r
109 importer.Exports.Select(obj => obj.GetType()),
\r
110 typeof(CreationPolicyAnyExportImplicit),
\r
111 typeof(CreationPolicyAnyExportExplicit),
\r
112 typeof(CreationPolicySharedExport),
\r
113 typeof(CreationPolicyNonSharedExport));
\r
117 public void RequiredAnyImporterExplicit_ShouldIncludeAll()
\r
119 var container = CreateDefaultContainer();
\r
121 var importer = container.GetExportedValue<RequiredAnyImporterExplicit>();
\r
123 EnumerableAssert.AreEqual(
\r
124 importer.Exports.Select(obj => obj.GetType()),
\r
125 typeof(CreationPolicyAnyExportImplicit),
\r
126 typeof(CreationPolicyAnyExportExplicit),
\r
127 typeof(CreationPolicySharedExport),
\r
128 typeof(CreationPolicyNonSharedExport));
\r
132 public void RequiredSharedImporter_ShouldFilterNonShared()
\r
134 var container = CreateDefaultContainer();
\r
136 var importer = container.GetExportedValue<RequiredSharedImporter>();
\r
138 EnumerableAssert.AreEqual(
\r
139 importer.Exports.Select(obj => obj.GetType()),
\r
140 typeof(CreationPolicyAnyExportImplicit),
\r
141 typeof(CreationPolicyAnyExportExplicit),
\r
142 typeof(CreationPolicySharedExport));
\r
146 public void RequiredNonSharedImporter_ShouldFilterShared()
\r
148 var container = CreateDefaultContainer();
\r
150 var importer = container.GetExportedValue<RequiredNonSharedImporter>();
\r
152 EnumerableAssert.AreEqual(
\r
153 importer.Exports.Select(obj => obj.GetType()),
\r
154 typeof(CreationPolicyAnyExportImplicit),
\r
155 typeof(CreationPolicyAnyExportExplicit),
\r
156 typeof(CreationPolicyNonSharedExport));
\r