public void SatisfyImports_Recomposable_Unregister_ValueShouldChangeOnce()
        {
            var exportProvider = ExportProviderFactory.CreateRecomposable();
            var engine         = new ImportEngine(exportProvider);

            exportProvider.AddExport("Value", 21);

            var import   = ImportDefinitionFactory.Create("Value", true);
            var importer = PartFactory.CreateImporter(import);

            engine.SatisfyImports(importer);

            Assert.Equal(21, importer.GetImport(import));

            exportProvider.ReplaceExportValue("Value", 42);

            Assert.Equal(42, importer.GetImport(import));

            engine.ReleaseImports(importer, null);

            exportProvider.ReplaceExportValue("Value", 666);

            Assert.Equal(42, importer.GetImport(import));

            GC.KeepAlive(importer);
        }
        public void SatisfyImports_TwoRecomposables_SingleExportValueChanged()
        {
            var exportProvider = ExportProviderFactory.CreateRecomposable();
            var engine         = new ImportEngine(exportProvider);

            var import1  = ImportDefinitionFactory.Create("Value1", true);
            var import2  = ImportDefinitionFactory.Create("Value2", true);
            var importer = PartFactory.CreateImporter(import1, import2);

            exportProvider.AddExport("Value1", 21);
            exportProvider.AddExport("Value2", 23);

            engine.SatisfyImports(importer);

            Assert.Equal(21, importer.GetImport(import1));
            Assert.Equal(23, importer.GetImport(import2));

            importer.ResetImport(import1);
            importer.ResetImport(import2);

            // Only change Value1
            exportProvider.ReplaceExportValue("Value1", 42);

            Assert.Equal(42, importer.GetImport(import1));

            Assert.Equal(null, importer.GetImport(import2));

            GC.KeepAlive(importer);
        }
        public void SatisfyImports_OneRecomposable_OneNotRecomposable()
        {
            var exportProvider = ExportProviderFactory.CreateRecomposable();
            var engine         = new ImportEngine(exportProvider);

            var import1  = ImportDefinitionFactory.Create("Value", true);
            var import2  = ImportDefinitionFactory.Create("Value", false);
            var importer = PartFactory.CreateImporter(import1, import2);

            exportProvider.AddExport("Value", 21);

            engine.SatisfyImports(importer);

            // Initial compose values should be 21
            Assert.Equal(21, importer.GetImport(import1));
            Assert.Equal(21, importer.GetImport(import2));

            // Reset value to ensure it doesn't get set to same value again
            importer.ResetImport(import1);
            importer.ResetImport(import2);

            Assert.Throws <ChangeRejectedException>(() =>
                                                    exportProvider.ReplaceExportValue("Value", 42));

            Assert.Equal(null, importer.GetImport(import1));
            Assert.Equal(null, importer.GetImport(import2));

            GC.KeepAlive(importer);
        }
        public void SatisfyImports_ZeroCollectionImport_Recomposable_ShouldNotBlockChanges()
        {
            var exportProvider = ExportProviderFactory.CreateRecomposable();
            var engine         = new ImportEngine(exportProvider);

            var import   = ImportDefinitionFactory.Create("Value", ImportCardinality.ZeroOrMore, true, false);
            var importer = PartFactory.CreateImporter(import);

            exportProvider.AddExport("Value", 20);

            engine.SatisfyImports(importer);

            exportProvider.AddExport("Value", 21);
            exportProvider.RemoveExport("Value");

            GC.KeepAlive(importer);
        }
        public void SatisfyImports_MissingOptionalImport_NonRecomposable_ShouldNotBlockChanges()
        {
            var exportProvider = ExportProviderFactory.CreateRecomposable();
            var engine         = new ImportEngine(exportProvider);

            var import   = ImportDefinitionFactory.Create("Value", ImportCardinality.ZeroOrOne, false, false);
            var importer = PartFactory.CreateImporter(import);

            exportProvider.AddExport("Value", 20);

            engine.SatisfyImports(importer);

            Assert.Throws <ChangeRejectedException>(() =>
                                                    exportProvider.AddExport("Value", 21));

            Assert.Throws <ChangeRejectedException>(() =>
                                                    exportProvider.RemoveExport("Value"));

            GC.KeepAlive(importer);
        }
        public void SatisfyImports_Recomposable_Prerequisite_ValueShouldChange()
        {
            var exportProvider = ExportProviderFactory.CreateRecomposable();
            var engine         = new ImportEngine(exportProvider);

            var import   = ImportDefinitionFactory.Create("Value", true, true);
            var importer = PartFactory.CreateImporter(import);

            exportProvider.AddExport("Value", 21);

            engine.SatisfyImports(importer);

            Assert.AreEqual(21, importer.GetImport(import));

            exportProvider.ReplaceExportValue("Value", 42);

            Assert.AreEqual(42, importer.GetImport(import), "Value should change!");

            GC.KeepAlive(importer);
        }
        public void SatisfyImports_NonRecomposable_Prerequisite_ValueShouldNotChange()
        {
            var exportProvider = ExportProviderFactory.CreateRecomposable();
            var engine         = new ImportEngine(exportProvider);

            var import   = ImportDefinitionFactory.Create("Value", false, true);
            var importer = PartFactory.CreateImporter(import);

            exportProvider.AddExport("Value", 21);

            engine.SatisfyImports(importer);

            Assert.Equal(21, importer.GetImport(import));

            Assert.Throws <ChangeRejectedException>(() =>
                                                    exportProvider.ReplaceExportValue("Value", 42));

            Assert.Equal(21, importer.GetImport(import));

            GC.KeepAlive(importer);
        }
        public void SatisfyImports_NonRecomposable_ValueShouldNotChange()
        {
            var exportProvider = ExportProviderFactory.CreateRecomposable();
            var engine         = new ImportEngine(exportProvider);

            exportProvider.AddExport("Value", 21);

            var import   = ImportDefinitionFactory.Create("Value", false);
            var importer = PartFactory.CreateImporter(import);

            engine.SatisfyImports(importer);

            Assert.Equal(21, importer.GetImport(import));

            // After rejection batch failures throw ChangeRejectedException to indicate that
            // the failure did not affect the container
            Assert.Throws <ChangeRejectedException>(() =>
                                                    exportProvider.ReplaceExportValue("Value", 42));

            Assert.Equal(21, importer.GetImport(import));

            GC.KeepAlive(importer);
        }