コード例 #1
0
        public void DatabaseGenerator_UnchangedMiddleReference()
        {
            var aold = SimpleCi.CreateApplication("a", "old");
            var b1   = ReferencingCi.CreateApplication("b", aold);
            var c1   = ReferenceToReferencingCi.CreateApplication("c", b1);
            var anew = SimpleCi.CreateApplication("a", "new");
            var b2   = ReferencingCi.CreateApplication("b", anew);
            var c2   = ReferenceToReferencingCi.CreateApplication("c", b2);

            var oldApplications = new List <ConceptApplication> {
                aold, c1
            };                                                               // A and C have database generator implementations, but B doesn't.
            var newApplications = new List <NewConceptApplication> {
                c2, anew
            };

            List <ConceptApplication>    toBeRemoved;
            List <NewConceptApplication> toBeInserted;

            TestDatabaseGenerator(oldApplications, newApplications, out toBeRemoved, out toBeInserted);

            Assert.AreEqual(2, toBeRemoved.Count);
            Assert.IsTrue(toBeRemoved.IndexOf(c1) < toBeRemoved.IndexOf(aold));
            Assert.AreEqual(2, toBeInserted.Count);
            Assert.IsTrue(toBeInserted.IndexOf(anew) < toBeInserted.IndexOf(c2));
        }
コード例 #2
0
        public void GetConceptApplicationDependencies_SimpleTest()
        {
            IConceptInfo ci1 = new SimpleCi {
                Name = "1"
            };
            IConceptInfo ci2 = new SimpleCi {
                Name = "2"
            };
            ConceptApplication ca1a = new NewConceptApplication(ci1, new SimpleConceptImplementation())
            {
                CreateQuery = "1a"
            };
            ConceptApplication ca1b = new NewConceptApplication(ci1, new SimpleConceptImplementation())
            {
                CreateQuery = "1b"
            };
            ConceptApplication ca2a = new NewConceptApplication(ci2, new SimpleConceptImplementation())
            {
                CreateQuery = "2a"
            };
            ConceptApplication ca2b = new NewConceptApplication(ci2, new SimpleConceptImplementation())
            {
                CreateQuery = "2b"
            };

            IEnumerable <Tuple <IConceptInfo, IConceptInfo, string> > conceptInfoDependencies = new[] { Tuple.Create(ci2, ci1, "") };

            IEnumerable <Dependency> actual = DatabaseGenerator_Accessor.GetConceptApplicationDependencies(conceptInfoDependencies, new[] { ca1a, ca1b, ca2a, ca2b });

            Assert.AreEqual("2a-1a, 2a-1b, 2b-1a, 2b-1b", String.Join(", ", actual.Select(Dump).OrderBy(s => s)));
        }
コード例 #3
0
        public void DatabaseGenerator_RecreatedDependentConceptReferencesNewVersion()
        {
            var simpleV1             = SimpleCi.CreateApplication("name", "v1", "data1");
            var simpleV2             = SimpleCi.CreateApplication("name", "v2", "data2");
            var dependentV1Unchanged = ReferencingCi.CreateApplication("", simpleV1);
            var dependentV2Unchanged = ReferencingCi.CreateApplication("", simpleV2);

            Assert.IsTrue(dependentV1Unchanged.GetConceptApplicationKey().Equals(dependentV2Unchanged.GetConceptApplicationKey()), "Test initialization: Dependent concept has not changed, the referenced concept has changed (different concept key).");

            var oldApplications = new List <ConceptApplication> {
                simpleV1, dependentV1Unchanged
            };
            var newApplications = new List <NewConceptApplication> {
                simpleV2, dependentV2Unchanged
            };

            List <ConceptApplication>    toBeRemoved;
            List <NewConceptApplication> toBeInserted;

            TestDatabaseGenerator(oldApplications, newApplications, out toBeRemoved, out toBeInserted);

            var removedReferencing  = (ReferencingCi)toBeRemoved.Select(ca => ((NewConceptApplication)ca).ConceptInfo).First(ci => ci is ReferencingCi);
            var insertedReferencing = (ReferencingCi)toBeInserted.Select(ca => ca.ConceptInfo).First(ci => ci is ReferencingCi);

            Assert.AreEqual("data1", removedReferencing.Reference.Data, "Removed reference should point to old version of changed concept.");
            Assert.AreEqual("data2", insertedReferencing.Reference.Data, "Inserted reference should point to new version of changed concept.");
        }
