1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
4 using System.Collections.Generic;
5 using System.ComponentModel.Composition.Factories;
6 using System.ComponentModel.Composition.Primitives;
9 namespace System.ComponentModel.Composition.AttributedModel
11 class ConcreteCPD : ComposablePartDefinition
13 public override ComposablePart CreatePart()
15 throw new NotImplementedException();
18 public override IEnumerable<ExportDefinition> ExportDefinitions
20 get { throw new NotImplementedException(); }
23 public override IEnumerable<ImportDefinition> ImportDefinitions
25 get { throw new NotImplementedException(); }
29 public class CPDTest { }
31 public class AttributedModelServicesTests
34 public void CreatePartDefinition1_NullAsType_ShouldThrowArgumentNull()
36 var origin = ElementFactory.Create();
38 Assert.Throws<ArgumentNullException>("type", () =>
40 AttributedModelServices.CreatePartDefinition((Type)null, origin);
45 public void CreatePartDefinition2_NullAsType_ShouldThrowArgumentNull()
47 var origin = ElementFactory.Create();
49 Assert.Throws<ArgumentNullException>("type", () =>
51 AttributedModelServices.CreatePartDefinition((Type)null, origin, false);
56 public void CreatePart_From_InvalidPartDefiniton_ShouldThrowArgumentException()
58 Assert.Throws<ArgumentException>("partDefinition", () =>
60 var partDefinition = new ConcreteCPD();
61 var instance = new CPDTest();
62 AttributedModelServices.CreatePart(partDefinition, instance);
67 public void Exports_Throws_OnNullPart()
69 ComposablePartDefinition part = null;
70 Type contractType = typeof(IContract1);
71 Assert.Throws<ArgumentNullException>("part", () =>
73 part.Exports(contractType);
78 public void Exports_Throws_OnNullContractType()
80 ComposablePartDefinition part = typeof(PartExportingContract1).AsPart();
81 Type contractType = null;
82 Assert.Throws<ArgumentNullException>("contractType", () =>
84 part.Exports(contractType);
91 ComposablePartDefinition part1 = typeof(PartExportingContract1).AsPart();
92 ComposablePartDefinition part2 = typeof(PartExportingContract2).AsPart();
94 Assert.True(part1.Exports(typeof(IContract1)));
95 Assert.True(part2.Exports(typeof(IContract2)));
97 Assert.False(part2.Exports(typeof(IContract1)));
98 Assert.False(part1.Exports(typeof(IContract2)));
102 public void ExportsGeneric_Throws_OnNullPart()
104 ComposablePartDefinition part = null;
105 Assert.Throws<ArgumentNullException>("part", () =>
107 part.Exports<IContract1>();
112 public void ExportsGeneric()
114 ComposablePartDefinition part1 = typeof(PartExportingContract1).AsPart();
115 ComposablePartDefinition part2 = typeof(PartExportingContract2).AsPart();
117 Assert.True(part1.Exports<IContract1>());
118 Assert.True(part2.Exports<IContract2>());
120 Assert.False(part2.Exports<IContract1>());
121 Assert.False(part1.Exports<IContract2>());
125 public void Imports_Throws_OnNullPart()
127 ComposablePartDefinition part = null;
128 Type contractType = typeof(IContract1);
129 Assert.Throws<ArgumentNullException>("part", () =>
131 part.Imports(contractType);
136 public void Imports_Throws_OnNullContractName()
138 ComposablePartDefinition part = typeof(PartImportingContract1).AsPart();
139 Type contractType = null;
140 Assert.Throws<ArgumentNullException>("contractType", () =>
142 part.Imports(contractType);
147 public void Imports()
149 ComposablePartDefinition part1 = typeof(PartImportingContract1).AsPart();
150 ComposablePartDefinition part2 = typeof(PartImportingContract2).AsPart();
152 Assert.True(part1.Imports(typeof(IContract1)));
153 Assert.True(part2.Imports(typeof(IContract2)));
155 Assert.False(part2.Imports(typeof(IContract1)));
156 Assert.False(part1.Imports(typeof(IContract2)));
160 public void Imports_CardinalityIgnored_WhenNotSpecified()
162 ComposablePartDefinition part1 = typeof(PartImportingContract1).AsPart();
163 ComposablePartDefinition part1Multiple = typeof(PartImportingContract1Multiple).AsPart();
164 ComposablePartDefinition part1Optional = typeof(PartImportingContract1Optionally).AsPart();
166 Assert.True(part1.Imports(typeof(IContract1)));
167 Assert.True(part1Optional.Imports(typeof(IContract1)));
168 Assert.True(part1Multiple.Imports(typeof(IContract1)));
172 public void Imports_CardinalityNotIgnored_WhenSpecified()
174 ComposablePartDefinition part1 = typeof(PartImportingContract1).AsPart();
175 ComposablePartDefinition part1Multiple = typeof(PartImportingContract1Multiple).AsPart();
176 ComposablePartDefinition part1Optional = typeof(PartImportingContract1Optionally).AsPart();
178 Assert.True(part1.Imports(typeof(IContract1), ImportCardinality.ExactlyOne));
179 Assert.False(part1.Imports(typeof(IContract1), ImportCardinality.ZeroOrMore));
180 Assert.False(part1.Imports(typeof(IContract1), ImportCardinality.ZeroOrOne));
182 Assert.False(part1Multiple.Imports(typeof(IContract1), ImportCardinality.ExactlyOne));
183 Assert.True(part1Multiple.Imports(typeof(IContract1), ImportCardinality.ZeroOrMore));
184 Assert.False(part1Multiple.Imports(typeof(IContract1), ImportCardinality.ZeroOrOne));
186 Assert.False(part1Optional.Imports(typeof(IContract1), ImportCardinality.ExactlyOne));
187 Assert.False(part1Optional.Imports(typeof(IContract1), ImportCardinality.ZeroOrMore));
188 Assert.True(part1Optional.Imports(typeof(IContract1), ImportCardinality.ZeroOrOne));
192 public void ImportsGeneric_Throws_OnNullPart()
194 ComposablePartDefinition part = null;
195 Assert.Throws<ArgumentNullException>("part", () =>
197 part.Imports<IContract1>();
202 public void ImportsGeneric()
204 ComposablePartDefinition part1 = typeof(PartImportingContract1).AsPart();
205 ComposablePartDefinition part2 = typeof(PartImportingContract2).AsPart();
207 Assert.True(part1.Imports<IContract1>());
208 Assert.True(part2.Imports<IContract2>());
210 Assert.False(part2.Imports<IContract1>());
211 Assert.False(part1.Imports<IContract2>());
215 public void ImportsGeneric_CardinalityIgnored_WhenNotSpecified()
217 ComposablePartDefinition part1 = typeof(PartImportingContract1).AsPart();
218 ComposablePartDefinition part1Multiple = typeof(PartImportingContract1Multiple).AsPart();
219 ComposablePartDefinition part1Optional = typeof(PartImportingContract1Optionally).AsPart();
221 Assert.True(part1.Imports<IContract1>());
222 Assert.True(part1Optional.Imports<IContract1>());
223 Assert.True(part1Multiple.Imports<IContract1>());
227 public void ImportsGeneric_CardinalityNotIgnored_WhenSpecified()
229 ComposablePartDefinition part1 = typeof(PartImportingContract1).AsPart();
230 ComposablePartDefinition part1Multiple = typeof(PartImportingContract1Multiple).AsPart();
231 ComposablePartDefinition part1Optional = typeof(PartImportingContract1Optionally).AsPart();
233 Assert.True(part1.Imports<IContract1>(ImportCardinality.ExactlyOne));
234 Assert.False(part1.Imports<IContract1>(ImportCardinality.ZeroOrMore));
235 Assert.False(part1.Imports<IContract1>(ImportCardinality.ZeroOrOne));
237 Assert.False(part1Multiple.Imports<IContract1>(ImportCardinality.ExactlyOne));
238 Assert.True(part1Multiple.Imports<IContract1>(ImportCardinality.ZeroOrMore));
239 Assert.False(part1Multiple.Imports<IContract1>(ImportCardinality.ZeroOrOne));
241 Assert.False(part1Optional.Imports<IContract1>(ImportCardinality.ExactlyOne));
242 Assert.False(part1Optional.Imports<IContract1>(ImportCardinality.ZeroOrMore));
243 Assert.True(part1Optional.Imports<IContract1>(ImportCardinality.ZeroOrOne));
246 public interface IContract1
250 public interface IContract2
254 [Export(typeof(IContract1))]
255 public class PartExportingContract1 : IContract1
259 [Export(typeof(IContract2))]
260 public class PartExportingContract2 : IContract2
264 public class PartImportingContract1
267 public IContract1 import;
270 public class PartImportingContract2
273 public IContract2 import;
276 public class PartImportingContract1Optionally
278 [Import(AllowDefault = true)]
279 public IContract1 import;
282 public class PartImportingContract1Multiple
285 public IEnumerable<IContract1> import;