public void ModuleInUnreferencedAssemblyInitializedByModuleInitializer()
        {
            AssemblyCatalog      assemblyCatalog      = new AssemblyCatalog(GetPathToModuleDll());
            CompositionContainer compositionContainer = new CompositionContainer(assemblyCatalog);

            ModuleCatalog moduleCatalog = new ModuleCatalog();

            Mock <MefFileModuleTypeLoader> mockFileTypeLoader = new Mock <MefFileModuleTypeLoader>();

            compositionContainer.ComposeExportedValue <IModuleCatalog>(moduleCatalog);
            compositionContainer.ComposeExportedValue <MefFileModuleTypeLoader>(mockFileTypeLoader.Object);

            bool wasInit = false;
            var  mockModuleInitializer = new Mock <IModuleInitializer>();

            mockModuleInitializer.Setup(x => x.Initialize(It.IsAny <ModuleInfo>())).Callback(() => wasInit = true);

            var mockLoggerFacade = new Mock <ILoggerFacade>();

            MefModuleManager moduleManager = new MefModuleManager(
                mockModuleInitializer.Object,
                moduleCatalog,
                mockLoggerFacade.Object);

            compositionContainer.SatisfyImportsOnce(moduleManager);

            moduleManager.Run();

            Assert.IsTrue(wasInit);
        }
        public void UnknownExportedModuleIsAddedAndInitializedByModuleInitializer()
        {
            var aggregateCatalog     = new AggregateCatalog();
            var compositionContainer = new CompositionContainer(aggregateCatalog);

            var moduleCatalog = new ModuleCatalog();

            var mockModuleTypeLoader = new Mock <MefXapModuleTypeLoader>(new DownloadedPartCatalogCollection());

            compositionContainer.ComposeExportedValue <IModuleCatalog>(moduleCatalog);
            compositionContainer.ComposeExportedValue <MefXapModuleTypeLoader>(mockModuleTypeLoader.Object);

            bool wasInit = false;
            var  mockModuleInitializer = new Mock <IModuleInitializer>();

            mockModuleInitializer.Setup(x => x.Initialize(It.IsAny <ModuleInfo>())).Callback(() => wasInit = true);

            var mockLoggerFacade = new Mock <ILoggerFacade>();

            var moduleManager =
                new MefModuleManager(mockModuleInitializer.Object, moduleCatalog, mockLoggerFacade.Object);

            aggregateCatalog.Catalogs.Add(new TypeCatalog(typeof(TestMefModule)));

            compositionContainer.SatisfyImportsOnce(moduleManager);

            moduleManager.Run();

            Assert.IsTrue(wasInit);
            Assert.IsTrue(moduleCatalog.Modules.Any(mi => mi.ModuleName == "TestMefModule"));
        }
        public void DeclaredModuleWithTypeInUnreferencedAssemblyIsUpdatedWithTypeNameFromExportAttribute()
        {
            AggregateCatalog     aggregateCatalog     = new AggregateCatalog();
            CompositionContainer compositionContainer = new CompositionContainer(aggregateCatalog);

            var mockFileTypeLoader = new Mock <MefFileModuleTypeLoader>();

            mockFileTypeLoader.Setup(tl => tl.CanLoadModuleType(It.IsAny <ModuleInfo>())).Returns(true);


            ModuleCatalog moduleCatalog = new ModuleCatalog();
            ModuleInfo    moduleInfo    = new ModuleInfo {
                ModuleName = "MefModuleOne", ModuleType = "some type"
            };

            moduleCatalog.AddModule(moduleInfo);

            compositionContainer.ComposeExportedValue <IModuleCatalog>(moduleCatalog);
            compositionContainer.ComposeExportedValue <MefFileModuleTypeLoader>(mockFileTypeLoader.Object);

            bool wasInit = false;
            var  mockModuleInitializer = new Mock <IModuleInitializer>();

            mockModuleInitializer.Setup(x => x.Initialize(It.IsAny <ModuleInfo>())).Callback(() => wasInit = true);

            var mockLoggerFacade = new Mock <ILoggerFacade>();

            MefModuleManager moduleManager = new MefModuleManager(
                mockModuleInitializer.Object,
                moduleCatalog,
                mockLoggerFacade.Object);

            compositionContainer.SatisfyImportsOnce(moduleManager);
            moduleManager.Run();

            Assert.IsFalse(wasInit);

            AssemblyCatalog assemblyCatalog = new AssemblyCatalog(GetPathToModuleDll());

            aggregateCatalog.Catalogs.Add(assemblyCatalog);

            compositionContainer.SatisfyImportsOnce(moduleManager);

            mockFileTypeLoader.Raise(tl => tl.LoadModuleCompleted += null, new LoadModuleCompletedEventArgs(moduleInfo, null));

            Assert.AreEqual("MefModulesForTesting.MefModuleOne, MefModulesForTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", moduleInfo.ModuleType);
            Assert.IsTrue(wasInit);
        }
        public void DeclaredModuleWithTypeInUnreferencedAssemblyIsUpdatedWithTypeNameFromExportAttribute()
        {
            var aggregateCatalog     = new AggregateCatalog();
            var compositionContainer = new CompositionContainer(aggregateCatalog);

            var mockModuleTypeLoader = new Mock <MefXapModuleTypeLoader>(new DownloadedPartCatalogCollection());

            mockModuleTypeLoader.Setup(tl => tl.CanLoadModuleType(It.IsAny <ModuleInfo>())).Returns(true);

            var moduleCatalog = new ModuleCatalog();
            var moduleInfo    = new ModuleInfo {
                ModuleName = "TestMefModule", ModuleType = "some type"
            };

            moduleCatalog.AddModule(moduleInfo);

            compositionContainer.ComposeExportedValue <IModuleCatalog>(moduleCatalog);
            compositionContainer.ComposeExportedValue <MefXapModuleTypeLoader>(mockModuleTypeLoader.Object);

            bool wasInit = false;
            var  mockModuleInitializer = new Mock <IModuleInitializer>();

            mockModuleInitializer.Setup(x => x.Initialize(It.IsAny <ModuleInfo>())).Callback(() => wasInit = true);

            var mockLoggerFacade = new Mock <ILoggerFacade>();

            var moduleManager =
                new MefModuleManager(mockModuleInitializer.Object, moduleCatalog, mockLoggerFacade.Object);

            compositionContainer.SatisfyImportsOnce(moduleManager);
            moduleManager.Run();

            Assert.IsFalse(wasInit);

            aggregateCatalog.Catalogs.Add(new TypeCatalog(typeof(TestMefModule)));

            compositionContainer.SatisfyImportsOnce(moduleManager);

            mockModuleTypeLoader.Raise(tl => tl.LoadModuleCompleted += null, new LoadModuleCompletedEventArgs(moduleInfo, null));

            Assert.AreEqual(typeof(TestMefModule).AssemblyQualifiedName, moduleInfo.ModuleType);
            Assert.IsTrue(wasInit);
        }