1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.Collections.Generic;
\r
6 using System.ComponentModel.Composition.Factories;
\r
7 using System.UnitTesting;
\r
8 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
9 using System.ComponentModel.Composition.Primitives;
\r
11 namespace System.ComponentModel.Composition
\r
14 public class ExportTests
\r
17 public void Constructor1_ShouldNotThrow()
\r
19 new NoOverridesExport();
\r
23 public void Constructor2_NullAsExportedValueGetterArgument_ShouldThrowArgumentNull()
\r
25 var definition = ExportDefinitionFactory.Create();
\r
27 ExceptionAssert.ThrowsArgument<ArgumentNullException>("exportedValueGetter", () =>
\r
29 new Export(definition, (Func<object>)null);
\r
34 public void Constructor3_NullAsExportedValueGetterArgument_ShouldThrowArgumentNull()
\r
36 ExceptionAssert.ThrowsArgument<ArgumentNullException>("exportedValueGetter", () =>
\r
38 new Export("ContractName", (Func<object>)null);
\r
43 public void Constructor4_NullAsExportedValueGetterArgument_ShouldThrowArgumentNull()
\r
45 var metadata = new Dictionary<string, object>();
\r
47 ExceptionAssert.ThrowsArgument<ArgumentNullException>("exportedValueGetter", () =>
\r
49 new Export("ContractName", metadata, (Func<object>)null);
\r
54 public void Constructor2_NullAsDefinitionArgument_ShouldThrowArgumentNull()
\r
56 ExceptionAssert.ThrowsArgument<ArgumentNullException>("definition", () =>
\r
58 new Export((ExportDefinition)null, () => null);
\r
63 public void Constructor2_DefinitionAsDefinitionArgument_ShouldSetDefinitionProperty()
\r
65 var definition = ExportDefinitionFactory.Create();
\r
67 var export = new Export(definition, () => null);
\r
69 Assert.AreSame(definition, export.Definition);
\r
73 public void Constructor3_NullAsContractNameArgument_ShouldThrowArgumentNull()
\r
75 ExceptionAssert.ThrowsArgument<ArgumentNullException>("contractName", () =>
\r
77 new Export((string)null, () => null);
\r
82 public void Constructor4_NullAsContractNameArgument_ShouldThrowArgumentNull()
\r
84 ExceptionAssert.ThrowsArgument<ArgumentNullException>("contractName", () =>
\r
86 new Export((string)null, new Dictionary<string, object>(), () => null);
\r
91 public void Constructor3_EmptyStringAsContractNameArgument_ShouldThrowArgument()
\r
93 ExceptionAssert.ThrowsArgument<ArgumentException>("contractName", () =>
\r
95 new Export(string.Empty, () => null);
\r
100 public void Constructor4_EmptyStringAsContractNameArgument_ShouldThrowArgument()
\r
102 ExceptionAssert.ThrowsArgument<ArgumentException>("contractName", () =>
\r
104 new Export(string.Empty, new Dictionary<string, object>(), () => null);
\r
109 public void Constructor3_ValueAsContractNameArgument_ShouldSetDefinitionContractNameProperty()
\r
111 var expectations = Expectations.GetContractNames();
\r
113 foreach (var e in expectations)
\r
115 var export = new Export(e, () => null);
\r
117 Assert.AreEqual(e, export.Definition.ContractName);
\r
123 public void Constructor4_ValueAsContractNameArgument_ShouldSetDefinitionContractNameProperty()
\r
125 var expectations = Expectations.GetContractNames();
\r
127 foreach (var e in expectations)
\r
129 var export = new Export(e, new Dictionary<string, object>(), () => null);
\r
131 Assert.AreEqual(e, export.Definition.ContractName);
\r
136 public void Constructor3_ShouldSetMetadataPropertyToEmptyDictionary()
\r
138 var export = new Export("ContractName", () => null); ;
\r
140 EnumerableAssert.IsEmpty(export.Metadata);
\r
144 public void Constructor4_NullAsMetadataArgument_ShouldSetMetadataPropertyToEmptyDictionary()
\r
146 var export = new Export("ContractName", (IDictionary<string, object>)null, () => null); ;
\r
148 EnumerableAssert.IsEmpty(export.Metadata);
\r
152 public void Constructor3_NullAsMetadataArgument_ShouldSetMetadataPropertyToReadOnlyDictionary()
\r
154 var export = new Export("ContractName", () => null);
\r
156 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
158 export.Metadata["Value"] = "Value";
\r
163 public void Constructor4_NullAsMetadataArgument_ShouldSetMetadataPropertyToReadOnlyDictionary()
\r
165 var export = new Export("ContractName", (IDictionary<string, object>)null, () => null);
\r
167 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
169 export.Metadata["Value"] = "Value";
\r
174 public void Constructor4_WritableDictionaryAsMetadataArgument_ShouldSetMetadataPropertyToReadOnlyDictionary()
\r
176 var export = new Export("ContractName", new Dictionary<string, object>(), () => null);
\r
178 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
180 export.Metadata["Value"] = "Value";
\r
185 public void Constructor4_DictionaryAsMetadataArgument_ShouldSetMetadataProperty()
\r
187 var expectations = Expectations.GetMetadata();
\r
189 foreach (var e in expectations)
\r
191 var export = new Export("ContractName", e, () => null);
\r
193 EnumerableAssert.AreEqual(e, export.Metadata);
\r
198 public void Constructor3_ShouldSetDefinitionMetadataPropertyToEmptyDictionary()
\r
200 var export = new Export("ContractName", () => null); ;
\r
202 EnumerableAssert.IsEmpty(export.Definition.Metadata);
\r
206 public void Constructor4_NullAsMetadataArgument_ShouldSetDefinitionMetadataPropertyToEmptyDictionary()
\r
208 var export = new Export("ContractName", (IDictionary<string, object>)null, () => null); ;
\r
210 EnumerableAssert.IsEmpty(export.Definition.Metadata);
\r
214 public void Constructor3_ShouldSetDefinitionMetadataPropertyToReadOnlyDictionary()
\r
216 var export = new Export("ContractName", () => null);
\r
218 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
220 export.Definition.Metadata["Value"] = "Value";
\r
225 public void Constructor4_NullAsMetadataArgument_ShouldSetDefinitionMetadataPropertyToReadOnlyDictionary()
\r
227 var export = new Export("ContractName", (IDictionary<string, object>)null, () => null);
\r
229 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
231 export.Definition.Metadata["Value"] = "Value";
\r
236 public void Constructor4_WritableDictionaryAsMetadataArgument_ShouldSetDefinitionMetadataPropertyToReadOnlyDictionary()
\r
238 var export = new Export("ContractName", new Dictionary<string, object>(), () => null);
\r
240 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
242 export.Definition.Metadata["Value"] = "Value";
\r
247 public void Constructor4_DictionaryAsMetadataArgument_ShouldSetDefinitionMetadataProperty()
\r
249 var expectations = Expectations.GetMetadata();
\r
251 foreach (var e in expectations)
\r
253 var export = new Export("ContractName", e, () => null);
\r
255 EnumerableAssert.AreEqual(e, export.Definition.Metadata);
\r
260 public void Constructor2_FuncReturningAStringAsExportedValueGetter_ShouldBeReturnedByGetExportedValue()
\r
262 var definition = ExportDefinitionFactory.Create();
\r
264 var export = new Export(definition, () => "Value");
\r
266 Assert.AreEqual("Value", export.Value);
\r
270 public void Constructor3_FuncReturningAStringAsExportedValueGetter_ShouldBeReturnedByGetExportedValue()
\r
272 var export = new Export("ContractName", () => "Value");
\r
274 Assert.AreEqual("Value", export.Value);
\r
278 public void Constructor4_FuncReturningAStringAsExportedValueGetter_ShouldBeReturnedByGetExportedValue()
\r
280 var export = new Export("ContractName", new Dictionary<string, object>(), () => "Value");
\r
282 Assert.AreEqual("Value", export.Value);
\r
286 public void Constructor2_FuncReturningNullAsExportedValueGetter_ShouldBeReturnedByGetExportedValue()
\r
288 var definition = ExportDefinitionFactory.Create();
\r
290 var export = new Export(definition, () => null);
\r
292 Assert.IsNull(export.Value);
\r
296 public void Constructor3_FuncReturningNullAsExportedValueGetter_ShouldBeReturnedByGetExportedValue()
\r
298 var export = new Export("ContractName", () => null);
\r
300 Assert.IsNull(export.Value);
\r
304 public void Constructor4_FuncReturningNullAsExportedValueGetter_ShouldBeReturnedByGetExportedValue()
\r
306 var export = new Export("ContractName", new Dictionary<string, object>(), () => null);
\r
308 Assert.IsNull(export.Value);
\r
312 public void Metadata_DerivedExportDefinition_ShouldReturnDefinitionMetadata()
\r
314 var expectations = Expectations.GetMetadata();
\r
316 foreach (var e in expectations)
\r
318 var definition = ExportDefinitionFactory.Create("ContractName", e);
\r
320 var export = new DerivedExport(definition);
\r
322 EnumerableAssert.AreEqual(e, export.Metadata);
\r
327 public void Definition_WhenNotOverridden_ShouldThrowNotImplemented()
\r
329 var export = new NoOverridesExport();
\r
331 ExceptionAssert.Throws<NotImplementedException>(() =>
\r
333 var definition = export.Definition;
\r
338 public void Metadata_WhenDefinitionNotOverridden_ShouldThrowNotImplemented()
\r
340 var export = new NoOverridesExport();
\r
342 ExceptionAssert.Throws<NotImplementedException>(() =>
\r
344 var definition = export.Metadata;
\r
349 public void GetExportedValue_WhenGetExportedValueCoreNotOverridden_ShouldThrowNotImplemented()
\r
351 var export = new NoOverridesExport();
\r
353 ExceptionAssert.Throws<NotImplementedException>(() =>
\r
355 var value = export.Value;
\r
360 public void GetExportedValue_ShouldCacheExportedValueGetter()
\r
364 var export = new Export("ContractName", () =>
\r
370 Assert.AreEqual(1, export.Value);
\r
371 Assert.AreEqual(1, export.Value);
\r
372 Assert.AreEqual(1, export.Value);
\r
377 public void GetExportedValue_ShouldCacheOverrideGetExportedValueCore()
\r
381 var export = new DerivedExport(() =>
\r
387 Assert.AreEqual(1, export.Value);
\r
388 Assert.AreEqual(1, export.Value);
\r
389 Assert.AreEqual(1, export.Value);
\r
393 public void GetExportedValue_ThrowingFuncAsObjectGetterArgument_ShouldThrow()
\r
395 var exceptionToThrow = new Exception();
\r
397 var export = new Export("ContractName", new Dictionary<string, object>(), () =>
\r
399 throw exceptionToThrow;
\r
402 ExceptionAssert.Throws(exceptionToThrow, RetryMode.Retry, () =>
\r
404 var value = export.Value;
\r
409 private class NoOverridesExport : Export
\r
413 private class DerivedExport : Export
\r
415 private readonly Func<object> _exportedValueGetter;
\r
416 private readonly ExportDefinition _definition;
\r
418 public DerivedExport(ExportDefinition definition)
\r
420 _definition = definition;
\r
423 public DerivedExport(Func<object> exportedValueGetter)
\r
425 _exportedValueGetter = exportedValueGetter;
\r
428 public override ExportDefinition Definition
\r
430 get { return _definition; }
\r
433 protected override object GetExportedValueCore()
\r
435 return _exportedValueGetter();
\r