1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.Collections.Generic;
\r
6 using System.ComponentModel.Composition;
\r
7 using System.ComponentModel.Composition.AttributedModel;
\r
8 using System.ComponentModel.Composition.Primitives;
\r
9 using System.ComponentModel.Composition.Factories;
\r
10 using System.ComponentModel.Composition.Hosting;
\r
11 using System.ComponentModel.Composition.UnitTesting;
\r
13 using System.Reflection;
\r
14 using System.UnitTesting;
\r
15 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
17 namespace Tests.Integration
\r
20 public class DiscoveryTests
\r
22 public abstract class AbstractClassWithExports
\r
24 [Export("StaticExport")]
\r
25 public static string StaticExport { get { return "ExportedValue"; } }
\r
27 [Export("InstanceExport")]
\r
28 public string InstanceExport { get { return "InstanceExportedValue"; } }
\r
32 public void Export_StaticOnAbstractClass_ShouldExist()
\r
34 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(AbstractClassWithExports));
\r
36 Assert.IsTrue(container.IsPresent("StaticExport"));
\r
37 Assert.IsFalse(container.IsPresent("InstanceExport"));
\r
40 public class ClassWithStaticImport
\r
42 [Import("StaticImport")]
\r
43 public static string MyImport
\r
50 public void Import_StaticImport_ShouldNotBeSet()
\r
52 var container = ContainerFactory.Create();
\r
53 container.AddAndComposeExportedValue("StaticImport", "String that shouldn't be imported");
\r
55 var importer = new ClassWithStaticImport();
\r
57 container.SatisfyImportsOnce(importer);
\r
59 Assert.IsNull(ClassWithStaticImport.MyImport, "Static import should not have been set!");
\r
63 // private imports don't work on SILVERLIGHT
\r
65 public class BaseWithNonPublicImportAndExport
\r
67 [Import("BasePrivateImport")]
\r
68 private string _basePrivateImport = null;
\r
70 public string BasePrivateImport { get { return this._basePrivateImport; } }
\r
74 public class DerivedBaseWithNonPublicImportAndExport : BaseWithNonPublicImportAndExport
\r
80 public void Import_PrivateOnClass_ShouldSetImport()
\r
82 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(BaseWithNonPublicImportAndExport));
\r
83 container.AddAndComposeExportedValue("BasePrivateImport", "Imported String");
\r
85 var importer = container.GetExportedValue<BaseWithNonPublicImportAndExport>();
\r
86 Assert.AreEqual("Imported String", importer.BasePrivateImport);
\r
91 public void Import_PrivateOnBase_ShouldSetImport()
\r
93 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(DerivedBaseWithNonPublicImportAndExport));
\r
94 container.AddAndComposeExportedValue("BasePrivateImport", "Imported String");
\r
96 var importer = container.GetExportedValue<DerivedBaseWithNonPublicImportAndExport>();
\r
97 Assert.AreEqual("Imported String", importer.BasePrivateImport);
\r
99 #endif // !SILVERLIGHT
\r
101 public interface InterfaceWithImport
\r
103 [Import("InterfaceImport")]
\r
104 int MyImport { get; set; }
\r
107 public interface InterfaceWithExport
\r
109 [Export("InterfaceExport")]
\r
110 int MyExport { get; set; }
\r
114 public void AttributesOnInterface_ShouldNotBeConsiderAPart()
\r
116 var catalog = CatalogFactory.CreateAttributed(
\r
117 typeof(InterfaceWithImport),
\r
118 typeof(InterfaceWithExport));
\r
120 Assert.AreEqual(0, catalog.Parts.Count());
\r
124 public class ClassWithInterfaceInheritedImport : InterfaceWithImport
\r
126 public int MyImport { get; set; }
\r
130 public void Import_InheritImportFromInterface_ShouldExposeImport()
\r
132 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
133 typeof(ClassWithInterfaceInheritedImport));
\r
135 container.AddAndComposeExportedValue("InterfaceImport", 42);
\r
137 var importer = container.GetExportedValue<ClassWithInterfaceInheritedImport>();
\r
139 Assert.IsTrue(importer.MyImport == default(int), "Imports declared on interfaces should not be discovered");
\r
142 public class ClassWithInterfaceInheritedExport : InterfaceWithExport
\r
144 public ClassWithInterfaceInheritedExport()
\r
149 public int MyExport { get; set; }
\r
153 public void Import_InheritExportFromInterface_ShouldNotExposeExport()
\r
155 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
156 typeof(ClassWithInterfaceInheritedExport));
\r
158 Assert.IsFalse(container.IsPresent("InterfaceExport"), "Export defined on interface should not be discovered!");
\r
161 public interface IFoo { }
\r
164 public abstract class BaseWithVirtualExport
\r
167 public virtual IFoo MyProp { get; set; }
\r
170 [InheritedExport(typeof(BaseWithVirtualExport))]
\r
171 public class DerivedWithOverrideExport : BaseWithVirtualExport
\r
174 public override IFoo MyProp { get; set; }
\r
178 public void Export_BaseAndDerivedShouldAmountInTwoExports()
\r
180 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
181 typeof(BaseWithVirtualExport),
\r
182 typeof(DerivedWithOverrideExport));
\r
184 var exports1 = container.GetExportedValues<BaseWithVirtualExport>();
\r
185 Assert.AreEqual(1, exports1.Count());
\r
187 var exports2 = container.GetExportedValues<IFoo>();
\r
188 Assert.AreEqual(1, exports2.Count());
\r
191 public interface IDocument { }
\r
193 [Export(typeof(IDocument))]
\r
194 [ExportMetadata("Name", "TextDocument")]
\r
195 public class TextDocument : IDocument
\r
199 [Export(typeof(IDocument))]
\r
200 [ExportMetadata("Name", "XmlDocument")]
\r
201 public class XmlDocument : TextDocument
\r
206 public void Export_ExportingSameContractInDerived_ShouldResultInHidingBaseExport()
\r
208 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
210 typeof(XmlDocument));
\r
212 var export = container.GetExport<IDocument, IDictionary<string, object>>();
\r
214 Assert.AreEqual("XmlDocument", export.Metadata["Name"]);
\r
218 public void Export_ExportingBaseAndDerivedSameContract_ShouldResultInOnlyTwoExports()
\r
220 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
222 typeof(TextDocument),
\r
223 typeof(XmlDocument));
\r
225 var exports = container.GetExports<IDocument, IDictionary<string, object>>();
\r
227 Assert.AreEqual(2, exports.Count());
\r
228 Assert.AreEqual("TextDocument", exports.ElementAt(0).Metadata["Name"]);
\r
229 Assert.IsInstanceOfType(exports.ElementAt(0).Value, typeof(TextDocument));
\r
231 Assert.AreEqual("XmlDocument", exports.ElementAt(1).Metadata["Name"]);
\r
232 Assert.IsInstanceOfType(exports.ElementAt(1).Value, typeof(XmlDocument));
\r
235 public interface IObjectSerializer { }
\r
237 [Export(typeof(IDocument))]
\r
238 [Export(typeof(IObjectSerializer))]
\r
239 [ExportMetadata("Name", "XamlDocument")]
\r
240 public class XamlDocument : XmlDocument, IObjectSerializer
\r
245 public void Export_ExportingSameContractInDerivedAndNewContract_ShouldResultInHidingBaseAndExportingNewContract()
\r
247 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
248 typeof(XamlDocument));
\r
250 var export = container.GetExport<IDocument, IDictionary<string, object>>();
\r
252 Assert.AreEqual("XamlDocument", export.Metadata["Name"]);
\r
254 var export2 = container.GetExport<IObjectSerializer, IDictionary<string, object>>();
\r
256 Assert.AreEqual("XamlDocument", export2.Metadata["Name"]);
\r
260 [Export(typeof(IDocument))]
\r
261 [ExportMetadata("Name", "WPFDocument")]
\r
262 public class WPFDocument : XamlDocument
\r
267 public void Export_ExportingSameContractInDerivedAndAnotherContractInBase_ShouldResultInHidingOneBaseAndInheritingNewContract()
\r
269 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
270 typeof(WPFDocument));
\r
272 var export = container.GetExport<IDocument, IDictionary<string, object>>();
\r
274 Assert.AreEqual("WPFDocument", export.Metadata["Name"]);
\r
276 var export2 = container.GetExportedValueOrDefault<IObjectSerializer>();
\r
278 Assert.IsNull(export2, "IObjectSerializer export should not have been inherited");
\r
282 public abstract class Plugin
\r
284 public virtual string GetLocation()
\r
289 public virtual int Version
\r
298 private void VerifyValidPlugin(CompositionContainer container, int version, string location)
\r
300 var plugins = container.GetExports<Plugin>();
\r
301 Assert.AreEqual(1, plugins.Count());
\r
303 var plugin = plugins.Single().Value;
\r
305 Assert.AreEqual(location, plugin.GetLocation());
\r
306 Assert.AreEqual(version, plugin.Version);
\r
309 public class Plugin1 : Plugin
\r
314 public void Export_Plugin1()
\r
316 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
319 VerifyValidPlugin(container, 0, "NoWhere");
\r
322 public class Plugin2 : Plugin
\r
324 public override string GetLocation()
\r
326 return "SomeWhere";
\r
328 public override int Version
\r
338 public void Export_Plugin2()
\r
340 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
343 VerifyValidPlugin(container, 1, "SomeWhere");
\r
346 public class Plugin3 : Plugin
\r
348 [Export("PluginLocation")]
\r
349 public override string GetLocation()
\r
351 return "SomeWhere3";
\r
354 [Export("PluginVersion")]
\r
355 public override int Version
\r
365 public void Export_Plugin3()
\r
367 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
370 VerifyValidPlugin(container, 3, "SomeWhere3");
\r
372 var plVer = container.GetExportedValue<int>("PluginVersion");
\r
373 Assert.AreEqual(3, plVer);
\r
375 var plLoc = container.GetExportedValue<Func<string>>("PluginLocation");
\r
376 Assert.AreEqual("SomeWhere3", plLoc());
\r
379 [InheritedExport(typeof(Plugin))]
\r
380 public class Plugin4 : Plugin
\r
382 public override string GetLocation()
\r
384 return "SomeWhere4";
\r
387 public override int Version
\r
397 public void Export_Plugin4()
\r
399 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
402 VerifyValidPlugin(container, 4, "SomeWhere4");
\r
406 public interface IPlugin
\r
411 public class MyPlugin : IPlugin
\r
413 [Export("PluginId")]
\r
414 public int Id { get { return 0; } }
\r
418 public void Export_MyPlugin()
\r
420 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
423 var export = container.GetExportedValue<int>("PluginId");
\r
427 public interface IApplicationPlugin
\r
429 string Name { get; }
\r
431 object Application { get; set; }
\r
435 public interface IToolbarPlugin : IApplicationPlugin
\r
437 object ToolBar { get; set; }
\r
440 public class MyToolbarPlugin : IToolbarPlugin
\r
442 [Export("ApplicationPluginNames")]
\r
443 public string Name { get { return "MyToolbarPlugin"; } }
\r
445 [Import("Application")]
\r
446 public object Application { get; set; }
\r
448 [Import("ToolBar")]
\r
449 public object ToolBar { get; set; }
\r
453 public void TestInterfaces()
\r
455 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
456 typeof(MyToolbarPlugin));
\r
458 var app = new object();
\r
459 container.AddAndComposeExportedValue<object>("Application", app);
\r
461 var toolbar = new object();
\r
462 container.AddAndComposeExportedValue<object>("ToolBar", toolbar);
\r
464 var export = container.GetExportedValue<IToolbarPlugin>();
\r
466 Assert.AreEqual(app, export.Application);
\r
467 Assert.AreEqual(toolbar, export.ToolBar);
\r
468 Assert.AreEqual("MyToolbarPlugin", export.Name);
\r
470 var pluginNames = container.GetExportedValues<string>("ApplicationPluginNames");
\r
471 Assert.AreEqual(1, pluginNames.Count());
\r
474 public class ImportOnVirtualProperty
\r
476 public int ImportSetCount = 0;
\r
477 private int _value;
\r
479 [Import("VirtualImport")]
\r
480 public virtual int VirtualImport
\r
484 return this._value;
\r
488 this._value = value;
\r
494 public class ImportOnOverridenPropertyWithSameContract : ImportOnVirtualProperty
\r
496 [Import("VirtualImport")]
\r
497 public override int VirtualImport
\r
501 return base.VirtualImport;
\r
505 base.VirtualImport = value;
\r
511 public void Import_VirtualPropertyOverrideWithSameContract_ShouldSucceed()
\r
513 var container = ContainerFactory.Create();
\r
514 container.AddAndComposeExportedValue<int>("VirtualImport", 21);
\r
516 var import = new ImportOnOverridenPropertyWithSameContract();
\r
518 container.SatisfyImportsOnce(import);
\r
520 // Import will get set twice because there are 2 imports on the same property.
\r
521 // We would really like to either elminate it getting set twice or error in this case
\r
522 // but we figure it is a rare enough corner case that it doesn't warrented the run time cost
\r
523 // and can be covered by an FxCop rule.
\r
525 Assert.AreEqual(2, import.ImportSetCount);
\r
526 Assert.AreEqual(21, import.VirtualImport);
\r
529 public class ImportOnOverridenPropertyWithDifferentContract : ImportOnVirtualProperty
\r
531 [Import("OverriddenImport")]
\r
532 public override int VirtualImport
\r
536 base.VirtualImport = value;
\r
542 public void Import_VirtualPropertyOverrideWithDifferentContract_ShouldSucceed()
\r
544 var container = ContainerFactory.Create();
\r
545 container.AddAndComposeExportedValue<int>("VirtualImport", 21);
\r
546 container.AddAndComposeExportedValue<int>("OverriddenImport", 42);
\r
548 var import = new ImportOnOverridenPropertyWithSameContract();
\r
550 container.SatisfyImportsOnce(import);
\r
552 // Import will get set twice because there are 2 imports on the same property.
\r
553 // We would really like to either elminate it getting set twice or error in this case
\r
554 // but we figure it is a rare enough corner case that it doesn't warrented the run time cost
\r
555 // and can be covered by an FxCop rule.
\r
557 Assert.AreEqual(2, import.ImportSetCount);
\r
559 // The derived most import should be discovered first and so it will get set first
\r
560 // and thus the value should be the base import which is 21.
\r
561 Assert.AreEqual(21, import.VirtualImport);
\r
565 public interface IOrderScreen { }
\r
567 public class NorthwindOrderScreen : IOrderScreen
\r
571 public class SouthsandOrderScreen : IOrderScreen
\r
576 public void Export_ExportOnlyOnBaseInterfacewithInheritedMarked_ShouldFindAllImplementers()
\r
578 var container = ContainerFactory.CreateWithAttributedCatalog(
\r
579 typeof(NorthwindOrderScreen),
\r
580 typeof(SouthsandOrderScreen));
\r
582 var exports = container.GetExportedValues<IOrderScreen>();
\r
584 Assert.AreEqual(2, exports.Count());
\r
585 Assert.IsInstanceOfType(exports.ElementAt(0), typeof(NorthwindOrderScreen));
\r
586 Assert.IsInstanceOfType(exports.ElementAt(1), typeof(SouthsandOrderScreen));
\r
590 public class PartWithStaticConstructor
\r
592 static PartWithStaticConstructor()
\r
594 throw new Exception();
\r
599 public void StaticConstructor()
\r
601 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(PartWithStaticConstructor));
\r
603 CompositionAssert.ThrowsError(ErrorId.ImportEngine_PartCannotGetExportedValue,
\r
604 ErrorId.ImportEngine_PartCannotActivate,
\r
605 ErrorId.ReflectionModel_PartConstructorThrewException,
\r
606 () => container.GetExportedValue<PartWithStaticConstructor>());
\r
609 public interface IAddin
\r
611 void LoadAddin(object application);
\r
615 public interface IAddinMetadata
\r
617 string Name { get; }
\r
618 string Version { get; }
\r
622 [MetadataAttribute]
\r
623 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
\r
624 public class AddinAttribute : ExportAttribute, IAddinMetadata
\r
626 private string _name;
\r
627 private string _version;
\r
628 private string _id;
\r
630 public AddinAttribute(string name, string version, string id)
\r
631 : base(typeof(IAddin))
\r
634 this._version = version;
\r
638 public string Name { get { return this._name; } }
\r
639 public string Version { get { return this._version; } }
\r
640 public string Id { get { return this._id; } }
\r
644 [Addin("Addin1", "1.0", "{63D1B00F-AD2F-4F14-8A36-FFA59E4A101C}")]
\r
645 public class Addin1 : IAddin
\r
647 public void LoadAddin(object application)
\r
650 public void Shutdown()
\r
655 [Addin("Addin2", "1.0", "{63D1B00F-AD2F-4F14-8A36-FFA59E4A101D}")]
\r
656 public class Addin2 : IAddin
\r
658 public void LoadAddin(object application)
\r
661 public void Shutdown()
\r
666 [Addin("Addin3", "1.0", "{63D1B00F-AD2F-4F14-8A36-FFA59E4A101E}")]
\r
667 public class Addin3 : IAddin
\r
669 public void LoadAddin(object application)
\r
672 public void Shutdown()
\r
678 public void DiscoverAddinsWithCombinedCustomExportAndMetadataAttribute()
\r
680 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(Addin1), typeof(Addin2), typeof(Addin3));
\r
682 var addins = container.GetExports<IAddin, IAddinMetadata>().ToArray();
\r
684 Assert.AreEqual(3, addins.Length, "Incorrect number of addins");
\r
686 var values = new AddinAttribute[]
\r
688 new AddinAttribute("Addin1", "1.0", "{63D1B00F-AD2F-4F14-8A36-FFA59E4A101C}"),
\r
689 new AddinAttribute("Addin2", "1.0", "{63D1B00F-AD2F-4F14-8A36-FFA59E4A101D}"),
\r
690 new AddinAttribute("Addin3", "1.0", "{63D1B00F-AD2F-4F14-8A36-FFA59E4A101E}"),
\r
693 for (int i = 0; i < values.Length; i++)
\r
695 var addinMetadata = addins[i].Metadata;
\r
697 Assert.AreEqual(values[i].Name, addinMetadata.Name);
\r
698 Assert.AreEqual(values[i].Version, addinMetadata.Version);
\r
699 Assert.AreEqual(values[i].Id, addinMetadata.Id);
\r
704 public void CombinedCustomExportMetadataAttribute_ShouldNotContainMetadataFromExportAttribute()
\r
706 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(Addin1));
\r
707 var addin = container.GetExport<IAddin, IDictionary<string, object>>();
\r
709 Assert.AreEqual(4, addin.Metadata.Count); // 3 metadata values and type identity
\r
711 Assert.AreEqual(AttributedModelServices.GetTypeIdentity(typeof(IAddin)), addin.Metadata[CompositionConstants.ExportTypeIdentityMetadataName]);
\r
712 Assert.AreEqual("Addin1", addin.Metadata["Name"]);
\r
713 Assert.AreEqual("1.0", addin.Metadata["Version"]);
\r
714 Assert.AreEqual("{63D1B00F-AD2F-4F14-8A36-FFA59E4A101C}", addin.Metadata["Id"]);
\r
717 public class CustomInheritedExportAttribute : InheritedExportAttribute
\r
721 [CustomInheritedExport]
\r
722 public interface IUsesCustomInheritedExport
\r
724 int Property { get; }
\r
727 public class UsesCustomInheritedExportOnInterface : IUsesCustomInheritedExport
\r
729 public int Property
\r
736 public void Test_CustomInheritedExportAttribute_OnInterface()
\r
738 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(UsesCustomInheritedExportOnInterface));
\r
739 var exporter = container.GetExportedValue<IUsesCustomInheritedExport>();
\r
740 Assert.AreEqual(42, exporter.Property);
\r
743 [CustomInheritedExport]
\r
744 public class BaseClassWithCustomInheritedExport
\r
746 public int Property { get; set; }
\r
749 public class DerivedFromBaseWithCustomInheritedExport : BaseClassWithCustomInheritedExport
\r
751 public DerivedFromBaseWithCustomInheritedExport()
\r
758 public void Test_CustomInheritedExportAttribute_OnBaseClass()
\r
760 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(DerivedFromBaseWithCustomInheritedExport));
\r
761 var exporter = container.GetExportedValue<BaseClassWithCustomInheritedExport>();
\r
762 Assert.AreEqual(43, exporter.Property);
\r
766 [InheritedExport("Foo")]
\r
767 [ExportMetadata("Name", "IFoo1")]
\r
768 public interface IFoo1 { }
\r
770 [InheritedExport("Foo")]
\r
771 [ExportMetadata("Name", "IFoo2")]
\r
772 public interface IFoo2 { }
\r
774 [InheritedExport("Foo")]
\r
775 [ExportMetadata("Name", "FooWithOneFoo")]
\r
776 public class FooWithOneFoo : IFoo1
\r
781 public void InheritedExport_OnTypeAndInterface()
\r
783 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(FooWithOneFoo));
\r
785 var foos = container.GetExports<object, IDictionary<string, object>>("Foo").ToArray();
\r
787 Assert.AreEqual(1, foos.Length);
\r
788 Assert.AreEqual("FooWithOneFoo", foos[0].Metadata["Name"]);
\r
791 public class FooWithTwoFoos : IFoo1, IFoo2 { }
\r
794 public void InheritedExport_TwoInterfaces()
\r
796 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(FooWithTwoFoos));
\r
798 var foos = container.GetExports<object, IDictionary<string, object>>("Foo").ToArray();
\r
800 Assert.AreEqual(2, foos.Length);
\r
802 EnumerableAssert.AreEqual(foos.Select(e => (string)e.Metadata["Name"]), "IFoo1", "IFoo2");
\r
805 public class FooWithIfaceByOneFoo : FooWithOneFoo, IFoo1 { }
\r
808 public void InheritedExport_BaseAndInterface()
\r
810 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(FooWithIfaceByOneFoo));
\r
812 var foos = container.GetExports<object, IDictionary<string, object>>("Foo").ToArray();
\r
814 Assert.AreEqual(1, foos.Length);
\r
816 Assert.AreEqual("FooWithOneFoo", foos[0].Metadata["Name"]);
\r
819 [InheritedExport("Foo")]
\r
820 [ExportMetadata("Name", "FooWithInheritedOnSelf")]
\r
821 public class FooWithInheritedOnSelf : FooWithOneFoo, IFoo1 { }
\r
824 public void InheritedExport_BaseInterfaceAndSelf()
\r
826 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(FooWithInheritedOnSelf));
\r
828 var foos = container.GetExports<object, IDictionary<string, object>>("Foo").ToArray();
\r
830 Assert.AreEqual(1, foos.Length);
\r
832 Assert.AreEqual("FooWithInheritedOnSelf", foos[0].Metadata["Name"]);
\r
835 [InheritedExport("Foo")]
\r
836 [ExportMetadata("Name", "IFoo3")]
\r
837 public interface IFoo3 : IFoo1 { }
\r
839 public class FooWithInterfaceWithMultipleFoos : IFoo3 { }
\r
842 public void InheritedExport_InterfaceHiearchy()
\r
844 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(FooWithInterfaceWithMultipleFoos));
\r
846 var foos = container.GetExports<object, IDictionary<string, object>>("Foo").ToArray();
\r
847 Assert.AreEqual(2, foos.Length);
\r
849 EnumerableAssert.AreEqual(foos.Select(e => (string)e.Metadata["Name"]), "IFoo1", "IFoo3");
\r
852 [InheritedExport("Foo2")]
\r
853 [ExportMetadata("Name", "FooWithMultipleInheritedExports")]
\r
854 public class FooWithMultipleInheritedExports : IFoo1 { }
\r
857 public void InheritedExport_MultipleDifferentContracts()
\r
859 var container = ContainerFactory.CreateWithAttributedCatalog(typeof(FooWithMultipleInheritedExports));
\r
861 var foos = container.GetExports<object, IDictionary<string, object>>("Foo").ToArray();
\r
863 Assert.AreEqual(1, foos.Length);
\r
865 Assert.AreEqual("IFoo1", foos[0].Metadata["Name"]);
\r
867 var foo2s = container.GetExports<object, IDictionary<string, object>>("Foo2").ToArray();
\r
869 Assert.AreEqual(1, foo2s.Length);
\r
871 Assert.AreEqual("FooWithMultipleInheritedExports", foo2s[0].Metadata["Name"]);
\r