示例#1
0
        public void CreateNewApplications_MissingMiddleApplications()
        {
            IConceptInfo ci1 = new SimpleCi {
                Name = "1"
            };                                              // Concept application SimpleConceptImplementation will generate SQL script "create 1".
            IConceptInfo ci2 = new SimpleCi2 {
                Name = "2"
            };                                               // No concept application in database.
            IConceptInfo ci3 = new SimpleCi3 {
                Name = "3"
            };                                               // Concept application ExtendingConceptImplementation does not generate SQL script.

            var conceptImplementations = new PluginsMetadataList <IConceptDatabaseDefinition>
            {
                new NullImplementation(),
                { new SimpleConceptImplementation(), typeof(SimpleCi) },
                { new ExtendingConceptImplementation(), typeof(SimpleCi3) },
            };

            tempConceptInfoDependencies = new[] { Tuple.Create(ci2, ci1), Tuple.Create(ci3, ci2) };
            // Concept application that implements ci3 should (indirectly) depend on concept application that implements ci1.
            // This test is specific because there is no concept application for ci2, so there is possibility of error when calculating dependencies between concept applications.

            var dslModel             = new MockDslModel(new[] { ci1, ci2, ci3 });
            var databasePlugins      = MockDatabasePluginsContainer.Create(conceptImplementations);
            var databaseModelBuilder = new DatabaseModelBuilderAccessor(databasePlugins, dslModel);
            var conceptApplications  = databaseModelBuilder.CreateDatabaseModel().DatabaseObjects;

            tempConceptInfoDependencies = null;

            var ca1 = conceptApplications.Where(ca => ca.ConceptInfoKey == ci1.GetKey()).Single();
            var ca3 = conceptApplications.Where(ca => ca.ConceptInfoKey == ci3.GetKey()).Single();

            Assert.IsTrue(DirectAndIndirectDependencies(ca1).Contains(ca3), "Concept application ca3 should be included in direct or indirect dependencies of ca1.");
        }
示例#2
0
        public void ExtractDependenciesFromConceptInfosTest()
        {
            var a  = CreateBaseCiApplication("A");
            var b  = CreateBaseCiApplication("B");
            var c  = CreateBaseCiApplication("C");
            var r1 = MultipleReferencingCi.CreateApplication("1", a, b);
            var r2 = MultipleReferencingCi.CreateApplication("2", b, c);
            var r3 = MultipleReferencingCi.CreateApplication("3", r1, r2);
            var r5 = MultipleReferencingCi.CreateApplication("5", c, c);
            var r4 = MultipleReferencingCi.CreateApplication("4", c, r5);

            var conceptImplementations = new PluginsMetadataList <IConceptDatabaseDefinition>
            {
                new NullImplementation(),
                { new SimpleConceptImplementation(), typeof(SimpleCi) },
            };

            var all = new List <CodeGenerator> {
                a, b, c, r1, r2, r3, r4, r5
            };
            var dependencies = new DatabaseModelDependencies(new ConsoleLogProvider())
                               .ExtractCodeGeneratorDependencies(all, MockDatabasePluginsContainer.Create(conceptImplementations));

            string result = string.Join(" ", dependencies
                                        .Select(d => ((dynamic)d).DependsOn.ConceptInfo.Name + "<" + ((dynamic)d).Dependent.ConceptInfo.Name)
                                        .OrderBy(str => str));

            Console.WriteLine(result);

            Assert.AreEqual("1<3 2<3 5<4 A<1 A<3 B<1 B<2 B<3 C<2 C<3 C<4 C<5", result);
        }