コード例 #4
0
        public void DatabaseGenerator_MustRecreateDependentConceptInCorrectOrder()
        {
            var simpleV1         = SimpleCi.CreateApplication("v1");
            var simpleV2         = SimpleCi.CreateApplication("v2");
            var dependent        = ReferencingCi.CreateApplication("", simpleV1);
            var secondReference1 = ReferenceToReferencingCi.CreateApplication("1", dependent);
            var secondReference2 = ReferenceToReferencingCi.CreateApplication("2", dependent);

            var oldApplications = new List <ConceptApplication> {
                simpleV1, dependent, secondReference1
            };
            var newApplications = new List <NewConceptApplication> {
                simpleV2, dependent, secondReference2
            };

            List <ConceptApplication>    toBeRemoved;
            List <NewConceptApplication> toBeInserted;

            TestDatabaseGenerator(oldApplications, newApplications, out toBeRemoved, out toBeInserted);

            Assert.AreEqual(3, toBeRemoved.Count);
            Assert.IsTrue(toBeRemoved.IndexOf(dependent) < toBeRemoved.IndexOf(simpleV1));
            Assert.IsTrue(toBeRemoved.IndexOf(secondReference1) < toBeRemoved.IndexOf(dependent));
            Assert.AreEqual(3, toBeInserted.Count);
            Assert.IsTrue(toBeInserted.IndexOf(dependent) > toBeInserted.IndexOf(simpleV2));
            Assert.IsTrue(toBeInserted.IndexOf(secondReference2) > toBeInserted.IndexOf(dependent));
        }
コード例 #5
0
        public void DatabaseGenerator_MustRecreateDependentConceptWhereBaseIsCreatedAndDeletedWithSameKey()
        {
            var simpleC1             = SimpleCi.CreateApplication("same", new SimpleConceptImplementation());
            var simpleC2             = SimpleCi.CreateApplication("same", new DependentConceptImplementation());
            var dependentC1Unchanged = ReferencingCi.CreateApplication("", simpleC1);
            var dependentC2Unchanged = ReferencingCi.CreateApplication("", simpleC2);

            Assert.IsTrue(dependentC1Unchanged.GetConceptApplicationKey().Equals(dependentC2Unchanged.GetConceptApplicationKey()), "Test initialization: Dependent concept has not changed, the referenced concept has changed (different implementation, same concept key).");

            var oldApplications = new List <ConceptApplication> {
                simpleC1, dependentC1Unchanged
            };
            var newApplications = new List <NewConceptApplication> {
                simpleC2, dependentC2Unchanged
            };

            List <ConceptApplication>    toBeRemoved;
            List <NewConceptApplication> toBeInserted;

            TestDatabaseGenerator(oldApplications, newApplications, out toBeRemoved, out toBeInserted);

            Assert.AreEqual(2, toBeRemoved.Count);
            Assert.IsTrue(toBeRemoved.Contains(simpleC1));
            Assert.IsTrue(toBeRemoved.Contains(dependentC1Unchanged));
            Assert.AreEqual(2, toBeInserted.Count);
            Assert.IsTrue(toBeInserted.Contains(simpleC2));
            Assert.IsTrue(toBeInserted.Contains(dependentC2Unchanged));

            var removedReferencing  = toBeRemoved.Select(ca => ((NewConceptApplication)ca).ConceptInfo).OfType <ReferencingCi>().Single();
            var insertedReferencing = toBeInserted.Select(ca => ca.ConceptInfo).OfType <ReferencingCi>().Single();

            Assert.AreNotSame(simpleC1.ConceptInfo, simpleC2.ConceptInfo);
            Assert.AreSame(simpleC1.ConceptInfo, removedReferencing.Reference, "Removed reference should point to old version of changed concept.");
            Assert.AreSame(simpleC2.ConceptInfo, insertedReferencing.Reference, "Inserted reference should point to new version of changed concept.");
        }
コード例 #6
0
        public void DatabaseGenerator_MustRecreateDependentConcept()
        {
            var simpleV1  = SimpleCi.CreateApplication("v1");
            var simpleV2  = SimpleCi.CreateApplication("v2");
            var dependent = ReferencingCi.CreateApplication("", simpleV1);

            var oldApplications = new List <ConceptApplication> {
                simpleV1, dependent
            };
            var newApplications = new List <NewConceptApplication> {
                simpleV2, dependent
            };

            List <ConceptApplication>    toBeRemoved;
            List <NewConceptApplication> toBeInserted;

            TestDatabaseGenerator(oldApplications, newApplications, out toBeRemoved, out toBeInserted);

            Assert.AreEqual(2, toBeRemoved.Count);
            Assert.IsTrue(toBeRemoved.Contains(simpleV1));
            Assert.IsTrue(toBeRemoved.Contains(dependent));
            Assert.AreEqual(2, toBeInserted.Count);
            Assert.IsTrue(toBeInserted.Contains(simpleV2));
            Assert.IsTrue(toBeInserted.Contains(dependent));
        }
コード例 #7
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.");
        }
