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