示例#3
0
        public void SortedByMetadataDependsOnAndRemoveSuppressed()
        {
            var conceptImplementations = new PluginsMetadataList <ITestPluginType>
            {
                { new TestPlugin1(), new Dictionary <string, object> {
                      { MefProvider.DependsOn, typeof(TestPlugin3) }
                  } },
                { new TestPlugin2(), new Dictionary <string, object> {
                      { MefProvider.DependsOn, typeof(TestPlugin1) }
                  } },
                { new TestPlugin3(), new Dictionary <string, object> {
                  } },
            };
            Lazy <IEnumerable <Meta <ITestPluginType> > > pluginsWithMetadata = new Lazy <IEnumerable <Meta <ITestPluginType> > >(() =>
                                                                                                                                  conceptImplementations.Select(pm => new Meta <ITestPluginType>(pm.Plugin, pm.Metadata)));

            var plugins         = new ITestPluginType[] { new TestPlugin1(), new TestPlugin2(), new TestPlugin3() };
            var suppressPlugins = new StubIndex <SuppressPlugin>(new PluginsMetadataList <SuppressPlugin> {
                { new SuppressPlugin(typeof(TestPlugin1)), typeof(ITestPluginType) }
            });
            var pmc           = new PluginsMetadataCache <ITestPluginType>(pluginsWithMetadata, suppressPlugins);
            var sortedPlugins = pmc.SortedByMetadataDependsOnAndRemoveSuppressed(this.GetType(), plugins);

            Assert.AreEqual("TestPlugin3, TestPlugin2", TestUtility.Dump(sortedPlugins, p => p.GetType().Name));
        }
        public static PluginsContainer <IConceptDatabaseDefinition> Create(PluginsMetadataList <IConceptDatabaseDefinition> conceptImplementations = null)
        {
            if (conceptImplementations == null)
            {
                conceptImplementations = new PluginsMetadataList <IConceptDatabaseDefinition>();
            }

            Lazy <IEnumerable <IConceptDatabaseDefinition> > plugins = new Lazy <IEnumerable <IConceptDatabaseDefinition> >(() =>
                                                                                                                            conceptImplementations.Select(pm => pm.Plugin));
            Lazy <IEnumerable <Meta <IConceptDatabaseDefinition> > > pluginsWithMetadata = new Lazy <IEnumerable <Meta <IConceptDatabaseDefinition> > >(() =>
                                                                                                                                                        conceptImplementations.Select(pm => new Meta <IConceptDatabaseDefinition>(pm.Plugin, pm.Metadata)));
            Lazy <IIndex <Type, IEnumerable <IConceptDatabaseDefinition> > > pluginsByImplementation = new Lazy <IIndex <Type, IEnumerable <IConceptDatabaseDefinition> > >(() =>
                                                                                                                                                                            new StubIndex <IConceptDatabaseDefinition>(conceptImplementations));

            return(new PluginsContainer <IConceptDatabaseDefinition>(plugins, pluginsByImplementation, new PluginsMetadataCache <IConceptDatabaseDefinition>(pluginsWithMetadata, new StubIndex <SuppressPlugin>())));
        }
        private List <DatabaseObject> CreateConceptApplications(params IConceptInfo[] concepts)
        {
            var implementations = new PluginsMetadataList <IConceptDatabaseDefinition>()
            {
                new NullImplementation(),
                { new SimpleImplementation(), typeof(SimpleConcept) },
                { new ReferenceImplementation(), typeof(ReferenceConcept) },
                { new ReferenceReferenceImplementation(), typeof(ReferenceReferenceConcept) },
            };

            var databaseModelBuilder = new DatabaseModelBuilder(
                MockDatabasePluginsContainer.Create(implementations),
                new MockDslModel(concepts),
                new ConsoleLogProvider(),
                new DatabaseModelDependencies(new ConsoleLogProvider()));

            var conceptApplications = databaseModelBuilder.CreateDatabaseModel().DatabaseObjects;

            Console.WriteLine("ConceptApplications:"
                              + string.Concat(conceptApplications.Select(ca => $"\r\n- {ca}, depends on: {string.Join(", ", ca.DependsOn.Select(d => d.ToString()))}.")));
            return(conceptApplications);
        }
示例#6
0
        public static PluginsContainer <IConceptDatabaseDefinition> CreatePluginsContainer(PluginsMetadataList <IConceptDatabaseDefinition> pluginsWithMedata)
        {
            Lazy <IEnumerable <IConceptDatabaseDefinition> > plugins = new Lazy <IEnumerable <IConceptDatabaseDefinition> >(() =>
                                                                                                                            pluginsWithMedata.Select(pm => pm.Item1));
            Lazy <IEnumerable <Meta <IConceptDatabaseDefinition> > > pluginsWithMetadata = new Lazy <IEnumerable <Meta <IConceptDatabaseDefinition> > >(() =>
                                                                                                                                                        pluginsWithMedata.Select(pm => new Meta <IConceptDatabaseDefinition>(pm.Item1, pm.Item2)));
            Lazy <IIndex <Type, IEnumerable <IConceptDatabaseDefinition> > > pluginsByImplementation = new Lazy <IIndex <Type, IEnumerable <IConceptDatabaseDefinition> > >(() =>
                                                                                                                                                                            new StubIndex <IConceptDatabaseDefinition>(pluginsWithMedata));

            return(new PluginsContainer <IConceptDatabaseDefinition>(plugins, pluginsByImplementation, new PluginsMetadataCache <IConceptDatabaseDefinition>(pluginsWithMetadata, new StubIndex <SuppressPlugin>())));
        }
示例#7
0
 public StubIndex()
 {
     _pluginsWithMedata = new PluginsMetadataList <TPlugin>();
 }
示例#8
0
 public StubIndex(PluginsMetadataList <TPlugin> pluginsWithMedata)
 {
     _pluginsWithMedata = pluginsWithMedata;
 }
示例#9
0
 public StubIndex(PluginsMetadataList pluginsWithMedata)
 {
     this.pluginsWithMedata = pluginsWithMedata;
 }