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)); }
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))); }
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."); }
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)); }
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."); }
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)); }
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."); }
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))); }
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); }
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()); }
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."); }
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); }