コード例 #8
0
        public void GetConceptApplicationDependencies_SimpleTest()
        {
            IConceptInfo ci1 = new SimpleCi {
                Name = "1"
            };
            IConceptInfo ci2 = new SimpleCi {
                Name = "2"
            };
            CodeGenerator ca1a = new CodeGenerator(ci1, new SimpleConceptImplementation());
            CodeGenerator ca1b = new CodeGenerator(ci1, new SimpleConceptImplementation());
            CodeGenerator ca2a = new CodeGenerator(ci2, new SimpleConceptImplementation());
            CodeGenerator ca2b = new CodeGenerator(ci2, new SimpleConceptImplementation());

            var names = new Dictionary <int, string>
            {
                { ca1a.Id, "1a" },
                { ca1b.Id, "1b" },
                { ca2a.Id, "2a" },
                { ca2b.Id, "2b" },
            };

            var conceptInfoDependencies = new[] { Tuple.Create(ci2, ci1) };

            var actual = new DatabaseModelDependencies(new ConsoleLogProvider())
                         .ConceptDependencyToCodeGeneratorsDependency(conceptInfoDependencies, new[] { ca1a, ca1b, ca2a, ca2b });

            Assert.AreEqual(
                "2a-1a, 2a-1b, 2b-1a, 2b-1b",
                string.Join(", ", actual
                            .Select(d => names[d.DependsOn.Id] + "-" + names[d.Dependent.Id])
                            .OrderBy(s => s)));
        }
コード例 #9
0
        public void DatabaseGenerator_NoChange()
        {
            var oldApplications = new List <ConceptApplication> {
                SimpleCi.CreateApplication("unchanged")
            };
            var newApplications = new List <NewConceptApplication> {
                SimpleCi.CreateApplication("unchanged")
            };

            List <ConceptApplication>    toBeRemoved;
            List <NewConceptApplication> toBeInserted;

            TestDatabaseGenerator(oldApplications, newApplications, out toBeRemoved, out toBeInserted);

            Assert.AreEqual(0, toBeRemoved.Count);
            Assert.AreEqual(0, toBeInserted.Count);
        }
コード例 #10
0
        public void DatabaseGenerator_SimpleChange()
        {
            var oldApplications = new List <ConceptApplication> {
                SimpleCi.CreateApplication("A", "old"), SimpleCi.CreateApplication("B", "unchanged")
            };
            var newApplications = new List <NewConceptApplication> {
                SimpleCi.CreateApplication("B", "unchanged"), SimpleCi.CreateApplication("A", "new")
            };

            List <ConceptApplication>    toBeRemoved;
            List <NewConceptApplication> toBeInserted;

            TestDatabaseGenerator(oldApplications, newApplications, out toBeRemoved, out toBeInserted);

            Assert.AreEqual(1, toBeRemoved.Count);
            Assert.AreEqual(1, toBeInserted.Count);
            Assert.AreEqual(SimpleCi.CreateApplication("A", "old").ConceptInfo.GetFullDescription(), ((NewConceptApplication)toBeRemoved[0]).ConceptInfo.GetFullDescription());
            Assert.AreEqual(SimpleCi.CreateApplication("A", "new").ConceptInfo.GetFullDescription(), toBeInserted[0].ConceptInfo.GetFullDescription());
        }
コード例 #11
0
        public void CreateNewApplications_MissingMiddleApplications()
        {
            IConceptInfo ci1 = new SimpleCi {
                Name = "1"
            };
            IConceptInfo ci2 = new SimpleCi2 {
                Name = "2"
            };
            IConceptInfo ci3 = new SimpleCi3 {
                Name = "3"
            };

            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 plugins = CreatePluginsContainer(new PluginsMetadataList <IConceptDatabaseDefinition>
            {
                new NullImplementation(),
                { new SimpleConceptImplementation(), new Dictionary <string, object> {
                      { "Implements", typeof(SimpleCi) }
                  } },
                { new ExtendingConceptImplementation(), new Dictionary <string, object> {
                      { "Implements", typeof(SimpleCi3) }
                  } }
            });

            DatabaseGenerator_Accessor databaseGenerator = new DatabaseGenerator_Accessor(dslModel, plugins);
            var createdApplications = databaseGenerator.CreateNewApplications(new List <ConceptApplication>());

            tempConceptInfoDependencies = null;

            var ca1 = createdApplications.Where(ca => ca.ConceptInfo == ci1).Single();
            var ca3 = createdApplications.Where(ca => ca.ConceptInfo == ci3).Single();

            Assert.IsTrue(DirectAndIndirectDependencies(ca1).Contains(ca3), "Concept application ca3 should be included in direct or indirect dependencies of ca1.");
        }
コード例 #12
0
        public void DatabaseGenerator_MustRecreateDependentConceptWithNewConceptInfoReference()
        {
            var simple1a = SimpleCi.CreateApplication("a", "sqla1");
            var simple1b = SimpleCi.CreateApplication("b", "sqlb");
            var simple2a = SimpleCi.CreateApplication("a", "sqla2");          // Object modified in version 2.
            var simple2b = SimpleCi.CreateApplication("b", "sqlb", simple2a); // Adding a dependency that did not exist in the version 1.

            var oldApplications = new List <ConceptApplication> {
                simple1a, simple1b
            };
            var newApplications = new List <NewConceptApplication> {
                simple2a, simple2b
            };

            List <ConceptApplication>    toBeRemoved;
            List <NewConceptApplication> toBeInserted;

            TestDatabaseGenerator(oldApplications, newApplications, out toBeRemoved, out toBeInserted, computeDependencies: false);

            Assert.AreEqual(2, toBeRemoved.Count);
            Assert.AreEqual(2, toBeInserted.Count);
        }