1 // -----------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 // -----------------------------------------------------------------------
5 using System
.Collections
.Generic
;
6 using System
.ComponentModel
.Composition
;
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
21 public class CompositionContainerTests
24 public void Constructor2_ArrayWithNullElementAsProvidersArgument_ShouldThrowArgumentException()
26 ExceptionAssert
.ThrowsArgument
<ArgumentException
>("providers", () =>
28 new CompositionContainer(new ExportProvider
[] { null }
);
33 public void Constructor3_ArrayWithNullElementAsProvidersArgument_ShouldThrowArgumentException()
35 var catalog
= CatalogFactory
.Create();
37 ExceptionAssert
.ThrowsArgument
<ArgumentException
>("providers", () =>
39 new CompositionContainer(catalog
, new ExportProvider
[] { null }
);
44 public void Constructor2_ArrayAsProvidersArgument_ShouldNotAllowModificationAfterConstruction()
46 var providers
= new ExportProvider
[] { ExportProviderFactory.Create() }
;
47 var container
= new CompositionContainer(providers
);
51 Assert
.IsNotNull(container
.Providers
[0]);
55 public void Constructor3_ArrayAsProvidersArgument_ShouldNotAllowModificationAfterConstruction()
57 var providers
= new ExportProvider
[] { ExportProviderFactory.Create() }
;
58 var container
= new CompositionContainer(CatalogFactory
.Create(), providers
);
62 Assert
.IsNotNull(container
.Providers
[0]);
66 public void Constructor1_ShouldSetProvidersPropertyToEmptyCollection()
68 var container
= new CompositionContainer();
70 EnumerableAssert
.IsEmpty(container
.Providers
);
74 public void Constructor2_EmptyArrayAsProvidersArgument_ShouldSetProvidersPropertyToEmpty()
76 var container
= new CompositionContainer(new ExportProvider
[0]);
78 EnumerableAssert
.IsEmpty(container
.Providers
);
82 public void Constructor3_EmptyArrayAsProvidersArgument_ShouldSetProvidersPropertyToEmpty()
84 var container
= new CompositionContainer(CatalogFactory
.Create(), new ExportProvider
[0]);
86 EnumerableAssert
.IsEmpty(container
.Providers
);
90 public void Constructor1_ShouldSetCatalogPropertyToNull()
92 var container
= new CompositionContainer();
94 Assert
.IsNull(container
.Catalog
);
98 public void Constructor2_ShouldSetCatalogPropertyToNull()
100 var container
= new CompositionContainer(new ExportProvider
[0]);
102 Assert
.IsNull(container
.Catalog
);
106 public void Constructor3_NullAsCatalogArgument_ShouldSetCatalogPropertyToNull()
108 var container
= new CompositionContainer((ComposablePartCatalog
)null, new ExportProvider
[0]);
110 Assert
.IsNull(container
.Catalog
);
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
);
127 public void Catalog_WhenDisposed_ShouldThrowObjectDisposed()
129 var container
= CreateCompositionContainer();
132 ExceptionAssert
.ThrowsDisposed(container
, () =>
134 var catalog
= container
.Catalog
;
139 public void Providers_WhenDisposed_ShouldThrowObjectDisposed()
141 var container
= CreateCompositionContainer();
144 ExceptionAssert
.ThrowsDisposed(container
, () =>
146 var providers
= container
.Providers
;
152 [WorkItem(579990)] // NullReferenceException
153 public void ExportsChanged_Add_WhenDisposed_ShouldThrowObjectDisposed()
155 var container
= CreateCompositionContainer();
158 ExceptionAssert
.ThrowsDisposed(container
, () =>
160 container
.ExportsChanged
+= (o
, s
) => { }
;
166 [WorkItem(579990)] // NullReferenceException
167 public void ExportsChanged_Remove_WhenDisposed_ShouldThrowObjectDisposed()
169 var container
= CreateCompositionContainer();
172 ExceptionAssert
.ThrowsDisposed(container
, () =>
174 container
.ExportsChanged
-= (o
, s
) => { }
;
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
);
193 GC
.WaitForPendingFinalizers();
195 Assert
.IsNotNull(weakRef
.Target
, "Import only part should not have been collected!");
197 GC
.KeepAlive(container
);
201 public void Compose_WhenContainerDisposed_ShouldThrowObjectDisposed()
203 var container
= CreateCompositionContainer();
206 CompositionBatch batch
= new CompositionBatch();
207 ExceptionAssert
.ThrowsDisposed(container
, () =>
209 container
.Compose(batch
);
214 public void GetExportOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
216 var container
= CreateCompositionContainer();
219 ExceptionAssert
.ThrowsDisposed(container
, () =>
221 container
.GetExport
<string>();
226 public void GetExportOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
228 var container
= CreateCompositionContainer();
231 ExceptionAssert
.ThrowsDisposed(container
, () =>
233 container
.GetExport
<string>("Contract");
238 public void GetExportOfTTMetadataView1_WhenContainerDisposed_ShouldThrowObjectDisposed()
240 var container
= CreateCompositionContainer();
243 ExceptionAssert
.ThrowsDisposed(container
, () =>
245 container
.GetExport
<string, object>();
250 public void GetExportOfTTMetadataView2_WhenContainerDisposed_ShouldThrowObjectDisposed()
252 var container
= CreateCompositionContainer();
255 ExceptionAssert
.ThrowsDisposed(container
, () =>
257 container
.GetExport
<string, object>("Contract");
262 public void GetExports1_WhenContainerDisposed_ShouldThrowObjectDisposed()
264 var container
= CreateCompositionContainer();
267 var definition
= ImportDefinitionFactory
.Create();
268 ExceptionAssert
.ThrowsDisposed(container
, () =>
270 container
.GetExports(definition
);
275 public void GetExports2_WhenContainerDisposed_ShouldThrowObjectDisposed()
277 var container
= CreateCompositionContainer();
280 ExceptionAssert
.ThrowsDisposed(container
, () =>
282 container
.GetExports(typeof(string), typeof(object), "Contract");
287 public void GetExportsOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
289 var container
= CreateCompositionContainer();
292 ExceptionAssert
.ThrowsDisposed(container
, () =>
294 container
.GetExports
<string>();
299 public void GetExportsOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
301 var container
= CreateCompositionContainer();
304 ExceptionAssert
.ThrowsDisposed(container
, () =>
306 container
.GetExports
<string>("Contract");
311 public void GetExportsOfTTMetadataView1_WhenContainerDisposed_ShouldThrowObjectDisposed()
313 var container
= CreateCompositionContainer();
316 ExceptionAssert
.ThrowsDisposed(container
, () =>
318 container
.GetExports
<string, object>();
323 public void GetExportsOfTTMetadataView2_WhenContainerDisposed_ShouldThrowObjectDisposed()
325 var container
= CreateCompositionContainer();
328 ExceptionAssert
.ThrowsDisposed(container
, () =>
330 container
.GetExports
<string, object>("Contract");
335 public void GetExportedValueOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
337 var container
= CreateCompositionContainer();
340 ExceptionAssert
.ThrowsDisposed(container
, () =>
342 container
.GetExportedValue
<string>();
348 public void GetExportedValueOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
350 var container
= CreateCompositionContainer();
353 ExceptionAssert
.ThrowsDisposed(container
, () =>
355 container
.GetExportedValue
<string>("Contract");
360 public void GetExportedValueOrDefaultOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
362 var container
= CreateCompositionContainer();
365 ExceptionAssert
.ThrowsDisposed(container
, () =>
367 container
.GetExportedValueOrDefault
<string>();
372 public void GetExportedValueOrDefaultOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
374 var container
= CreateCompositionContainer();
377 ExceptionAssert
.ThrowsDisposed(container
, () =>
379 container
.GetExportedValueOrDefault
<string>("Contract");
384 public void GetExportedValuesOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
386 var container
= CreateCompositionContainer();
389 ExceptionAssert
.ThrowsDisposed(container
, () =>
391 container
.GetExportedValues
<string>();
396 public void GetExportedValuesOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
398 var container
= CreateCompositionContainer();
401 ExceptionAssert
.ThrowsDisposed(container
, () =>
403 container
.GetExportedValues
<string>("Contract");
408 public void GetExports1_NullAsImportDefinitionArgument_ShouldThrowArgumentNull()
410 var container
= CreateCompositionContainer();
412 ExceptionAssert
.ThrowsArgument
<ArgumentNullException
>("definition", () =>
414 container
.GetExports((ImportDefinition
)null);
419 public void GetExports2_NullAsTypeArgument_ShouldThrowArgumentNull()
421 var container
= CreateCompositionContainer();
423 ExceptionAssert
.ThrowsArgument
<ArgumentNullException
>("type", () =>
425 container
.GetExports((Type
)null, typeof(string), "ContractName");
430 public void GetExportOfT1_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
432 var container
= CreateCompositionContainer();
434 ExceptionAssert
.Throws
<ImportCardinalityMismatchException
>(() =>
436 container
.GetExport
<string>();
441 public void GetExportOfT2_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
443 var container
= CreateCompositionContainer();
445 ExceptionAssert
.Throws
<ImportCardinalityMismatchException
>(() =>
447 container
.GetExport
<string>("Contract");
452 public void GetExportOfTTMetadataView1_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
454 var container
= CreateCompositionContainer();
456 ExceptionAssert
.Throws
<ImportCardinalityMismatchException
>(() =>
458 container
.GetExport
<string, object>();
463 public void GetExportOfTTMetadataView2_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
465 var container
= CreateCompositionContainer();
467 ExceptionAssert
.Throws
<ImportCardinalityMismatchException
>(() =>
469 container
.GetExport
<string, object>("Contract");
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
);
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
);
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
);
511 public void GetExports2_AskingForContractThatDoesNotExist_ShouldReturnNoExports()
513 var container
= CreateCompositionContainer();
515 var exports
= container
.GetExports(typeof(string), (Type
)null, "Contract");
517 EnumerableAssert
.IsEmpty(exports
);
521 public void GetExportsOfT1_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
523 var container
= CreateCompositionContainer();
525 var exports
= container
.GetExports
<string>();
527 EnumerableAssert
.IsEmpty(exports
);
531 public void GetExportsOfT2_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
533 var container
= CreateCompositionContainer();
535 var exports
= container
.GetExports
<string>("Contract");
537 EnumerableAssert
.IsEmpty(exports
);
541 public void GetExportsOfTTMetadataView1_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
543 var container
= CreateCompositionContainer();
545 var exports
= container
.GetExports
<string, object>();
547 EnumerableAssert
.IsEmpty(exports
);
551 public void GetExportsOfTTMetadataView2_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
553 var container
= CreateCompositionContainer();
555 var exports
= container
.GetExports
<string, object>("Contract");
557 EnumerableAssert
.IsEmpty(exports
);
561 public void GetExportedValueOfT1_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
563 var container
= CreateCompositionContainer();
565 ExceptionAssert
.Throws
<ImportCardinalityMismatchException
>(() =>
567 container
.GetExportedValue
<string>();
572 public void GetExportedValueOfT2_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
574 var container
= CreateCompositionContainer();
576 ExceptionAssert
.Throws
<ImportCardinalityMismatchException
>(() =>
578 container
.GetExportedValue
<string>("Contract");
583 public void GetExportedValueOrDefaultOfT1_AskingForStringContractThatDoesNotExist_ShouldReturnNull()
585 var container
= CreateCompositionContainer();
587 var exportedValue
= container
.GetExportedValueOrDefault
<string>();
589 Assert
.IsNull(exportedValue
);
593 public void GetExportedValueOrDefaultOfT2_AskingForStringContractThatDoesNotExist_ShouldReturnNull()
595 var container
= CreateCompositionContainer();
597 var exportedValue
= container
.GetExportedValueOrDefault
<string>("Contract");
599 Assert
.IsNull(exportedValue
);
603 public void GetExportedValueOrDefaultOfT1_AskingForInt32ContractThatDoesNotExist_ShouldReturnZero()
605 var container
= CreateCompositionContainer();
607 var exportedValue
= container
.GetExportedValueOrDefault
<int>();
609 Assert
.AreEqual(0, exportedValue
);
613 public void GetExportedValueOrDefaultOfT2_AskingForInt32ContractThatDoesNotExist_ShouldReturnZero()
615 var container
= CreateCompositionContainer();
617 var exportedValue
= container
.GetExportedValueOrDefault
<int>("Contract");
619 Assert
.AreEqual(0, exportedValue
);
623 public void GetExportedValuesOfT1_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
625 var container
= CreateCompositionContainer();
627 var exports
= container
.GetExportedValues
<string>();
629 EnumerableAssert
.IsEmpty(exports
);
633 public void GetExportedValuesOfT2_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
635 var container
= CreateCompositionContainer();
637 var exports
= container
.GetExports
<string>("Contract");
639 EnumerableAssert
.IsEmpty(exports
);
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
);
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
);
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
);
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
);
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");
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");
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");
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");
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");
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");
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");
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");
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
);
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
);
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
);
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
);
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");
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");
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>();
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");
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>();
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");
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
);
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());
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");
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");
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");
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");
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");
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");
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>();
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");
980 public void GetExportedValueOrDefaultOfT1_AskingForContractWithMultipleExports_ShouldReturnZero()
982 var container
= ContainerFactory
.Create(new MicroExport(typeof(string), "Value1", "Value2"));
984 Assert
.IsNull(container
.GetExportedValueOrDefault
<string>());
988 public void GetExportedValueOrDefaultOfT2_AskingForContractWithMultipleExports_ShouldReturnZero()
990 var container
= ContainerFactory
.Create(new MicroExport("Contract", "Value1", "Value2"));
992 Assert
.IsNull(container
.GetExportedValueOrDefault
<string>("Contract"));
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");
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");
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
);
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());
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");
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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>();
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");
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>();
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");
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>();
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");
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
);
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
);
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
);
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
);
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");
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");
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");
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");
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");
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");
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");
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");
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
);
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
);
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
);
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
);
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");
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");
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
);
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
);
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
);
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
);
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");
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");
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");
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");
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");
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");
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");
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");
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
);
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
);
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
);
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
);
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");
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");
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
);
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
);
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(
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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"));
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");
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");
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");
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
);
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");
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");
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");
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
);
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");
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");
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");
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");
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");
2208 public void Dispose_BeforeCompose_CanBeCallMultipleTimes()
2210 var container
= ContainerFactory
.Create(PartFactory
.Create(), PartFactory
.Create());
2211 container
.Dispose();
2212 container
.Dispose();
2213 container
.Dispose();
2217 public void Dispose_AfterCompose_CanBeCallMultipleTimes()
2219 var container
= ContainerFactory
.Create(PartFactory
.Create(), PartFactory
.Create());
2220 container
.Dispose();
2221 container
.Dispose();
2222 container
.Dispose();
2226 public void Dispose_CallsGCSuppressFinalize()
2228 bool finalizerCalled
= false;
2230 var container
= ContainerFactory
.CreateDisposable(disposing
=>
2234 finalizerCalled
= true;
2239 container
.Dispose();
2242 GC
.WaitForPendingFinalizers();
2245 Assert
.IsFalse(finalizerCalled
);
2249 public void Dispose_CallsDisposeBoolWithTrue()
2251 var container
= ContainerFactory
.CreateDisposable(disposing
=>
2253 Assert
.IsTrue(disposing
);
2256 container
.Dispose();
2260 public void Dispose_CallsDisposeBoolOnce()
2262 int disposeCount
= 0;
2264 var container
= ContainerFactory
.CreateDisposable(disposing
=>
2269 container
.Dispose();
2271 Assert
.AreEqual(1, disposeCount
);
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
);
2286 public void Dispose_ContainerAsPart_CanBeDisposed()
2287 { // Tests that when we re-enter CompositionContainer.Dispose, that we don't
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
>());
2302 public void ICompositionService_ShouldNotBeImplicitlyExported()
2304 var container
= CreateCompositionContainer();
2306 Assert
.IsFalse(container
.IsPresent
<ICompositionService
>());
2310 public void CompositionContainer_ShouldNotBeImplicitlyExported()
2312 var container
= CreateCompositionContainer();
2314 Assert
.IsFalse(container
.IsPresent
<CompositionContainer
>());
2318 public void ICompositionService_ShouldNotBeImplicitlyImported()
2320 var importer
= PartFactory
.CreateImporter
<ICompositionService
>();
2321 var container
= ContainerFactory
.Create(importer
);
2323 Assert
.IsNull(importer
.Value
);
2327 public void CompositionContainer_ShouldNotBeImplicitlyImported()
2329 var importer
= PartFactory
.CreateImporter
<CompositionContainer
>();
2330 var container
= ContainerFactory
.Create(importer
);
2332 Assert
.IsNull(importer
.Value
);
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
>());
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
>());
2358 public void ReleaseExport_Null_ShouldThrowArugmentNull()
2360 var container
= CreateCompositionContainer();
2362 ExceptionAssert
.ThrowsArgument
<ArgumentNullException
>("export",
2363 () => container
.ReleaseExport(null));
2367 public void ReleaseExports_Null_ShouldThrowArgumentNull()
2369 var container
= CreateCompositionContainer();
2371 ExceptionAssert
.ThrowsArgument
<ArgumentNullException
>("exports",
2372 () => container
.ReleaseExports(null));
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
2393 [Import("NullableValueType", AllowDefault
= true)]
2394 public int? NullableValueType
2400 [Import("ReferenceType", AllowDefault
= true)]
2401 public string ReferenceType
2408 public class ExportSimpleIntWithException
2410 [Export("SimpleInt")]
2411 public int SimpleInt { get { throw new NotImplementedException(); }
}
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");
2427 public void TryGetExportedValueWhileLockedForNotify()
2429 var container
= CreateCompositionContainer();
2430 CompositionBatch batch
= new CompositionBatch();
2431 batch
.AddParts(new CallbackImportNotify(delegate
2433 container
.GetExportedValueOrDefault
<int>();
2436 container
.Compose(batch
);
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...");
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
);
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
2520 // Silverlight doesn't support strongly typed metadata
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
2537 public void RemoveFromWrongContainerTest()
2539 CompositionContainer d1
= CreateCompositionContainer();
2540 CompositionContainer d2
= CreateCompositionContainer();
2542 CompositionBatch batch1
= new CompositionBatch();
2543 var valueKey
= batch1
.AddExportedValue("a", 1);
2546 CompositionBatch batch2
= new CompositionBatch();
2547 batch2
.RemovePart(valueKey
);
2548 // removing entry from wrong container, shoudl be a no-op
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");
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");
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");
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");
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
);
2640 public void ExceptionDuringNotify()
2642 var container
= CreateCompositionContainer();
2643 CompositionBatch batch
= new CompositionBatch();
2644 batch
.AddParts(new CallbackImportNotify(delegate
2646 throw new InvalidOperationException();
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
);
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
);
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();
2708 public class SimpleExporter
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();
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
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
);
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
);
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
);
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
);
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
);
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
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
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
2893 public void ComposeExportedValueOfT_NullAsContractName_ThrowsArgumentNullException()
2895 var container
= CreateCompositionContainer();
2896 ExceptionAssert
.ThrowsArgument
<ArgumentNullException
>("contractName", () =>
2897 container
.ComposeExportedValue
<string>((string)null, "Value"));
2901 public void ComposeExportedValueOfT_EmptyStringAsContractName_ThrowsArgumentException()
2903 var container
= CreateCompositionContainer();
2904 ExceptionAssert
.ThrowsArgument
<ArgumentException
>("contractName", () =>
2905 container
.ComposeExportedValue
<string>(String
.Empty
, "Value"));
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>());
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
);
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
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
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
2995 public object Import { get; set; }