update MEF to preview 9
[mcs.git] / class / System.ComponentModel.Composition / Tests / ComponentModelUnitTest / System / ComponentModel / Composition / ContractBasedImportDefinitionTests.cs
blob19dd66bf5a64e7b125f3d254fe2d78b476880c07
1 //------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //------------------------------------------------------------
4 using System;
5 using System.ComponentModel.Composition;
6 using System.Collections.Generic;
7 using System.Linq;
8 using Microsoft.VisualStudio.TestTools.UnitTesting;
9 using System.Linq.Expressions;
10 using System.UnitTesting;
11 using System.ComponentModel.Composition.Factories;
12 using System.ComponentModel.Composition.UnitTesting;
13 using System.ComponentModel.Composition.Primitives;
14 using System.ComponentModel.Composition.Hosting;
16 namespace System.ComponentModel.Composition
18 [TestClass]
19 public class ContractBasedImportDefinitionTests
21 [TestMethod]
22 public void Constructor1_ShouldSetRequiredMetadataPropertyToEmptyEnumerable()
24 var definition = new NoOverridesContractBasedImportDefinition();
26 EnumerableAssert.IsEmpty(definition.RequiredMetadata);
29 [TestMethod]
30 public void Constructor1_ShouldSetCardinalityPropertyToExactlyOne()
32 var definition = new NoOverridesContractBasedImportDefinition();
34 Assert.AreEqual(ImportCardinality.ExactlyOne, definition.Cardinality);
37 [TestMethod]
38 public void Constructor1_ShouldSetIsPrerequisitePropertyToTrue()
40 var definition = new NoOverridesContractBasedImportDefinition();
42 Assert.IsTrue(definition.IsPrerequisite);
45 [TestMethod]
46 public void Constructor1_ShouldSetIsRecomposablePropertyToFalse()
48 var definition = new NoOverridesContractBasedImportDefinition();
50 Assert.IsFalse(definition.IsRecomposable);
53 [TestMethod]
54 public void Constructor1_ShouldSetRequiredCreationPolicyToAny()
56 var definition = new NoOverridesContractBasedImportDefinition();
58 Assert.AreEqual(CreationPolicy.Any, definition.RequiredCreationPolicy);
61 [TestMethod]
62 public void Constructor1_ShouldSetRequiredTypeIdentityToNull()
64 var definition = new NoOverridesContractBasedImportDefinition();
66 Assert.IsNull(definition.RequiredTypeIdentity);
69 [TestMethod]
70 public void Constructor2_NullAsContractNameArgument_ShouldThrowArgumentNull()
72 ExceptionAssert.ThrowsArgument<ArgumentNullException>("contractName", () =>
74 new ContractBasedImportDefinition((string)null, (string)null, Enumerable.Empty<KeyValuePair<string, Type>>(), ImportCardinality.ExactlyOne, false, false, CreationPolicy.Any);
75 });
78 [TestMethod]
79 public void Constructor2_EmptyStringAsContractNameArgument_ShouldThrowArgument()
81 ExceptionAssert.ThrowsArgument<ArgumentException>("contractName", () =>
83 new ContractBasedImportDefinition("", (string)null, Enumerable.Empty<KeyValuePair<string, Type>>(), ImportCardinality.ExactlyOne, false, false, CreationPolicy.Any);
84 });
87 [TestMethod]
88 public void RequiredMetadata_ArrayWithNullKeyAsRequiredMetadataArgument_ShouldThrowInvalidOperation()
90 var requiredMetadata = new KeyValuePair<string, Type>[] { new KeyValuePair<string, Type>(null, typeof(object)) };
92 var import = new ContractBasedImportDefinition("requiredMetadata", (string)null, requiredMetadata, ImportCardinality.ExactlyOne, false, false, CreationPolicy.Any);
94 ExceptionAssert.Throws<InvalidOperationException>(() =>
96 var m = import.RequiredMetadata;
97 });
100 [TestMethod]
101 public void RequiredMetadata_ArrayWithNullValueAsRequiredMetadataArgument_ShouldThrowInvalidOperation()
103 var requiredMetadata = new KeyValuePair<string, Type>[] { new KeyValuePair<string, Type>("key", null) };
104 var import = new ContractBasedImportDefinition("requiredMetadata", (string)null, requiredMetadata, ImportCardinality.ExactlyOne, false, false, CreationPolicy.Any);
106 ExceptionAssert.Throws<InvalidOperationException>(() =>
108 var m = import.RequiredMetadata;
113 [TestMethod]
114 public void Constructor2_NullAsRequiredMetadataArgument_ShouldSetRequiredMetadataToEmptyEnumerable()
116 var definition = new ContractBasedImportDefinition("requiredMetadata", (string)null, (IEnumerable<KeyValuePair<string, Type>>)null, ImportCardinality.ExactlyOne, false, false, CreationPolicy.Any);
118 EnumerableAssert.IsEmpty(definition.RequiredMetadata);
121 [TestMethod]
122 public void Constructor2_OutOfRangeValueAsCardinalityArgument_ShouldThrowArgument()
124 var expectations = Expectations.GetInvalidEnumValues<ImportCardinality>();
126 foreach (var e in expectations)
128 ExceptionAssert.ThrowsArgument<ArgumentException>("cardinality", () =>
130 new ContractBasedImportDefinition((string)null, (string)null, Enumerable.Empty<KeyValuePair<string, Type>>(), e, false, false, CreationPolicy.Any);
135 [TestMethod]
136 public void Constructor2_ValueAsCardinalityArgument_ShouldSetCardinalityProperty()
138 var expectations = Expectations.GetEnumValues<ImportCardinality>();
140 foreach (var e in expectations)
142 var definition = new ContractBasedImportDefinition("ContractName", (string)null, Enumerable.Empty<KeyValuePair<string, Type>>(), e, false, false, CreationPolicy.Any);
144 Assert.AreEqual(e, definition.Cardinality);
148 [TestMethod]
149 public void Constructor2_ValueAsContractNameArgument_ShouldSetContractNameProperty()
151 var expectations = Expectations.GetContractNames();
153 foreach (var e in expectations)
155 var definition = new ContractBasedImportDefinition(e, (string)null, Enumerable.Empty<KeyValuePair<string, Type>>(), ImportCardinality.ExactlyOne, false, false, CreationPolicy.Any);
157 Assert.AreEqual(e, definition.ContractName);
161 [TestMethod]
162 public void Constructor2_ValueAsRequiredMetadataArgument_ShouldSetRequiredMetadataProperty()
164 var expectations = Expectations.GetRequiredMetadataWithEmpty();
166 foreach (var e in expectations)
168 var definition = new ContractBasedImportDefinition("ContractName", (string)null, e, ImportCardinality.ExactlyOne, false, false, CreationPolicy.Any);
170 EnumerableAssert.AreEqual(e, definition.RequiredMetadata);
174 [TestMethod]
175 public void Constructor2_ValueAsIsRecomposableArgument_ShouldSetIsRecomposableProperty()
177 var expectations = Expectations.GetBooleans();
179 foreach (var e in expectations)
181 var definition = new ContractBasedImportDefinition("ContractName", (string)null, Enumerable.Empty<KeyValuePair<string, Type>>(), ImportCardinality.ExactlyOne, e, false, CreationPolicy.Any);
183 Assert.AreEqual(e, definition.IsRecomposable);
187 [TestMethod]
188 public void Constructor2_ValueAsIsPrerequisiteArgument_ShouldSetIsPrerequisiteProperty()
190 var expectations = Expectations.GetBooleans();
192 foreach (var e in expectations)
194 var definition = new ContractBasedImportDefinition("ContractName", (string)null, Enumerable.Empty<KeyValuePair<string, Type>>(), ImportCardinality.ExactlyOne, false, e, CreationPolicy.Any);
196 Assert.AreEqual(e, definition.IsPrerequisite);
200 [TestMethod]
201 public void Constructor2_ShouldSetRequiredCreationPolicyToAny()
203 var expectations = Expectations.GetEnumValues<CreationPolicy>();
205 foreach (var e in expectations)
207 var definition = new ContractBasedImportDefinition("ContractName", (string)null, Enumerable.Empty<KeyValuePair<string, Type>>(), ImportCardinality.ExactlyOne, false, false, e);
209 Assert.AreEqual(e, definition.RequiredCreationPolicy);
213 [TestMethod]
214 public void Constraint_ShouldIncludeContractNameProperty()
216 var expectations = Expectations.GetContractNames();
218 foreach (var e in expectations)
220 var definition = new ContractBasedImportDefinition(e, (string)null, (IEnumerable<KeyValuePair<string, Type>>)null, ImportCardinality.ExactlyOne, true, false, CreationPolicy.Any);
222 ConstraintAssert.Contains(definition.Constraint, e);
226 [TestMethod]
227 public void Constraint_ShouldIncludeRequiredMetadataProperty()
229 var expectations = Expectations.GetRequiredMetadataWithEmpty();
231 foreach (var e in expectations)
233 var definition = new ContractBasedImportDefinition("ContractName", (string)null, e, ImportCardinality.ExactlyOne, true, false, CreationPolicy.Any);
235 ConstraintAssert.Contains(definition.Constraint, "ContractName", e);
239 [TestMethod]
240 public void Constraint_ShouldIncludeOverriddenContractNameProperty()
242 var expectations = Expectations.GetContractNames();
244 foreach (var e in expectations)
246 var definition = new DerivedContractBasedImportDefinition(e);
248 ConstraintAssert.Contains(definition.Constraint, e);
252 [TestMethod]
253 public void Constraint_ShouldIncludeOverriddenRequiredMetadata()
255 var expectations = Expectations.GetRequiredMetadataWithEmpty();
257 foreach (var e in expectations)
259 var definition = new DerivedContractBasedImportDefinition("ContractName", e);
261 ConstraintAssert.Contains(definition.Constraint, "ContractName", e);
265 [TestMethod]
266 public void IsConstraintSatisfiedBy_ContractNameMatch()
268 var export = CreateSimpleExport();
269 var import = CreateSimpleImport("ContractName", "ContractName", new string[0], new Type[0]);
270 Assert.IsTrue(import.IsConstraintSatisfiedBy(export));
273 [TestMethod]
274 public void IsConstraintSatisfiedBy_ContractNameMismatch()
276 var export = CreateSimpleExport();
277 var import = CreateSimpleImport("NonContractName", "ContractName", new string[0], new Type[0]);
278 Assert.IsFalse(import.IsConstraintSatisfiedBy(export));
281 [TestMethod]
282 public void IsConstraintSatisfiedBy_TypeIdentityMismatch()
284 var export = CreateSimpleExport();
285 var import = CreateSimpleImport("ContractName", "NonContractName", new string[0], new Type[0]);
286 Assert.IsFalse(import.IsConstraintSatisfiedBy(export));
289 [TestMethod]
290 public void IsConstraintSatisfiedBy_MetadataMatch()
292 var export = CreateSimpleExport();
293 var import = CreateSimpleImport("ContractName", "ContractName", new string[]{"Int", "String", "Type"}, new Type[]{typeof(int), typeof(string), typeof(Type)});
294 Assert.IsTrue(import.IsConstraintSatisfiedBy(export));
297 [TestMethod]
298 public void IsConstraintSatisfiedBy_MetadataKeyMismatch()
300 var export = CreateSimpleExport();
301 var import = CreateSimpleImport("ContractName", "ContractName", new string[] { "Int", "String1", "Type" }, new Type[] { typeof(int), typeof(string), typeof(Type) });
302 Assert.IsFalse(import.IsConstraintSatisfiedBy(export));
305 [TestMethod]
306 public void IsConstraintSatisfiedBy_MetadataTypeMatch()
308 var export = CreateSimpleExport();
309 var import = CreateSimpleImport("ContractName", "ContractName", new string[] { "Int", "String", "Type" }, new Type[] { typeof(int), typeof(string), typeof(int) });
310 Assert.IsFalse(import.IsConstraintSatisfiedBy(export));
313 private static ExportDefinition CreateSimpleExport()
315 var metadata = new Dictionary<string, object>();
316 metadata.Add("Int", 42);
317 metadata.Add("String", "42");
318 metadata.Add("Type", typeof(string));
319 metadata.Add(CompositionConstants.ExportTypeIdentityMetadataName, "ContractName");
320 return new ExportDefinition("ContractName", metadata);
323 private static ContractBasedImportDefinition CreateSimpleImport(string contractName, string typeIdentity, string[] metadataKeys, Type[] metadataTypes)
325 Dictionary<string, Type> requiredMetadata = new Dictionary<string, Type>();
326 Assert.AreEqual(metadataKeys.Length, metadataTypes.Length);
327 for(int i=0; i< metadataKeys.Length; i++)
329 requiredMetadata[metadataKeys[i]] = metadataTypes[i];
331 return new ContractBasedImportDefinition(contractName, typeIdentity, requiredMetadata, ImportCardinality.ZeroOrMore, false, false, CreationPolicy.Any);
335 private class NoOverridesContractBasedImportDefinition : ContractBasedImportDefinition
337 public NoOverridesContractBasedImportDefinition()
342 private class DerivedContractBasedImportDefinition : ContractBasedImportDefinition
344 private readonly string _contractName;
345 private readonly IEnumerable<KeyValuePair<string, Type>> _requiredMetadata;
347 public DerivedContractBasedImportDefinition(string contractName)
349 _contractName = contractName;
352 public DerivedContractBasedImportDefinition(string contractName, IEnumerable<KeyValuePair<string, Type>> requiredMetadata)
354 _contractName = contractName;
355 _requiredMetadata = requiredMetadata;
358 public override string ContractName
360 get { return _contractName; }
363 public override IEnumerable<KeyValuePair<string, Type>> RequiredMetadata
365 get { return _requiredMetadata; }