1 //------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //------------------------------------------------------------
5 using System
.ComponentModel
.Composition
;
6 using System
.Collections
.Generic
;
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
19 public class ContractBasedImportDefinitionTests
22 public void Constructor1_ShouldSetRequiredMetadataPropertyToEmptyEnumerable()
24 var definition
= new NoOverridesContractBasedImportDefinition();
26 EnumerableAssert
.IsEmpty(definition
.RequiredMetadata
);
30 public void Constructor1_ShouldSetCardinalityPropertyToExactlyOne()
32 var definition
= new NoOverridesContractBasedImportDefinition();
34 Assert
.AreEqual(ImportCardinality
.ExactlyOne
, definition
.Cardinality
);
38 public void Constructor1_ShouldSetIsPrerequisitePropertyToTrue()
40 var definition
= new NoOverridesContractBasedImportDefinition();
42 Assert
.IsTrue(definition
.IsPrerequisite
);
46 public void Constructor1_ShouldSetIsRecomposablePropertyToFalse()
48 var definition
= new NoOverridesContractBasedImportDefinition();
50 Assert
.IsFalse(definition
.IsRecomposable
);
54 public void Constructor1_ShouldSetRequiredCreationPolicyToAny()
56 var definition
= new NoOverridesContractBasedImportDefinition();
58 Assert
.AreEqual(CreationPolicy
.Any
, definition
.RequiredCreationPolicy
);
62 public void Constructor1_ShouldSetRequiredTypeIdentityToNull()
64 var definition
= new NoOverridesContractBasedImportDefinition();
66 Assert
.IsNull(definition
.RequiredTypeIdentity
);
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
);
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
);
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
;
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
;
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
));
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
));
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
));
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
));
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
));
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; }