update MEF to preview 9
[mcs.git] / class / System.ComponentModel.Composition / Tests / ComponentModelUnitTest / System / ComponentModel / Composition / CompositionContainerTests.cs
blobac10766e048c8bcb6758df873a5500f0192cf6f6
1 // -----------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 // -----------------------------------------------------------------------
4 using System;
5 using System.Collections.Generic;
6 using System.ComponentModel.Composition;
7 using System.Linq;
8 using System.Linq.Expressions;
9 using System.Runtime.Serialization;
10 using Microsoft.VisualStudio.TestTools.UnitTesting;
11 using System.ComponentModel.Composition.Factories;
12 using System.UnitTesting;
13 using System.ComponentModel.Composition.AttributedModel;
14 using System.ComponentModel.Composition.Hosting;
15 using System.ComponentModel.Composition.Primitives;
16 using System.ComponentModel.Composition.UnitTesting;
18 namespace System.ComponentModel.Composition
20 [TestClass]
21 public class CompositionContainerTests
23 [TestMethod]
24 public void Constructor2_ArrayWithNullElementAsProvidersArgument_ShouldThrowArgumentException()
26 ExceptionAssert.ThrowsArgument<ArgumentException>("providers", () =>
28 new CompositionContainer(new ExportProvider[] { null });
29 });
32 [TestMethod]
33 public void Constructor3_ArrayWithNullElementAsProvidersArgument_ShouldThrowArgumentException()
35 var catalog = CatalogFactory.Create();
37 ExceptionAssert.ThrowsArgument<ArgumentException>("providers", () =>
39 new CompositionContainer(catalog, new ExportProvider[] { null });
40 });
43 [TestMethod]
44 public void Constructor2_ArrayAsProvidersArgument_ShouldNotAllowModificationAfterConstruction()
46 var providers = new ExportProvider[] { ExportProviderFactory.Create() };
47 var container = new CompositionContainer(providers);
49 providers[0] = null;
51 Assert.IsNotNull(container.Providers[0]);
54 [TestMethod]
55 public void Constructor3_ArrayAsProvidersArgument_ShouldNotAllowModificationAfterConstruction()
57 var providers = new ExportProvider[] { ExportProviderFactory.Create() };
58 var container = new CompositionContainer(CatalogFactory.Create(), providers);
60 providers[0] = null;
62 Assert.IsNotNull(container.Providers[0]);
65 [TestMethod]
66 public void Constructor1_ShouldSetProvidersPropertyToEmptyCollection()
68 var container = new CompositionContainer();
70 EnumerableAssert.IsEmpty(container.Providers);
73 [TestMethod]
74 public void Constructor2_EmptyArrayAsProvidersArgument_ShouldSetProvidersPropertyToEmpty()
76 var container = new CompositionContainer(new ExportProvider[0]);
78 EnumerableAssert.IsEmpty(container.Providers);
81 [TestMethod]
82 public void Constructor3_EmptyArrayAsProvidersArgument_ShouldSetProvidersPropertyToEmpty()
84 var container = new CompositionContainer(CatalogFactory.Create(), new ExportProvider[0]);
86 EnumerableAssert.IsEmpty(container.Providers);
89 [TestMethod]
90 public void Constructor1_ShouldSetCatalogPropertyToNull()
92 var container = new CompositionContainer();
94 Assert.IsNull(container.Catalog);
97 [TestMethod]
98 public void Constructor2_ShouldSetCatalogPropertyToNull()
100 var container = new CompositionContainer(new ExportProvider[0]);
102 Assert.IsNull(container.Catalog);
105 [TestMethod]
106 public void Constructor3_NullAsCatalogArgument_ShouldSetCatalogPropertyToNull()
108 var container = new CompositionContainer((ComposablePartCatalog)null, new ExportProvider[0]);
110 Assert.IsNull(container.Catalog);
113 [TestMethod]
114 public void Constructor3_ValueAsCatalogArgument_ShouldSetCatalogProperty()
116 var expectations = Expectations.GetCatalogs();
118 foreach (var e in expectations)
120 var container = new CompositionContainer(e, new ExportProvider[0]);
122 Assert.AreSame(e, container.Catalog);
126 [TestMethod]
127 public void Catalog_WhenDisposed_ShouldThrowObjectDisposed()
129 var container = CreateCompositionContainer();
130 container.Dispose();
132 ExceptionAssert.ThrowsDisposed(container, () =>
134 var catalog = container.Catalog;
138 [TestMethod]
139 public void Providers_WhenDisposed_ShouldThrowObjectDisposed()
141 var container = CreateCompositionContainer();
142 container.Dispose();
144 ExceptionAssert.ThrowsDisposed(container, () =>
146 var providers = container.Providers;
150 [TestMethod]
151 [Ignore]
152 [WorkItem(579990)] // NullReferenceException
153 public void ExportsChanged_Add_WhenDisposed_ShouldThrowObjectDisposed()
155 var container = CreateCompositionContainer();
156 container.Dispose();
158 ExceptionAssert.ThrowsDisposed(container, () =>
160 container.ExportsChanged += (o, s) => { };
164 [TestMethod]
165 [Ignore]
166 [WorkItem(579990)] // NullReferenceException
167 public void ExportsChanged_Remove_WhenDisposed_ShouldThrowObjectDisposed()
169 var container = CreateCompositionContainer();
170 container.Dispose();
172 ExceptionAssert.ThrowsDisposed(container, () =>
174 container.ExportsChanged -= (o, s) => { };
178 [TestMethod]
179 public void AddPart1_ImportOnlyPart_ShouldNotGetGarbageCollected()
181 var container = CreateCompositionContainer();
183 var import = PartFactory.CreateImporter("Value", ImportCardinality.ZeroOrMore);
185 CompositionBatch batch = new CompositionBatch();
186 batch.AddPart(import);
187 container.Compose(batch);
189 var weakRef = new WeakReference(import);
190 import = null;
192 GC.Collect();
193 GC.WaitForPendingFinalizers();
195 Assert.IsNotNull(weakRef.Target, "Import only part should not have been collected!");
197 GC.KeepAlive(container);
200 [TestMethod]
201 public void Compose_WhenContainerDisposed_ShouldThrowObjectDisposed()
203 var container = CreateCompositionContainer();
204 container.Dispose();
206 CompositionBatch batch = new CompositionBatch();
207 ExceptionAssert.ThrowsDisposed(container, () =>
209 container.Compose(batch);
213 [TestMethod]
214 public void GetExportOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
216 var container = CreateCompositionContainer();
217 container.Dispose();
219 ExceptionAssert.ThrowsDisposed(container, () =>
221 container.GetExport<string>();
225 [TestMethod]
226 public void GetExportOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
228 var container = CreateCompositionContainer();
229 container.Dispose();
231 ExceptionAssert.ThrowsDisposed(container, () =>
233 container.GetExport<string>("Contract");
237 [TestMethod]
238 public void GetExportOfTTMetadataView1_WhenContainerDisposed_ShouldThrowObjectDisposed()
240 var container = CreateCompositionContainer();
241 container.Dispose();
243 ExceptionAssert.ThrowsDisposed(container, () =>
245 container.GetExport<string, object>();
249 [TestMethod]
250 public void GetExportOfTTMetadataView2_WhenContainerDisposed_ShouldThrowObjectDisposed()
252 var container = CreateCompositionContainer();
253 container.Dispose();
255 ExceptionAssert.ThrowsDisposed(container, () =>
257 container.GetExport<string, object>("Contract");
261 [TestMethod]
262 public void GetExports1_WhenContainerDisposed_ShouldThrowObjectDisposed()
264 var container = CreateCompositionContainer();
265 container.Dispose();
267 var definition = ImportDefinitionFactory.Create();
268 ExceptionAssert.ThrowsDisposed(container, () =>
270 container.GetExports(definition);
274 [TestMethod]
275 public void GetExports2_WhenContainerDisposed_ShouldThrowObjectDisposed()
277 var container = CreateCompositionContainer();
278 container.Dispose();
280 ExceptionAssert.ThrowsDisposed(container, () =>
282 container.GetExports(typeof(string), typeof(object), "Contract");
286 [TestMethod]
287 public void GetExportsOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
289 var container = CreateCompositionContainer();
290 container.Dispose();
292 ExceptionAssert.ThrowsDisposed(container, () =>
294 container.GetExports<string>();
298 [TestMethod]
299 public void GetExportsOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
301 var container = CreateCompositionContainer();
302 container.Dispose();
304 ExceptionAssert.ThrowsDisposed(container, () =>
306 container.GetExports<string>("Contract");
310 [TestMethod]
311 public void GetExportsOfTTMetadataView1_WhenContainerDisposed_ShouldThrowObjectDisposed()
313 var container = CreateCompositionContainer();
314 container.Dispose();
316 ExceptionAssert.ThrowsDisposed(container, () =>
318 container.GetExports<string, object>();
322 [TestMethod]
323 public void GetExportsOfTTMetadataView2_WhenContainerDisposed_ShouldThrowObjectDisposed()
325 var container = CreateCompositionContainer();
326 container.Dispose();
328 ExceptionAssert.ThrowsDisposed(container, () =>
330 container.GetExports<string, object>("Contract");
334 [TestMethod]
335 public void GetExportedValueOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
337 var container = CreateCompositionContainer();
338 container.Dispose();
340 ExceptionAssert.ThrowsDisposed(container, () =>
342 container.GetExportedValue<string>();
347 [TestMethod]
348 public void GetExportedValueOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
350 var container = CreateCompositionContainer();
351 container.Dispose();
353 ExceptionAssert.ThrowsDisposed(container, () =>
355 container.GetExportedValue<string>("Contract");
359 [TestMethod]
360 public void GetExportedValueOrDefaultOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
362 var container = CreateCompositionContainer();
363 container.Dispose();
365 ExceptionAssert.ThrowsDisposed(container, () =>
367 container.GetExportedValueOrDefault<string>();
371 [TestMethod]
372 public void GetExportedValueOrDefaultOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
374 var container = CreateCompositionContainer();
375 container.Dispose();
377 ExceptionAssert.ThrowsDisposed(container, () =>
379 container.GetExportedValueOrDefault<string>("Contract");
383 [TestMethod]
384 public void GetExportedValuesOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
386 var container = CreateCompositionContainer();
387 container.Dispose();
389 ExceptionAssert.ThrowsDisposed(container, () =>
391 container.GetExportedValues<string>();
395 [TestMethod]
396 public void GetExportedValuesOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
398 var container = CreateCompositionContainer();
399 container.Dispose();
401 ExceptionAssert.ThrowsDisposed(container, () =>
403 container.GetExportedValues<string>("Contract");
407 [TestMethod]
408 public void GetExports1_NullAsImportDefinitionArgument_ShouldThrowArgumentNull()
410 var container = CreateCompositionContainer();
412 ExceptionAssert.ThrowsArgument<ArgumentNullException>("definition", () =>
414 container.GetExports((ImportDefinition)null);
418 [TestMethod]
419 public void GetExports2_NullAsTypeArgument_ShouldThrowArgumentNull()
421 var container = CreateCompositionContainer();
423 ExceptionAssert.ThrowsArgument<ArgumentNullException>("type", () =>
425 container.GetExports((Type)null, typeof(string), "ContractName");
429 [TestMethod]
430 public void GetExportOfT1_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
432 var container = CreateCompositionContainer();
434 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
436 container.GetExport<string>();
440 [TestMethod]
441 public void GetExportOfT2_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
443 var container = CreateCompositionContainer();
445 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
447 container.GetExport<string>("Contract");
451 [TestMethod]
452 public void GetExportOfTTMetadataView1_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
454 var container = CreateCompositionContainer();
456 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
458 container.GetExport<string, object>();
462 [TestMethod]
463 public void GetExportOfTTMetadataView2_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
465 var container = CreateCompositionContainer();
467 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
469 container.GetExport<string, object>("Contract");
473 [TestMethod]
474 public void GetExports1_DefinitionAskingForExactlyOneContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
476 var container = CreateCompositionContainer();
478 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
480 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
482 container.GetExports(definition);
486 [TestMethod]
487 public void GetExports1_DefinitionAskingForExactlyZeroOrOneContractThatDoesNotExist_ShouldReturnEmpty()
489 var container = CreateCompositionContainer();
491 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
493 var exports = container.GetExports(definition);
495 EnumerableAssert.IsEmpty(exports);
498 [TestMethod]
499 public void GetExports1_DefinitionAskingForExactlyZeroOrMoreContractThatDoesNotExist_ShouldReturnEmpty()
501 var container = CreateCompositionContainer();
503 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
505 var exports = container.GetExports(definition);
507 EnumerableAssert.IsEmpty(exports);
510 [TestMethod]
511 public void GetExports2_AskingForContractThatDoesNotExist_ShouldReturnNoExports()
513 var container = CreateCompositionContainer();
515 var exports = container.GetExports(typeof(string), (Type)null, "Contract");
517 EnumerableAssert.IsEmpty(exports);
520 [TestMethod]
521 public void GetExportsOfT1_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
523 var container = CreateCompositionContainer();
525 var exports = container.GetExports<string>();
527 EnumerableAssert.IsEmpty(exports);
530 [TestMethod]
531 public void GetExportsOfT2_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
533 var container = CreateCompositionContainer();
535 var exports = container.GetExports<string>("Contract");
537 EnumerableAssert.IsEmpty(exports);
540 [TestMethod]
541 public void GetExportsOfTTMetadataView1_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
543 var container = CreateCompositionContainer();
545 var exports = container.GetExports<string, object>();
547 EnumerableAssert.IsEmpty(exports);
550 [TestMethod]
551 public void GetExportsOfTTMetadataView2_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
553 var container = CreateCompositionContainer();
555 var exports = container.GetExports<string, object>("Contract");
557 EnumerableAssert.IsEmpty(exports);
560 [TestMethod]
561 public void GetExportedValueOfT1_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
563 var container = CreateCompositionContainer();
565 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
567 container.GetExportedValue<string>();
571 [TestMethod]
572 public void GetExportedValueOfT2_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
574 var container = CreateCompositionContainer();
576 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
578 container.GetExportedValue<string>("Contract");
582 [TestMethod]
583 public void GetExportedValueOrDefaultOfT1_AskingForStringContractThatDoesNotExist_ShouldReturnNull()
585 var container = CreateCompositionContainer();
587 var exportedValue = container.GetExportedValueOrDefault<string>();
589 Assert.IsNull(exportedValue);
592 [TestMethod]
593 public void GetExportedValueOrDefaultOfT2_AskingForStringContractThatDoesNotExist_ShouldReturnNull()
595 var container = CreateCompositionContainer();
597 var exportedValue = container.GetExportedValueOrDefault<string>("Contract");
599 Assert.IsNull(exportedValue);
602 [TestMethod]
603 public void GetExportedValueOrDefaultOfT1_AskingForInt32ContractThatDoesNotExist_ShouldReturnZero()
605 var container = CreateCompositionContainer();
607 var exportedValue = container.GetExportedValueOrDefault<int>();
609 Assert.AreEqual(0, exportedValue);
612 [TestMethod]
613 public void GetExportedValueOrDefaultOfT2_AskingForInt32ContractThatDoesNotExist_ShouldReturnZero()
615 var container = CreateCompositionContainer();
617 var exportedValue = container.GetExportedValueOrDefault<int>("Contract");
619 Assert.AreEqual(0, exportedValue);
622 [TestMethod]
623 public void GetExportedValuesOfT1_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
625 var container = CreateCompositionContainer();
627 var exports = container.GetExportedValues<string>();
629 EnumerableAssert.IsEmpty(exports);
632 [TestMethod]
633 public void GetExportedValuesOfT2_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
635 var container = CreateCompositionContainer();
637 var exports = container.GetExports<string>("Contract");
639 EnumerableAssert.IsEmpty(exports);
642 [TestMethod]
643 public void GetExportOfT1_AskingForContractWithOneExport_ShouldReturnExport()
645 var container = ContainerFactory.Create(new MicroExport(ContractFromType(typeof(String)), "Value"));
647 var export = container.GetExport<string>();
649 Assert.AreEqual("Value", export.Value);
652 [TestMethod]
653 public void GetExportOfT2_AskingForContractWithOneExport_ShouldReturnExport()
655 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
657 var export = container.GetExport<string>("Contract");
659 Assert.AreEqual("Value", export.Value);
662 [TestMethod]
663 public void GetExportOfTTMetadataView1_AskingForContractWithOneExport_ShouldReturnExport()
665 var container = ContainerFactory.Create(new MicroExport(ContractFromType(typeof(String)), "Value"));
667 var export = container.GetExport<string, object>();
669 Assert.AreEqual("Value", export.Value);
672 [TestMethod]
673 public void GetExportOfTTMetadataView2_AskingForContractWithOneExport_ShouldReturnExport()
675 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
677 var export = container.GetExport<string, object>("Contract");
679 Assert.AreEqual("Value", export.Value);
682 [TestMethod]
683 public void GetExports1_AskingForExactlyOneContractWithOneExport_ShouldReturnExport()
685 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
687 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
689 var exports = container.GetExports(definition);
691 ExportsAssert.AreEqual(exports, "Value");
694 [TestMethod]
695 public void GetExports1_AskingForZeroOrOneContractWithOneExport_ShouldReturnExport()
697 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
699 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
701 var exports = container.GetExports(definition);
703 ExportsAssert.AreEqual(exports, "Value");
706 [TestMethod]
707 public void GetExports1_AskingForZeroOrMoreContractWithOneExport_ShouldReturnExport()
709 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
711 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
713 var exports = container.GetExports(definition);
715 ExportsAssert.AreEqual(exports, "Value");
718 [TestMethod]
719 public void GetExports2_AskingForContractWithOneExport_ShouldReturnOneExport()
721 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
723 var exports = container.GetExports(typeof(string), (Type)null, "Contract");
725 ExportsAssert.AreEqual(exports, "Value");
728 [TestMethod]
729 public void GetExportsOfT1_AskingForContractWithOneExport_ShouldReturnOneExport()
731 var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
733 var exports = container.GetExports<string>();
735 ExportsAssert.AreEqual(exports, "Value");
738 [TestMethod]
739 public void GetExportsOfT2_AskingForContractWithOneExport_ShouldReturnOneExport()
741 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
743 var exports = container.GetExports<string>("Contract");
745 ExportsAssert.AreEqual(exports, "Value");
748 [TestMethod]
749 public void GetExportsOfTTMetadataView1_AskingForContractWithOneExport_ShouldReturnOneExport()
751 var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
753 var exports = container.GetExports<string, object>();
755 ExportsAssert.AreEqual(exports, "Value");
758 [TestMethod]
759 public void GetExportsOfTTMetadataView2_AskingForContractWithOneExport_ShouldReturnOneExport()
761 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
763 var exports = container.GetExports<string, object>("Contract");
765 ExportsAssert.AreEqual(exports, "Value");
768 [TestMethod]
769 public void GetExportedValueOfT1_AskingForContractWithOneExport_ShouldReturnExport()
771 var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
773 var exportedValue = container.GetExportedValue<string>();
775 Assert.AreEqual("Value", exportedValue);
778 [TestMethod]
779 public void GetExportedValueOfT2_AskingForContractWithOneExport_ShouldReturnExport()
781 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
783 var exportedValue = container.GetExportedValue<string>("Contract");
785 Assert.AreEqual("Value", exportedValue);
788 [TestMethod]
789 public void GetExportedValueOrDefaultOfT1_AskingForContractWithOneExport_ShouldReturnExport()
791 var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
793 var exportedValue = container.GetExportedValueOrDefault<string>();
795 Assert.AreEqual("Value", exportedValue);
798 [TestMethod]
799 public void GetExportedValueOrDefaultOfT2_AskingForContractWithOneExport_ShouldReturnExport()
801 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
803 var exportedValue = container.GetExportedValueOrDefault<string>("Contract");
805 Assert.AreEqual("Value", exportedValue);
808 [TestMethod]
809 public void GetExportedValuesOfT1_AskingForContractWithOneExport_ShouldReturnOneExport()
811 var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
813 var exportedValues = container.GetExportedValues<string>();
815 EnumerableAssert.AreEqual(exportedValues, "Value");
818 [TestMethod]
819 public void GetExportedValuesOfT2_AskingForContractWithOneExport_ShouldReturnOneExport()
821 var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
823 var exportedValues = container.GetExportedValues<string>("Contract");
825 EnumerableAssert.AreEqual(exportedValues, "Value");
828 [TestMethod]
829 public void GetExportOfT1_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
831 var container = ContainerFactory.Create(new MicroExport(ContractFromType(typeof(String)), "Value1", "Value2"));
833 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
835 container.GetExport<string>();
839 [TestMethod]
840 public void GetExportOfT2_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
842 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
844 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
846 container.GetExport<string>("Contract");
850 [TestMethod]
851 public void GetExportOfTTMetadataView1_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
853 var container = ContainerFactory.Create(new MicroExport(ContractFromType(typeof(String)), "Value1", "Value2"));
855 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
857 container.GetExport<string, object>();
861 [TestMethod]
862 public void GetExportOfTTMetadataView2_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
864 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
866 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
868 container.GetExport<string, object>("Contract");
872 [TestMethod]
873 public void GetExports1_AskingForExactlyOneContractWithMultipleExports_ShouldThrowCardinalityMismatch()
875 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
877 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
879 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
881 container.GetExports(definition);
885 [TestMethod]
886 public void GetExports1_AskingForZeroOrOneContractWithMultipleExports_ShouldReturnZero()
888 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
890 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
892 Assert.AreEqual(0, container.GetExports(definition).Count());
895 [TestMethod]
896 public void GetExports1_AskingForZeroOrMoreContractWithMultipleExports_ShouldReturnMultipleExports()
898 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
900 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
902 var exports = container.GetExports(definition);
904 ExportsAssert.AreEqual(exports, "Value1", "Value2");
907 [TestMethod]
908 public void GetExports2_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
910 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
912 var exports = container.GetExports(typeof(string), (Type)null, "Contract");
914 ExportsAssert.AreEqual(exports, "Value1", "Value2");
917 [TestMethod]
918 public void GetExportsOfT1_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
920 var container = ContainerFactory.Create(new MicroExport(typeof(String), "Value1", "Value2"));
922 var exports = container.GetExports<string>();
924 ExportsAssert.AreEqual(exports, "Value1", "Value2");
927 [TestMethod]
928 public void GetExportsOfT2_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
930 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
932 var exports = container.GetExports<string>("Contract");
934 ExportsAssert.AreEqual(exports, "Value1", "Value2");
937 [TestMethod]
938 public void GetExportsOfTTMetadataView1_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
940 var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value1", "Value2"));
942 var exports = container.GetExports<string, object>();
944 ExportsAssert.AreEqual(exports, "Value1", "Value2");
947 [TestMethod]
948 public void GetExportsOfTTMetadataView2_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
950 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
952 var exports = container.GetExports<string, object>("Contract");
954 ExportsAssert.AreEqual(exports, "Value1", "Value2");
957 [TestMethod]
958 public void GetExportedValueOfT1_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
960 var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value1", "Value2"));
962 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
964 container.GetExportedValue<string>();
968 [TestMethod]
969 public void GetExportedValueOfT2_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
971 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
973 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
975 container.GetExportedValue<string>("Contract");
979 [TestMethod]
980 public void GetExportedValueOrDefaultOfT1_AskingForContractWithMultipleExports_ShouldReturnZero()
982 var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value1", "Value2"));
984 Assert.IsNull(container.GetExportedValueOrDefault<string>());
987 [TestMethod]
988 public void GetExportedValueOrDefaultOfT2_AskingForContractWithMultipleExports_ShouldReturnZero()
990 var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
992 Assert.IsNull(container.GetExportedValueOrDefault<string>("Contract"));
995 [TestMethod]
996 public void GetExportedValuesOfT1_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
998 var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value1", "Value2"));
1000 var exportedValues = container.GetExportedValues<string>();
1002 EnumerableAssert.AreEqual(exportedValues, "Value1", "Value2");
1005 [TestMethod]
1006 public void GetExportedValuesOfT2_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
1008 var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), "Value1", "Value2"));
1010 var exportedValues = container.GetExportedValues<string>("Contract");
1012 EnumerableAssert.AreEqual(exportedValues, "Value1", "Value2");
1015 [TestMethod]
1016 public void GetExports1_AskingForExactlyOneAndAll_ShouldThrowCardinalityMismatch()
1018 var container = ContainerFactory.Create(new MicroExport("Contract1", "Value1", "Value2", "Value3"),
1019 new MicroExport("Contract2", "Value4", "Value5", "Value6"));
1021 var definition = ImportDefinitionFactory.Create(import => true, ImportCardinality.ExactlyOne);
1023 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
1025 container.GetExports(definition);
1029 [TestMethod]
1030 public void GetExports1_AskingForZeroOrOneAndAll_ShouldReturnZero()
1032 var container = ContainerFactory.Create(new MicroExport("Contract1", "Value1", "Value2", "Value3"),
1033 new MicroExport("Contract2", "Value4", "Value5", "Value6"));
1035 var definition = ImportDefinitionFactory.Create(import => true, ImportCardinality.ZeroOrOne);
1037 Assert.AreEqual(0, container.GetExports(definition).Count());
1040 [TestMethod]
1041 public void GetExports1_AskingForZeroOrMoreAndAll_ShouldReturnAll()
1043 var container = ContainerFactory.Create(new MicroExport("Contract1", "Value1", "Value2", "Value3"),
1044 new MicroExport("Contract2", "Value4", "Value5", "Value6"));
1046 var definition = ImportDefinitionFactory.Create(import => true, ImportCardinality.ZeroOrMore);
1048 var exports = container.GetExports(definition);
1050 ExportsAssert.AreEqual(exports, "Value1", "Value2", "Value3",
1051 "Value4", "Value5", "Value6");
1054 [TestMethod]
1055 public void GetExportOfT1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1057 var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
1059 var export = container.GetExport<string>();
1061 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1063 var value = export.Value;
1067 [TestMethod]
1068 public void GetExportOfT2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1070 var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
1072 var export = container.GetExport<string>("Contract");
1074 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1076 var value = export.Value;
1080 [TestMethod]
1081 public void GetExportOfTTMetadataView1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1083 var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
1085 var export = container.GetExport<string, object>();
1087 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1089 var value = export.Value;
1093 [TestMethod]
1094 public void GetExportOfTTMetadataView2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1096 var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
1098 var export = container.GetExport<string, object>("Contract");
1100 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1102 var value = export.Value;
1106 [TestMethod]
1107 public void GetExports2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1109 var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
1111 var exports = container.GetExports(typeof(string), (Type)null, "Contract");
1113 Assert.AreEqual(1, exports.Count());
1115 var export = exports.ElementAt(0);
1117 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1119 var value = export.Value;
1123 [TestMethod]
1124 public void GetExportsOfT1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1126 var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
1128 var exports = container.GetExports<string>();
1130 Assert.AreEqual(1, exports.Count());
1132 var export = exports.ElementAt(0);
1134 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1136 var value = export.Value;
1140 [TestMethod]
1141 public void GetExportsOfT2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1143 var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
1145 var exports = container.GetExports<string>("Contract");
1147 Assert.AreEqual(1, exports.Count());
1149 var export = exports.ElementAt(0);
1151 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1153 var value = export.Value;
1157 [TestMethod]
1158 public void GetExportsOfTTMetadataView1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1160 var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
1162 var exports = container.GetExports<string, object>();
1164 Assert.AreEqual(1, exports.Count());
1166 var export = exports.ElementAt(0);
1168 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1170 var value = export.Value;
1174 [TestMethod]
1175 public void GetExportsOfTTMetadataView2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1177 var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
1179 var exports = container.GetExports<string, object>("Contract");
1181 Assert.AreEqual(1, exports.Count());
1183 var export = exports.ElementAt(0);
1185 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1187 var value = export.Value;
1191 [TestMethod]
1192 public void GetExportedValueOfT1_StringAsTTypeArgumentAskingForContractWithObjectExport_ShouldThrowContractMismatch()
1194 var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
1196 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1198 container.GetExportedValue<string>();
1202 [TestMethod]
1203 public void GetExportedValueOfT2_StringAsTTypeArgumentAskingForContractWithObjectExport_ShouldThrowContractMismatch()
1205 var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
1207 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1209 container.GetExportedValue<string>("Contract");
1213 [TestMethod]
1214 public void GetExportedValueOrDefaultOfT1_StringAsTTypeArgumentAskingForContractWithObjectExport_ShouldThrowContractMismatch()
1216 var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
1218 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1220 container.GetExportedValueOrDefault<string>();
1224 [TestMethod]
1225 public void GetExportedValueOrDefaultOfT2_StringAsTTypeArgumentAskingForContractWithObjectExport_ShouldThrowContractMismatch()
1227 var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
1229 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1231 container.GetExportedValueOrDefault<string>("Contract");
1235 [TestMethod]
1236 public void GetExportedValuesOfT1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1238 var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
1240 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1242 container.GetExportedValues<string>();
1246 [TestMethod]
1247 public void GetExportedValuesOfT2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
1249 var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
1251 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
1253 container.GetExportedValues<string>("Contract");
1258 [TestMethod]
1259 public void GetExportOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1261 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1262 var child = ContainerFactory.Create(parent);
1264 var export = child.GetExport<string>();
1266 Assert.AreEqual("Parent", export.Value);
1269 [TestMethod]
1270 public void GetExportOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1272 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1273 var child = ContainerFactory.Create(parent);
1275 var export = child.GetExport<string>("Contract");
1277 Assert.AreEqual("Parent", export.Value);
1280 [TestMethod]
1281 public void GetExportOfTTMetadataView1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1283 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1284 var child = ContainerFactory.Create(parent);
1286 var export = child.GetExport<string, object>();
1288 Assert.AreEqual("Parent", export.Value);
1291 [TestMethod]
1292 public void GetExportOfTTMetadataView2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1294 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1295 var child = ContainerFactory.Create(parent);
1297 var export = child.GetExport<string, object>("Contract");
1299 Assert.AreEqual("Parent", export.Value);
1302 [TestMethod]
1303 public void GetExports1_AskingForExactlyOneContractFromChildWithExportInParentContainer_ShouldReturnExport()
1305 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1306 var child = ContainerFactory.Create(parent);
1308 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
1310 var exports = child.GetExports(definition);
1312 ExportsAssert.AreEqual(exports, "Parent");
1315 [TestMethod]
1316 public void GetExports1_AskingForZeroOrOneContractFromChildWithExportInParentContainer_ShouldReturnExport()
1318 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1319 var child = ContainerFactory.Create(parent);
1321 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
1323 var exports = child.GetExports(definition);
1325 ExportsAssert.AreEqual(exports, "Parent");
1328 [TestMethod]
1329 public void GetExports1_AskingForZeroOrMoreContractFromChildWithExportInParentContainer_ShouldReturnExport()
1331 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1332 var child = ContainerFactory.Create(parent);
1334 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
1336 var exports = child.GetExports(definition);
1338 ExportsAssert.AreEqual(exports, "Parent");
1341 [TestMethod]
1342 public void GetExports2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1344 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1345 var child = ContainerFactory.Create(parent);
1347 var exports = child.GetExports(typeof(string), (Type)null, "Contract");
1349 ExportsAssert.AreEqual(exports, "Parent");
1352 [TestMethod]
1353 public void GetExportsOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1355 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1356 var child = ContainerFactory.Create(parent);
1358 var exports = child.GetExports<string>();
1360 ExportsAssert.AreEqual(exports, "Parent");
1363 [TestMethod]
1364 public void GetExportsOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1366 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1367 var child = ContainerFactory.Create(parent);
1369 var exports = child.GetExports<string>("Contract");
1371 ExportsAssert.AreEqual(exports, "Parent");
1374 [TestMethod]
1375 public void GetExportsOfTTMetadataView1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1377 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1378 var child = ContainerFactory.Create(parent);
1380 var exports = child.GetExports<string, object>();
1382 ExportsAssert.AreEqual(exports, "Parent");
1385 [TestMethod]
1386 public void GetExportsOfTTMetadataView2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1388 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1389 var child = ContainerFactory.Create(parent);
1391 var exports = child.GetExports<string, object>("Contract");
1393 ExportsAssert.AreEqual(exports, "Parent");
1396 [TestMethod]
1397 public void GetExportedValueOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1399 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1400 var child = ContainerFactory.Create(parent);
1402 var exportedValue = child.GetExportedValue<string>();
1404 Assert.AreEqual("Parent", exportedValue);
1407 [TestMethod]
1408 public void GetExportedValueOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1410 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1411 var child = ContainerFactory.Create(parent);
1413 var exportedValue = child.GetExportedValue<string>("Contract");
1415 Assert.AreEqual("Parent", exportedValue);
1418 [TestMethod]
1419 public void GetExportedValueOrDefaultOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1421 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1422 var child = ContainerFactory.Create(parent);
1424 var exportedValue = child.GetExportedValueOrDefault<string>();
1426 Assert.AreEqual("Parent", exportedValue);
1429 [TestMethod]
1430 public void GetExportedValueOrDefaultOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1432 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1433 var child = ContainerFactory.Create(parent);
1435 var exportedValue = child.GetExportedValueOrDefault<string>("Contract");
1437 Assert.AreEqual("Parent", exportedValue);
1440 [TestMethod]
1441 public void GetExportedValuesOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1443 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1444 var child = ContainerFactory.Create(parent);
1446 var exportedValues = child.GetExportedValues<string>();
1448 EnumerableAssert.AreEqual(exportedValues, "Parent");
1451 [TestMethod]
1452 public void GetExportedValuesOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
1454 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1455 var child = ContainerFactory.Create(parent);
1457 var exportedValues = child.GetExportedValues<string>("Contract");
1459 EnumerableAssert.AreEqual(exportedValues, "Parent");
1462 [TestMethod]
1463 public void GetExportOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1465 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1466 var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
1468 var export = child.GetExport<string>();
1470 Assert.AreEqual("Child", export.Value);
1473 [TestMethod]
1474 public void GetExportOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1476 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1477 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1479 var export = child.GetExport<string>("Contract");
1481 Assert.AreEqual("Child", export.Value);
1484 [TestMethod]
1485 public void GetExportOfTTMetadataView1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1487 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1488 var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
1490 var export = child.GetExport<string, object>();
1492 Assert.AreEqual("Child", export.Value);
1495 [TestMethod]
1496 public void GetExportOfTTMetadataView2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1498 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1499 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1501 var export = child.GetExport<string, object>("Contract");
1503 Assert.AreEqual("Child", export.Value);
1506 [TestMethod]
1507 public void GetExports1_AskingForExactlyOneContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1509 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1510 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1512 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
1514 var exports = child.GetExports(definition);
1516 ExportsAssert.AreEqual(exports, "Child");
1519 [TestMethod]
1520 public void GetExports1_AskingForZeroOrOneContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1522 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1523 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1525 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
1527 var exports = child.GetExports(definition);
1529 ExportsAssert.AreEqual(exports, "Child");
1532 [TestMethod]
1533 public void GetExports1_AskingForZeroOrMoreContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
1535 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1536 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1538 var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
1540 var exports = child.GetExports(definition);
1542 ExportsAssert.AreEqual(exports, "Child", "Parent");
1545 [TestMethod]
1546 public void GetExports2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
1548 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1549 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1551 var exports = child.GetExports(typeof(string), (Type)null, "Contract");
1553 ExportsAssert.AreEqual(exports, "Child", "Parent");
1556 [TestMethod]
1557 public void GetExportsOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
1559 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1560 var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
1562 var exports = child.GetExports<string>();
1564 ExportsAssert.AreEqual(exports, "Child", "Parent");
1567 [TestMethod]
1568 public void GetExportsOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
1570 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1571 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1573 var exports = child.GetExports<string>("Contract");
1575 ExportsAssert.AreEqual(exports, "Child", "Parent");
1578 [TestMethod]
1579 public void GetExportsOfTTMetadataView1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
1581 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1582 var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
1585 var exports = child.GetExports<string, object>();
1587 ExportsAssert.AreEqual(exports, "Child", "Parent");
1590 [TestMethod]
1591 public void GetExportsOfTTMetadataView2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
1593 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1594 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1596 var exports = child.GetExports<string, object>("Contract");
1598 ExportsAssert.AreEqual(exports, "Child", "Parent");
1601 [TestMethod]
1602 public void GetExportedValueOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1604 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1605 var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
1607 var exportedValue = child.GetExportedValue<string>();
1609 Assert.AreEqual("Child", exportedValue);
1612 [TestMethod]
1613 public void GetExportedValueOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1615 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1616 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1618 var exportedValue = child.GetExportedValue<string>("Contract");
1620 Assert.AreEqual("Child", exportedValue);
1623 [TestMethod]
1624 public void GetExportedValueOrDefaultOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1626 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1627 var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
1629 var exportedValue = child.GetExportedValueOrDefault<string>();
1631 Assert.AreEqual("Child", exportedValue);
1634 [TestMethod]
1635 public void GetExportedValueOrDefaultOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
1637 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1638 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1640 var exportedValue = child.GetExportedValueOrDefault<string>("Contract");
1642 Assert.AreEqual("Child", exportedValue);
1645 [TestMethod]
1646 public void GetExportedValuesOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
1648 var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
1649 var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
1651 var exportedValues = child.GetExportedValues<string>();
1653 EnumerableAssert.AreEqual(exportedValues, "Child", "Parent");
1656 [TestMethod]
1657 public void GetExportedValuesOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
1659 var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
1660 var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
1662 var exportedValues = child.GetExportedValues<string>("Contract");
1664 EnumerableAssert.AreEqual(exportedValues, "Child", "Parent");
1667 [TestMethod]
1668 public void GetExportOfTTMetadataView1_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
1670 var metadata = new Dictionary<string, object>();
1671 metadata.Add("Metadata1", "MetadataValue1");
1672 metadata.Add("Metadata2", "MetadataValue2");
1673 metadata.Add("Metadata3", "MetadataValue3");
1675 var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
1676 new MicroExport(typeof(string), metadata, "Value1"),
1677 new MicroExport(typeof(string), "Value2"));
1679 var export = container.GetExport<string, IMetadataView>();
1680 var metadataExport = (Lazy<string, IMetadataView>)export;
1682 Assert.AreEqual("Value1", metadataExport.Value);
1683 Assert.AreEqual("MetadataValue1", metadataExport.Metadata.Metadata1);
1684 Assert.AreEqual("MetadataValue2", metadataExport.Metadata.Metadata2);
1685 Assert.AreEqual("MetadataValue3", metadataExport.Metadata.Metadata3);
1688 [TestMethod]
1689 public void GetExportOfTTMetadataView2_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
1691 var metadata = new Dictionary<string, object>();
1692 metadata.Add("Metadata1", "MetadataValue1");
1693 metadata.Add("Metadata2", "MetadataValue2");
1694 metadata.Add("Metadata3", "MetadataValue3");
1696 var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
1697 new MicroExport("Contract", metadata, "Value1"),
1698 new MicroExport("Contract", "Value2"));
1700 var export = container.GetExport<string, IMetadataView>("Contract");
1701 var metadataExport = (Lazy<string, IMetadataView>)export;
1703 Assert.AreEqual("Value1", metadataExport.Value);
1704 Assert.AreEqual("MetadataValue1", metadataExport.Metadata.Metadata1);
1705 Assert.AreEqual("MetadataValue2", metadataExport.Metadata.Metadata2);
1706 Assert.AreEqual("MetadataValue3", metadataExport.Metadata.Metadata3);
1709 [TestMethod]
1710 public void GetExports1_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
1712 var metadata = new Dictionary<string, object>();
1713 metadata.Add("Metadata1", "MetadataValue1");
1714 metadata.Add("Metadata2", "MetadataValue2");
1715 metadata.Add("Metadata3", "MetadataValue3");
1717 var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
1718 new MicroExport("Contract", metadata, "Value1"),
1719 new MicroExport("Contract", "Value2"));
1721 var definition = ImportDefinitionFactory.Create(
1722 "Contract",
1723 new Dictionary<string, Type> { { "Metadata1", typeof(object) }, { "Metadata2", typeof(object) }, { "Metadata3", typeof(object) } }
1726 var exports = container.GetExports(definition);
1728 Assert.AreEqual(1, exports.Count());
1730 var export = exports.First();
1732 Assert.AreEqual("Value1", export.Value);
1733 EnumerableAssert.AreEqual(metadata, export.Metadata);
1736 [TestMethod]
1737 public void GetExports2_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
1739 var metadata = new Dictionary<string, object>();
1740 metadata.Add("Metadata1", "MetadataValue1");
1741 metadata.Add("Metadata2", "MetadataValue2");
1742 metadata.Add("Metadata3", "MetadataValue3");
1744 var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
1745 new MicroExport("Contract", metadata, "Value1"),
1746 new MicroExport("Contract", "Value2"));
1748 var exports = container.GetExports(typeof(string), typeof(IMetadataView), "Contract");
1750 Assert.AreEqual(1, exports.Count());
1752 var export = exports.First();
1753 IMetadataView exportMetadata = export.Metadata as IMetadataView;
1755 Assert.AreEqual("Value1", export.Value);
1756 Assert.IsNotNull(exportMetadata);
1758 Assert.AreEqual("MetadataValue1", exportMetadata.Metadata1);
1759 Assert.AreEqual("MetadataValue2", exportMetadata.Metadata2);
1760 Assert.AreEqual("MetadataValue3", exportMetadata.Metadata3);
1763 [TestMethod]
1764 public void GetExportsOfTTMetadataView1_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
1766 var metadata = new Dictionary<string, object>();
1767 metadata.Add("Metadata1", "MetadataValue1");
1768 metadata.Add("Metadata2", "MetadataValue2");
1769 metadata.Add("Metadata3", "MetadataValue3");
1771 var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
1772 new MicroExport(typeof(string), metadata, "Value1"),
1773 new MicroExport(typeof(string), "Value2"));
1775 var exports = container.GetExports<string, IMetadataView>();
1777 Assert.AreEqual(1, exports.Count());
1779 var export = (Lazy<string, IMetadataView>)exports.First();
1781 Assert.AreEqual("Value1", export.Value);
1782 Assert.AreEqual("MetadataValue1", export.Metadata.Metadata1);
1783 Assert.AreEqual("MetadataValue2", export.Metadata.Metadata2);
1784 Assert.AreEqual("MetadataValue3", export.Metadata.Metadata3);
1787 [TestMethod]
1788 public void GetExportsOfTTMetadataView2_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
1790 var metadata = new Dictionary<string, object>();
1791 metadata.Add("Metadata1", "MetadataValue1");
1792 metadata.Add("Metadata2", "MetadataValue2");
1793 metadata.Add("Metadata3", "MetadataValue3");
1795 var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
1796 new MicroExport("Contract", metadata, "Value1"),
1797 new MicroExport("Contract", "Value2"));
1799 var exports = container.GetExports<string, IMetadataView>("Contract");
1801 Assert.AreEqual(1, exports.Count());
1803 var export = (Lazy<string, IMetadataView>)exports.First();
1805 Assert.AreEqual("Value1", export.Value);
1806 Assert.AreEqual("MetadataValue1", export.Metadata.Metadata1);
1807 Assert.AreEqual("MetadataValue2", export.Metadata.Metadata2);
1808 Assert.AreEqual("MetadataValue3", export.Metadata.Metadata3);
1812 [TestMethod]
1813 public void GetExports1_AskingForExactlyOneAndAllWhenContainerEmpty_ShouldThrowCardinalityMismatch()
1815 var container = CreateCompositionContainer();
1817 var definition = ImportDefinitionFactory.Create(export => true, ImportCardinality.ExactlyOne);
1819 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
1821 container.GetExports(definition);
1825 [TestMethod]
1826 public void GetExports1_AskingForZeroOrOneAndAllWhenContainerEmpty_ShouldReturnEmpty()
1828 var container = CreateCompositionContainer();
1830 var definition = ImportDefinitionFactory.Create(export => true, ImportCardinality.ZeroOrOne);
1832 var exports = container.GetExports(definition);
1834 EnumerableAssert.IsEmpty(exports);
1837 [TestMethod]
1838 public void GetExports1_AskingForExactlyOneAndAllWhenContainerEmpty_ShouldReturnEmpty()
1840 var container = CreateCompositionContainer();
1842 var definition = ImportDefinitionFactory.Create(export => true, ImportCardinality.ZeroOrMore);
1844 var exports = container.GetExports(definition);
1846 EnumerableAssert.IsEmpty(exports);
1849 [TestMethod]
1850 [Ignore]
1851 [WorkItem(465976)]
1852 public void RemovePart_PartNotInContainerAsPartArgument_ShouldNotCauseImportsToBeRebound()
1854 const string contractName = "Contract";
1856 var exporter = PartFactory.CreateExporter(new MicroExport(contractName, 1));
1857 var importer = PartFactory.CreateImporter(contractName);
1858 var container = ContainerFactory.Create(exporter, importer);
1861 Assert.AreEqual(1, importer.Value);
1862 Assert.AreEqual(1, importer.ImportSatisfiedCount);
1864 var doesNotExistInContainer = PartFactory.CreateExporter(new MicroExport(contractName, 2));
1866 CompositionBatch batch = new CompositionBatch();
1867 batch.RemovePart(doesNotExistInContainer);
1868 container.Compose(batch);
1870 Assert.AreEqual(1, importer.ImportSatisfiedCount);
1873 [TestMethod]
1874 [Ignore]
1875 [WorkItem(436847)]
1876 public void RemovePart_PartInContainerQueueAsPartArgument_ShouldNotLeavePartInContainer()
1878 const string contractName = "Contract";
1880 var exporter = PartFactory.CreateExporter(new MicroExport(contractName, 1));
1881 var importer = PartFactory.CreateImporter(contractName);
1882 var container = ContainerFactory.Create(exporter, importer);
1884 CompositionBatch batch = new CompositionBatch();
1885 batch.RemovePart(exporter);
1886 container.Compose(batch);
1888 Assert.IsNull(importer.Value);
1889 Assert.AreEqual(2, importer.ImportSatisfiedCount);
1892 [TestMethod]
1893 public void RemovePart_PartAlreadyRemovedAsPartArgument_ShouldNotThrow()
1895 var exporter = PartFactory.CreateExporter(new MicroExport("Contract", 1));
1896 var container = ContainerFactory.Create(exporter);
1898 Assert.AreEqual(1, container.GetExportedValue<int>("Contract"));
1900 CompositionBatch batch = new CompositionBatch();
1901 batch.RemovePart(exporter);
1902 container.Compose(batch);
1904 Assert.IsFalse(container.IsPresent("Contract"));
1906 batch = new CompositionBatch();
1907 batch.RemovePart(exporter);
1908 container.Compose(batch);
1910 Assert.IsFalse(container.IsPresent("Contract"));
1913 [TestMethod]
1914 public void TryComposeSimple()
1916 var container = CreateCompositionContainer();
1917 Int32Importer importer = new Int32Importer();
1919 CompositionBatch batch = new CompositionBatch();
1920 batch.AddParts(importer, new Int32Exporter(42));
1921 container.Compose(batch);
1923 Assert.AreEqual(42, importer.Value, "Expected value imported from export");
1926 [TestMethod]
1927 public void TryComposeSimpleFail()
1929 var container = CreateCompositionContainer();
1930 Int32Importer importer = new Int32Importer();
1932 CompositionBatch batch = new CompositionBatch();
1933 batch.AddParts(importer);
1935 CompositionAssert.ThrowsChangeRejectedError(ErrorId.ImportEngine_PartCannotSetImport, ErrorId.ImportEngine_ImportCardinalityMismatch, RetryMode.DoNotRetry, () =>
1937 container.Compose(batch);
1940 Assert.AreEqual(0, importer.Value, "Expected default value to remain");
1943 [TestMethod]
1944 public void ComposeDisposableChildContainer()
1946 var outerContainer = CreateCompositionContainer();
1947 Int32Importer outerImporter = new Int32Importer();
1949 CompositionBatch outerBatch = new CompositionBatch();
1950 var key = outerBatch.AddExportedValue("Value", 42);
1951 outerBatch.AddPart(outerImporter);
1952 outerContainer.Compose(outerBatch);
1953 Assert.AreEqual(42, outerImporter.Value, "Expected value imported from export");
1955 Int32Importer innerImporter = new Int32Importer();
1956 var innerContainer = new CompositionContainer(outerContainer);
1957 CompositionBatch innerBatch = new CompositionBatch();
1958 innerBatch.AddPart(innerImporter);
1960 innerContainer.Compose(innerBatch);
1961 Assert.AreEqual(42, innerImporter.Value, "Expected value imported from export");
1962 Assert.AreEqual(42, outerImporter.Value, "Expected value imported from export");
1964 outerBatch = new CompositionBatch();
1965 outerBatch.RemovePart(key);
1966 key = outerBatch.AddExportedValue("Value", -5);
1967 outerContainer.Compose(outerBatch);
1968 Assert.AreEqual(-5, innerImporter.Value, "Expected update value imported from export");
1969 Assert.AreEqual(-5, outerImporter.Value, "Expected updated value imported from export");
1971 innerContainer.Dispose();
1972 outerBatch = new CompositionBatch();
1973 outerBatch.RemovePart(key);
1974 key = outerBatch.AddExportedValue("Value", 500);
1975 outerContainer.Compose(outerBatch);
1976 Assert.AreEqual(500, outerImporter.Value, "Expected updated value imported from export");
1977 Assert.AreEqual(-5, innerImporter.Value, "Expected value not updated");
1980 [TestMethod]
1981 public void RemoveValueTest()
1983 var container = CreateCompositionContainer();
1984 CompositionBatch batch = new CompositionBatch();
1986 var key = batch.AddExportedValue("foo", "hello");
1987 container.Compose(batch);
1988 var result = container.GetExportedValue<string>("foo");
1989 Assert.AreEqual("hello", result, "Should get the correct value");
1991 batch = new CompositionBatch();
1992 batch.RemovePart(key);
1993 container.Compose(batch);
1995 Assert.IsFalse(container.IsPresent("foo"));
1997 batch = new CompositionBatch();
1998 batch.RemovePart(key); // Remove should be idempotent
1999 container.Compose(batch);
2002 [TestMethod]
2003 [TestProperty("Type", "Integration")]
2004 public void OptionalImportsOfValueTypeBoundToDefaultValueShouldNotAffectAvailableValues()
2006 var container = CreateCompositionContainer();
2007 var importer = new OptionalImporter();
2009 CompositionBatch batch = new CompositionBatch();
2010 batch.AddPart(importer);
2011 container.Compose(batch);
2013 Assert.AreEqual(0, importer.ValueType);
2015 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
2017 container.GetExportedValue<int>("ValueType");
2021 [TestMethod]
2022 [TestProperty("Type", "Integration")]
2023 public void OptionalImportsOfNullableValueTypeBoundToDefaultValueShouldNotAffectAvailableValues()
2025 var container = CreateCompositionContainer();
2026 var importer = new OptionalImporter();
2028 CompositionBatch batch = new CompositionBatch();
2029 batch.AddPart(importer);
2030 container.Compose(batch);
2032 Assert.IsNull(importer.NullableValueType);
2034 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
2036 container.GetExportedValue<int>("NullableValueType");
2040 [TestMethod]
2041 [TestProperty("Type", "Integration")]
2042 public void OptionalImportsOfReferenceTypeBoundToDefaultValueShouldNotAffectAvailableValues()
2044 var container = CreateCompositionContainer();
2045 var importer = new OptionalImporter();
2047 CompositionBatch batch = new CompositionBatch();
2048 batch.AddPart(importer);
2049 container.Compose(batch);
2051 Assert.IsNull(importer.ReferenceType);
2053 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
2055 container.GetExportedValue<int>("ReferenceType");
2056 });
2059 [TestMethod]
2060 public void ExportsChanged_ExportNothing_ShouldNotFireExportsChanged()
2062 var container = CreateCompositionContainer();
2064 container.ExportsChanged += (sender, args) =>
2066 Assert.Fail("Event should not be fired!");
2069 CompositionBatch batch = new CompositionBatch();
2070 container.Compose(batch);
2073 [TestMethod]
2074 public void ExportsChanged_ExportAdded_ShouldFireExportsChanged()
2076 var container = CreateCompositionContainer();
2077 IEnumerable<string> changedNames = null;
2079 container.ExportsChanged += (sender, args) =>
2081 Assert.AreSame(container, sender);
2082 Assert.IsNull(changedNames, "Ensure this event only fires once!");
2083 Assert.IsNotNull(args.AddedExports);
2084 Assert.IsNotNull(args.RemovedExports);
2085 Assert.IsNotNull(args.ChangedContractNames);
2086 changedNames = args.ChangedContractNames;
2089 CompositionBatch batch = new CompositionBatch();
2090 batch.AddExportedValue("MyExport", new object());
2091 container.Compose(batch);
2093 EnumerableAssert.AreEqual(changedNames, "MyExport");
2096 [TestMethod]
2097 public void ExportsChanged_ExportRemoved_ShouldFireExportsChanged()
2099 var container = CreateCompositionContainer();
2100 IEnumerable<string> changedNames = null;
2102 CompositionBatch batch = new CompositionBatch();
2103 var part = batch.AddExportedValue("MyExport", new object());
2104 container.Compose(batch);
2106 container.ExportsChanged += (sender, args) =>
2108 Assert.AreSame(container, sender);
2109 Assert.IsNull(changedNames, "Ensure this event only fires once!");
2110 Assert.IsNotNull(args.AddedExports);
2111 Assert.IsNotNull(args.RemovedExports);
2112 Assert.IsNotNull(args.ChangedContractNames);
2113 changedNames = args.ChangedContractNames;
2116 batch = new CompositionBatch();
2117 batch.RemovePart(part);
2118 container.Compose(batch);
2120 EnumerableAssert.AreEqual(changedNames, "MyExport");
2123 [TestMethod]
2124 public void ExportsChanged_ExportAddAnother_ShouldFireExportsChanged()
2126 var container = CreateCompositionContainer();
2127 IEnumerable<string> changedNames = null;
2129 CompositionBatch batch = new CompositionBatch();
2130 batch.AddExportedValue("MyExport", new object());
2131 container.Compose(batch);
2133 container.ExportsChanged += (sender, args) =>
2135 Assert.AreSame(container, sender);
2136 Assert.IsNull(changedNames, "Ensure this event only fires once!");
2137 Assert.IsNotNull(args.AddedExports);
2138 Assert.IsNotNull(args.RemovedExports);
2139 Assert.IsNotNull(args.ChangedContractNames);
2140 changedNames = args.ChangedContractNames;
2143 batch = new CompositionBatch();
2144 // Adding another should cause an update.
2145 batch.AddExportedValue("MyExport", new object());
2146 container.Compose(batch);
2149 EnumerableAssert.AreEqual(changedNames, "MyExport");
2152 [TestMethod]
2153 public void ExportsChanged_AddExportOnParent_ShouldFireExportsChangedOnBoth()
2155 var parent = CreateCompositionContainer();
2156 var child = new CompositionContainer(parent);
2158 IEnumerable<string> parentNames = null;
2159 parent.ExportsChanged += (sender, args) =>
2161 Assert.AreSame(parent, sender);
2162 parentNames = args.ChangedContractNames;
2165 IEnumerable<string> childNames = null;
2166 child.ExportsChanged += (sender, args) =>
2168 Assert.AreSame(child, sender);
2169 childNames = args.ChangedContractNames;
2172 CompositionBatch batch = new CompositionBatch();
2173 batch.AddExportedValue("MyExport", new object());
2174 parent.Compose(batch);
2176 EnumerableAssert.AreEqual(parentNames, "MyExport");
2177 EnumerableAssert.AreEqual(childNames, "MyExport");
2181 [TestMethod]
2182 public void ExportsChanged_AddExportOnChild_ShouldFireExportsChangedOnChildOnly()
2184 var parent = CreateCompositionContainer();
2185 var child = new CompositionContainer(parent);
2187 parent.ExportsChanged += (sender, args) =>
2189 Assert.Fail("Should not fire on parent container!!");
2192 IEnumerable<string> childNames = null;
2193 child.ExportsChanged += (sender, args) =>
2195 Assert.AreSame(child, sender);
2196 childNames = args.ChangedContractNames;
2199 CompositionBatch batch = new CompositionBatch();
2200 batch.AddExportedValue("MyExport2", new object());
2201 child.Compose(batch);
2203 EnumerableAssert.AreEqual(childNames, "MyExport2");
2207 [TestMethod]
2208 public void Dispose_BeforeCompose_CanBeCallMultipleTimes()
2210 var container = ContainerFactory.Create(PartFactory.Create(), PartFactory.Create());
2211 container.Dispose();
2212 container.Dispose();
2213 container.Dispose();
2216 [TestMethod]
2217 public void Dispose_AfterCompose_CanBeCallMultipleTimes()
2219 var container = ContainerFactory.Create(PartFactory.Create(), PartFactory.Create());
2220 container.Dispose();
2221 container.Dispose();
2222 container.Dispose();
2225 [TestMethod]
2226 public void Dispose_CallsGCSuppressFinalize()
2228 bool finalizerCalled = false;
2230 var container = ContainerFactory.CreateDisposable(disposing =>
2232 if (!disposing)
2234 finalizerCalled = true;
2239 container.Dispose();
2241 GC.Collect();
2242 GC.WaitForPendingFinalizers();
2243 GC.Collect();
2245 Assert.IsFalse(finalizerCalled);
2248 [TestMethod]
2249 public void Dispose_CallsDisposeBoolWithTrue()
2251 var container = ContainerFactory.CreateDisposable(disposing =>
2253 Assert.IsTrue(disposing);
2256 container.Dispose();
2259 [TestMethod]
2260 public void Dispose_CallsDisposeBoolOnce()
2262 int disposeCount = 0;
2264 var container = ContainerFactory.CreateDisposable(disposing =>
2266 disposeCount++;
2269 container.Dispose();
2271 Assert.AreEqual(1, disposeCount);
2274 [TestMethod]
2275 public void Dispose_ContainerAsExportedValue_CanBeDisposed()
2277 using (var container = CreateCompositionContainer())
2279 CompositionBatch batch = new CompositionBatch();
2280 batch.AddExportedValue<ICompositionService>(container);
2281 container.Compose(batch);
2285 [TestMethod]
2286 public void Dispose_ContainerAsPart_CanBeDisposed()
2287 { // Tests that when we re-enter CompositionContainer.Dispose, that we don't
2288 // stack overflow.
2290 using (var container = CreateCompositionContainer())
2292 var part = PartFactory.CreateExporter(new MicroExport(typeof(ICompositionService), container));
2293 CompositionBatch batch = new CompositionBatch();
2294 batch.AddPart(part);
2295 container.Compose(batch);
2297 Assert.AreSame(container, container.GetExportedValue<ICompositionService>());
2301 [TestMethod]
2302 public void ICompositionService_ShouldNotBeImplicitlyExported()
2304 var container = CreateCompositionContainer();
2306 Assert.IsFalse(container.IsPresent<ICompositionService>());
2309 [TestMethod]
2310 public void CompositionContainer_ShouldNotBeImplicitlyExported()
2312 var container = CreateCompositionContainer();
2314 Assert.IsFalse(container.IsPresent<CompositionContainer>());
2317 [TestMethod]
2318 public void ICompositionService_ShouldNotBeImplicitlyImported()
2320 var importer = PartFactory.CreateImporter<ICompositionService>();
2321 var container = ContainerFactory.Create(importer);
2323 Assert.IsNull(importer.Value);
2326 [TestMethod]
2327 public void CompositionContainer_ShouldNotBeImplicitlyImported()
2329 var importer = PartFactory.CreateImporter<CompositionContainer>();
2330 var container = ContainerFactory.Create(importer);
2332 Assert.IsNull(importer.Value);
2335 [TestMethod]
2336 public void ICompositionService_CanBeExported()
2338 var container = CreateCompositionContainer();
2339 CompositionBatch batch = new CompositionBatch();
2340 batch.AddExportedValue<ICompositionService>(container);
2341 container.Compose(batch);
2343 Assert.AreSame(container, container.GetExportedValue<ICompositionService>());
2346 [TestMethod]
2347 public void CompositionContainer_CanBeExported()
2349 var container = CreateCompositionContainer();
2350 CompositionBatch batch = new CompositionBatch();
2351 batch.AddExportedValue<CompositionContainer>(container);
2352 container.Compose(batch);
2354 Assert.AreSame(container, container.GetExportedValue<CompositionContainer>());
2357 [TestMethod]
2358 public void ReleaseExport_Null_ShouldThrowArugmentNull()
2360 var container = CreateCompositionContainer();
2362 ExceptionAssert.ThrowsArgument<ArgumentNullException>("export",
2363 () => container.ReleaseExport(null));
2366 [TestMethod]
2367 public void ReleaseExports_Null_ShouldThrowArgumentNull()
2369 var container = CreateCompositionContainer();
2371 ExceptionAssert.ThrowsArgument<ArgumentNullException>("exports",
2372 () => container.ReleaseExports(null));
2375 [TestMethod]
2376 public void ReleaseExports_ElementNull_ShouldThrowArgument()
2378 var container = CreateCompositionContainer();
2380 ExceptionAssert.ThrowsArgument<ArgumentException>("exports",
2381 () => container.ReleaseExports(new Export[] { null }));
2384 public class OptionalImporter
2386 [Import("ValueType", AllowDefault = true)]
2387 public int ValueType
2389 get;
2390 set;
2393 [Import("NullableValueType", AllowDefault = true)]
2394 public int? NullableValueType
2396 get;
2397 set;
2400 [Import("ReferenceType", AllowDefault = true)]
2401 public string ReferenceType
2403 get;
2404 set;
2408 public class ExportSimpleIntWithException
2410 [Export("SimpleInt")]
2411 public int SimpleInt { get { throw new NotImplementedException(); } }
2414 [TestMethod]
2415 public void TryGetValueWithCatalogVerifyExecptionDuringGet()
2417 var cat = CatalogFactory.CreateDefaultAttributed();
2418 var container = new CompositionContainer(cat);
2420 CompositionAssert.ThrowsError(ErrorId.ImportEngine_PartCannotGetExportedValue, ErrorId.ReflectionModel_ExportThrewException, () =>
2422 container.GetExportedValue<int>("SimpleInt");
2426 [TestMethod]
2427 public void TryGetExportedValueWhileLockedForNotify()
2429 var container = CreateCompositionContainer();
2430 CompositionBatch batch = new CompositionBatch();
2431 batch.AddParts(new CallbackImportNotify(delegate
2433 container.GetExportedValueOrDefault<int>();
2434 }));
2436 container.Compose(batch);
2439 [TestMethod]
2440 public void RawExportTests()
2442 var container = CreateCompositionContainer();
2444 CompositionBatch batch = new CompositionBatch();
2445 batch.AddExportedValue("foo", 1);
2446 container.Compose(batch);
2448 Lazy<int> export = container.GetExport<int>("foo");
2450 Assert.AreEqual(1, export.Value, "Should be the value I put in...");
2453 [TestMethod]
2454 [Ignore]
2455 [WorkItem(468388)]
2456 public void ContainerXGetXTest()
2458 CompositionContainer container = CreateCompositionContainer();
2459 CompositionBatch batch = new CompositionBatch();
2460 batch.AddPart(new MyExporterWithNoFoo());
2461 container.Compose(batch);
2462 ContainerXGetExportBoundValue(container);
2465 [TestMethod]
2466 [Ignore]
2467 [WorkItem(468388)]
2468 public void ContainerXGetXByComponentCatalogTest()
2470 CompositionContainer container = ContainerFactory.CreateWithDefaultAttributedCatalog();
2471 ContainerXGetExportBoundValue(container);
2474 private void ContainerXGetExportBoundValue(CompositionContainer container)
2476 Assert.Fail("This scenario (required metadata warnings) no longer works, see 468388");
2478 //string[] required = new string[] { "Foo" };
2479 //string[] RequiredMetadataNotFound = new string[] { CompositionIssueId.RequiredMetadataNotFound, CompositionIssueId.CardinalityMismatch };
2480 //container.TryGetExport<MyExporterWithNoFoo>().VerifyFailure(CompositionIssueId.CardinalityMismatch);
2481 //container.TryGetExport<MyExporterWithNoFoo>(required).VerifyFailure(CompositionIssueId.CardinalityMismatch);
2482 //container.TryGetExport<MyExporterWithNoFoo>("MyExporterWithNoFoo").VerifySuccess();
2483 //container.TryGetExport<MyExporterWithNoFoo>("MyExporterWithNoFoo", required).VerifyFailure(RequiredMetadataNotFound);
2484 //container.TryGetExports<MyExporterWithNoFoo>().VerifyFailure(CompositionIssueId.CardinalityMismatch);
2485 //container.TryGetExports<MyExporterWithNoFoo>(required).VerifyFailure(CompositionIssueId.CardinalityMismatch);
2486 //container.TryGetExports<MyExporterWithNoFoo>("MyExporterWithNoFoo").VerifySuccess();
2487 //container.TryGetExports<MyExporterWithNoFoo>("MyExporterWithNoFoo", required).VerifyFailure(RequiredMetadataNotFound);
2488 //container.TryGetExportedValue<MyExporterWithNoFoo>().VerifyFailure(CompositionIssueId.CardinalityMismatch);
2489 //container.TryGetExportedValue<MyExporterWithNoFoo>(required).VerifyFailure(CompositionIssueId.CardinalityMismatch);
2490 //container.TryGetExportedValue<MyExporterWithNoFoo>("MyExporterWithNoFoo").VerifySuccess();
2491 //container.TryGetExportedValue<MyExporterWithNoFoo>("MyExporterWithNoFoo", required).VerifyFailure(RequiredMetadataNotFound);
2492 //container.TryGetExportedValues<MyExporterWithNoFoo>().VerifyFailure(CompositionIssueId.CardinalityMismatch);
2493 //container.TryGetExportedValues<MyExporterWithNoFoo>(required).VerifyFailure(CompositionIssueId.CardinalityMismatch);
2494 //container.TryGetExportedValues<MyExporterWithNoFoo>("MyExporterWithNoFoo").VerifySuccess();
2495 //container.TryGetExportedValues<MyExporterWithNoFoo>("MyExporterWithNoFoo", required).VerifyFailure(RequiredMetadataNotFound);
2497 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() => container.GetExportedValue<MyExporterWithNoFoo>());
2498 Assert.IsNotNull(container.GetExportedValue<MyExporterWithNoFoo>("MyExporterWithNoFoo"));
2501 [Export("MyExporterWithNoFoo")]
2502 public class MyExporterWithNoFoo
2506 [Export("MyExporterWithFoo")]
2507 [ExportMetadata("Foo", "Foo value")]
2508 public class MyExporterWithFoo
2512 [Export("MyExporterWithFooBar")]
2513 [ExportMetadata("Foo", "Foo value")]
2514 [ExportMetadata("Bar", "Bar value")]
2515 public class MyExporterWithFooBar
2519 #if !SILVERLIGHT
2520 // Silverlight doesn't support strongly typed metadata
2521 [TestMethod]
2522 public void ConverterExportTests()
2524 var container = CreateCompositionContainer();
2525 CompositionBatch batch = new CompositionBatch();
2526 batch.AddExportedValue("foo", 1);
2527 container.Compose(batch);
2529 var export = container.GetExport<int, IDictionary<string, object>>("foo");
2530 Assert.AreEqual(1, export.Value, "Should be the value I put in...");
2531 Assert.IsNotNull(export.Metadata, "Should have metadata (as an object)");
2534 #endif //!SILVERLIGHT
2536 [TestMethod]
2537 public void RemoveFromWrongContainerTest()
2539 CompositionContainer d1 = CreateCompositionContainer();
2540 CompositionContainer d2 = CreateCompositionContainer();
2542 CompositionBatch batch1 = new CompositionBatch();
2543 var valueKey = batch1.AddExportedValue("a", 1);
2544 d1.Compose(batch1);
2546 CompositionBatch batch2 = new CompositionBatch();
2547 batch2.RemovePart(valueKey);
2548 // removing entry from wrong container, shoudl be a no-op
2549 d2.Compose(batch2);
2552 [TestMethod]
2553 [TestProperty("Type", "Integration")]
2554 public void AddPartSimple()
2556 var container = CreateCompositionContainer();
2557 var importer = new Int32Importer();
2558 CompositionBatch batch = new CompositionBatch();
2559 batch.AddPart(importer);
2560 batch.AddPart(new Int32Exporter(42));
2561 container.Compose(batch);
2563 Assert.AreEqual(42, importer.Value, "Expected value imported from export");
2566 [TestMethod]
2567 [TestProperty("Type", "Integration")]
2568 public void AddPart()
2570 var container = CreateCompositionContainer();
2571 Int32Importer importer = new Int32Importer();
2572 CompositionBatch batch = new CompositionBatch();
2573 batch.AddPart(AttributedModelServices.CreatePart(importer));
2574 batch.AddPart(new Int32Exporter(42));
2575 container.Compose(batch);
2577 Assert.AreEqual(42, importer.Value, "Expected value imported from export");
2580 [TestMethod]
2581 public void ComposeReentrantChildContainerDisposed()
2583 var container = CreateCompositionContainer();
2584 Int32Importer outerImporter = new Int32Importer();
2585 Int32Importer innerImporter = new Int32Importer();
2586 Int32Exporter exporter = new Int32Exporter(42);
2587 CompositionBatch batch = new CompositionBatch();
2588 batch.AddPart(exporter);
2589 container.Compose(batch);
2590 CallbackExecuteCodeDuringCompose callback = new CallbackExecuteCodeDuringCompose(() =>
2592 using (CompositionContainer innerContainer = new CompositionContainer(container))
2594 CompositionBatch nestedBatch = new CompositionBatch();
2595 nestedBatch.AddPart(innerImporter);
2596 innerContainer.Compose(nestedBatch);
2598 Assert.AreEqual(42, innerImporter.Value, "Expected value imported from export");
2601 batch = new CompositionBatch();
2602 batch.AddParts(outerImporter, callback);
2603 container.Compose(batch);
2605 Assert.AreEqual(42, outerImporter.Value, "Expected value imported from export");
2606 Assert.AreEqual(42, innerImporter.Value, "Expected value imported from export");
2609 [TestMethod]
2610 public void ComposeSimple()
2612 var container = CreateCompositionContainer();
2613 Int32Importer importer = new Int32Importer();
2615 CompositionBatch batch = new CompositionBatch();
2616 batch.AddParts(importer, new Int32Exporter(42));
2617 container.Compose(batch);
2619 Assert.AreEqual(42, importer.Value, "Expected value imported from export");
2622 [TestMethod]
2623 public void ComposeSimpleFail()
2625 var container = CreateCompositionContainer();
2626 Int32Importer importer = new Int32Importer();
2628 CompositionBatch batch = new CompositionBatch();
2629 batch.AddPart(importer);
2631 CompositionAssert.ThrowsChangeRejectedError(ErrorId.ImportEngine_PartCannotSetImport, // Cannot set Int32Importer.Value because
2632 ErrorId.ImportEngine_ImportCardinalityMismatch, // No exports are present that match contract
2633 RetryMode.DoNotRetry, () =>
2635 container.Compose(batch);
2639 [TestMethod]
2640 public void ExceptionDuringNotify()
2642 var container = CreateCompositionContainer();
2643 CompositionBatch batch = new CompositionBatch();
2644 batch.AddParts(new CallbackImportNotify(delegate
2646 throw new InvalidOperationException();
2647 }));
2649 CompositionAssert.ThrowsError(ErrorId.ImportEngine_PartCannotActivate, // Cannot activate CallbackImportNotify because
2650 ErrorId.ReflectionModel_PartOnImportsSatisfiedThrewException, // OnImportsSatisfied threw an exception
2651 RetryMode.DoNotRetry, () =>
2653 container.Compose(batch);
2657 [TestMethod]
2658 public void NeutralComposeWhileNotified()
2660 var container = CreateCompositionContainer();
2661 CompositionBatch batch = new CompositionBatch();
2662 batch.AddParts(new CallbackImportNotify(delegate
2664 // Is this really a supported scenario?
2665 container.Compose(batch);
2666 }));
2668 container.Compose(batch);
2670 public class PartWithReentrantCompose : ComposablePart
2672 private CompositionContainer _container;
2674 public PartWithReentrantCompose(CompositionContainer container)
2676 this._container = container;
2679 public override IEnumerable<ExportDefinition> ExportDefinitions
2683 this._container.ComposeExportedValue<string>("ExportedString");
2684 return Enumerable.Empty<ExportDefinition>();
2688 public override IEnumerable<ImportDefinition> ImportDefinitions
2692 return Enumerable.Empty<ImportDefinition>();
2696 public override object GetExportedValue(ExportDefinition definition)
2698 throw new NotImplementedException();
2701 public override void SetImport(ImportDefinition definition, IEnumerable<Export> exports)
2703 throw new NotImplementedException();
2707 [Export]
2708 public class SimpleExporter
2713 [TestMethod]
2714 public void ThreadSafeCompositionContainer()
2716 TypeCatalog catalog = new TypeCatalog(typeof(SimpleExporter));
2718 CompositionContainer container = new CompositionContainer(catalog, true);
2719 Int32Importer importer = new Int32Importer();
2721 CompositionBatch batch = new CompositionBatch();
2722 batch.AddParts(importer, new Int32Exporter(42));
2723 container.Compose(batch);
2725 Assert.IsNotNull(container.GetExportedValue<SimpleExporter>());
2726 Assert.AreEqual(42, importer.Value, "Expected value imported from export");
2728 container.Dispose();
2732 [TestMethod]
2733 public void ReentrantencyDisabledWhileComposing()
2735 var container = CreateCompositionContainer();
2736 CompositionBatch batch = new CompositionBatch();
2738 batch.AddPart(new PartWithReentrantCompose(container));
2740 ExceptionAssert.Throws<InvalidOperationException>(() =>
2741 container.Compose(batch));
2743 private static Expression<Func<ExportDefinition, bool>> ConstraintFromContract(string contractName)
2745 return ConstraintFactory.Create(contractName);
2748 private static string ContractFromType(Type type)
2750 return AttributedModelServices.GetContractName(type);
2753 private static CompositionContainer CreateCompositionContainer()
2755 return new CompositionContainer();
2758 public interface IMetadataView
2760 string Metadata1
2762 get;
2765 string Metadata2
2767 get;
2770 string Metadata3
2772 get;
2776 [TestMethod]
2777 public void ComposeExportedValueOfT_NullStringAsExportedValueArgument_VerifyCanPullOnValue()
2779 var container = CreateCompositionContainer();
2781 var expectation = (string)null;
2782 container.ComposeExportedValue<string>(expectation);
2783 var actualValue = container.GetExportedValue<string>();
2785 Assert.AreEqual(expectation, actualValue);
2788 [TestMethod]
2789 public void ComposeExportedValueOfT_StringAsExportedValueArgument_VerifyCanPullOnValue()
2791 var expectations = new List<string>();
2792 expectations.Add((string)null);
2793 expectations.Add(String.Empty);
2794 expectations.Add("Value");
2796 foreach (var expectation in expectations)
2798 var container = CreateCompositionContainer();
2799 container.ComposeExportedValue<string>(expectation);
2800 var actualValue = container.GetExportedValue<string>();
2802 Assert.AreEqual(expectation, actualValue);
2806 [TestMethod]
2807 public void ComposeExportedValueOfT_StringAsIEnumerableOfCharAsExportedValueArgument_VerifyCanPullOnValue()
2809 var expectations = new List<string>();
2810 expectations.Add((string)null);
2811 expectations.Add(String.Empty);
2812 expectations.Add("Value");
2814 foreach (var expectation in expectations)
2816 var container = CreateCompositionContainer();
2817 container.ComposeExportedValue<IEnumerable<char>>(expectation);
2818 var actualValue = container.GetExportedValue<IEnumerable<char>>();
2820 Assert.AreEqual(expectation, actualValue);
2824 [TestMethod]
2825 public void ComposeExportedValueOfT_ObjectAsExportedValueArgument_VerifyCanPullOnValue()
2827 var expectations = new List<object>();
2828 expectations.Add((string)null);
2829 expectations.Add(String.Empty);
2830 expectations.Add("Value");
2831 expectations.Add(42);
2832 expectations.Add(new object());
2834 foreach (var expectation in expectations)
2836 var container = CreateCompositionContainer();
2837 container.ComposeExportedValue<object>(expectation);
2838 var actualValue = container.GetExportedValue<object>();
2840 Assert.AreEqual(expectation, actualValue);
2844 [TestMethod]
2845 public void ComposeExportedValueOfT_ExportedValue_ExportedUnderDefaultContractName()
2847 string expectedContractName = AttributedModelServices.GetContractName(typeof(string));
2848 var container = CreateCompositionContainer();
2849 container.ComposeExportedValue<string>("Value");
2851 var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
2852 var exports = container.GetExports(importDefinition);
2853 Assert.AreEqual(1, exports.Count());
2854 Assert.AreEqual(expectedContractName, exports.Single().Definition.ContractName);
2857 [TestMethod]
2858 public void ComposeExportedValueOfT_ExportedValue_ExportContainsEmptyMetadata()
2860 var container = CreateCompositionContainer();
2861 container.ComposeExportedValue<string>("Value");
2863 var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
2864 var exports = container.GetExports(importDefinition);
2865 Assert.AreEqual(1, exports.Count());
2866 Assert.AreEqual(1, exports.Single().Metadata.Count); // contains type identity
2869 [TestMethod]
2870 public void ComposeExportedValueOfT_ExportedValue_LazyContainsEmptyMetadata()
2872 var container = CreateCompositionContainer();
2873 container.ComposeExportedValue<string>("Value");
2875 var lazy = container.GetExport<string, IDictionary<string, object>>();
2876 Assert.AreEqual(1, lazy.Metadata.Count); // contains type identity
2879 [TestMethod]
2880 public void ComposeExportedValueOfT_ExportedValue_ImportsAreNotDiscovered()
2882 var container = CreateCompositionContainer();
2883 var importer = new PartWithRequiredImport();
2885 container.ComposeExportedValue<object>(importer);
2887 var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
2888 var exports = container.GetExports(importDefinition);
2889 Assert.AreEqual(1, exports.Count()); // we only get one if the import was not discovered since the import is not satisfied
2892 [TestMethod]
2893 public void ComposeExportedValueOfT_NullAsContractName_ThrowsArgumentNullException()
2895 var container = CreateCompositionContainer();
2896 ExceptionAssert.ThrowsArgument<ArgumentNullException>("contractName", () =>
2897 container.ComposeExportedValue<string>((string)null, "Value"));
2900 [TestMethod]
2901 public void ComposeExportedValueOfT_EmptyStringAsContractName_ThrowsArgumentException()
2903 var container = CreateCompositionContainer();
2904 ExceptionAssert.ThrowsArgument<ArgumentException>("contractName", () =>
2905 container.ComposeExportedValue<string>(String.Empty, "Value"));
2908 [TestMethod]
2909 public void ComposeExportedValueOfT_ValidContractName_ValidExportedValue_VerifyCanPullOnValue()
2911 var expectations = new List<Tuple<string, string>>();
2912 expectations.Add(new Tuple<string, string>(" ", (string)null));
2913 expectations.Add(new Tuple<string, string>(" ", String.Empty));
2914 expectations.Add(new Tuple<string, string>(" ", "Value"));
2915 expectations.Add(new Tuple<string, string>("ContractName", (string)null));
2916 expectations.Add(new Tuple<string, string>("ContractName", String.Empty));
2917 expectations.Add(new Tuple<string, string>("ContractName", "Value"));
2919 foreach (var expectation in expectations)
2921 var container = CreateCompositionContainer();
2922 container.ComposeExportedValue<string>(expectation.Item1, expectation.Item2);
2923 var actualValue = container.GetExportedValue<string>(expectation.Item1);
2925 Assert.AreEqual(expectation.Item2, actualValue);
2927 ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
2928 container.GetExportedValue<string>());
2932 [TestMethod]
2933 public void ComposeExportedValueOfT_ValidContractName_ExportedValue_ExportedUnderSpecifiedContractName()
2935 string expectedContractName = "ContractName";
2936 var container = CreateCompositionContainer();
2937 container.ComposeExportedValue<string>(expectedContractName, "Value");
2939 var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
2940 var exports = container.GetExports(importDefinition);
2941 Assert.AreEqual(1, exports.Count());
2942 Assert.AreEqual(expectedContractName, exports.Single().Definition.ContractName);
2945 [TestMethod]
2946 [Ignore]
2947 [WorkItem(812029)]
2948 public void ComposeExportedValueOfT_ValidContractName_ExportedValue_ExportContainsEmptyMetadata()
2950 string expectedContractName = "ContractName";
2951 var container = CreateCompositionContainer();
2952 container.ComposeExportedValue<string>(expectedContractName, "Value");
2954 var importDefinition = new ImportDefinition(ed => ed.ContractName == expectedContractName, null, ImportCardinality.ZeroOrMore, false, false);
2955 var exports = container.GetExports(importDefinition);
2956 Assert.AreEqual(1, exports.Count());
2957 Assert.AreEqual(1, exports.Single().Metadata.Count); // contains type identity
2960 [TestMethod]
2961 public void ComposeExportedValueOfT_ValidContractName_ExportedValue_ImportsAreNotDiscovered()
2963 var container = CreateCompositionContainer();
2964 var importer = new PartWithRequiredImport();
2966 container.ComposeExportedValue<object>("ContractName", importer);
2968 var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
2969 var exports = container.GetExports(importDefinition);
2970 Assert.AreEqual(1, exports.Count()); // we only get one if the import was not discovered since the import is not satisfied
2973 [TestMethod]
2974 public void TestExportedValueCachesNullValue()
2976 var container = ContainerFactory.Create();
2977 var exporter = new ExportsMutableProperty();
2978 exporter.Property = null;
2979 container.ComposeParts(exporter);
2980 Assert.IsNull(container.GetExportedValue<string>("Property"));
2981 exporter.Property = "Value1";
2982 // Exported value should have been cached and so it shouldn't change
2983 Assert.IsNull(container.GetExportedValue<string>("Property"));
2985 public class ExportsMutableProperty
2987 [Export("Property")]
2988 public string Property { get; set; }
2992 public class PartWithRequiredImport
2994 [Import]
2995 public object Import { get; set; }