Index: Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Forms/Views/ClosingStructuresFailureMechanismView.cs =================================================================== diff -u -r1da3afdee9bf535e09063ac003a188f95669d94b -raa560cbfa0ef023ada5d84652b6c7121370b561c --- Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Forms/Views/ClosingStructuresFailureMechanismView.cs (.../ClosingStructuresFailureMechanismView.cs) (revision 1da3afdee9bf535e09063ac003a188f95669d94b) +++ Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Forms/Views/ClosingStructuresFailureMechanismView.cs (.../ClosingStructuresFailureMechanismView.cs) (revision aa560cbfa0ef023ada5d84652b6c7121370b561c) @@ -158,88 +158,165 @@ private void CreateObservers() { - failureMechanismObserver = new Observer(UpdateMapData) + failureMechanismObserver = new Observer(UpdateSectionsMapData) { Observable = FailureMechanism }; - assessmentSectionObserver = new Observer(UpdateMapData) + assessmentSectionObserver = new Observer(UpdateReferenceLineMapData) { Observable = AssessmentSection }; - hydraulicBoundaryLocationsObserver = new Observer(UpdateMapData) + hydraulicBoundaryLocationsObserver = new Observer(UpdateHydraulicBoundaryLocationsMapData) { Observable = AssessmentSection.HydraulicBoundaryDatabase.Locations }; - foreshoreProfilesObserver = new Observer(UpdateMapData) + foreshoreProfilesObserver = new Observer(UpdateForeshoreProfilesMapData) { Observable = FailureMechanism.ForeshoreProfiles }; - structuresObserver = new Observer(UpdateMapData) + structuresObserver = new Observer(UpdateStructuresMapData) { Observable = FailureMechanism.ClosingStructures }; hydraulicBoundaryLocationObserver = new RecursiveObserver, HydraulicBoundaryLocation>( - UpdateMapData, hbl => hbl) + UpdateHydraulicBoundaryLocationsMapData, hbl => hbl) { Observable = AssessmentSection.HydraulicBoundaryDatabase.Locations }; calculationInputObserver = new RecursiveObserver( - UpdateMapData, pcg => pcg.Children.Concat(pcg.Children.OfType>() + UpdateCalculationsMapData, pcg => pcg.Children.Concat(pcg.Children.OfType>() .Select(pc => pc.InputParameters))) { Observable = FailureMechanism.CalculationsGroup }; - calculationGroupObserver = new RecursiveObserver(UpdateMapData, pcg => pcg.Children) + calculationGroupObserver = new RecursiveObserver(UpdateCalculationsMapData, pcg => pcg.Children) { Observable = FailureMechanism.CalculationsGroup }; - calculationObserver = new RecursiveObserver>(UpdateMapData, pcg => pcg.Children) + calculationObserver = new RecursiveObserver>(UpdateCalculationsMapData, pcg => pcg.Children) { Observable = FailureMechanism.CalculationsGroup }; - foreshoreProfileObserver = new RecursiveObserver(UpdateMapData, coll => coll) + foreshoreProfileObserver = new RecursiveObserver(UpdateForeshoreProfilesMapData, coll => coll) { Observable = FailureMechanism.ForeshoreProfiles }; - structureObserver = new RecursiveObserver, ClosingStructure>(UpdateMapData, coll => coll) + structureObserver = new RecursiveObserver, ClosingStructure>(UpdateStructuresMapData, coll => coll) { Observable = FailureMechanism.ClosingStructures }; } - private void UpdateMapData() + private void SetMapDataFeatures() { - SetMapDataFeatures(); + SetReferenceLineMapData(); + SetSectionsMapData(); + SetHydraulicBoundaryLocationsMapData(); + SetForeshoreProfilesMapData(); + SetStructuresMapData(); + SetCalculationsMapData(); + } + #region Calculations MapData + + private void UpdateCalculationsMapData() + { + SetCalculationsMapData(); + calculationsMapData.NotifyObservers(); + } + + private void SetCalculationsMapData() + { + IEnumerable> calculations = + FailureMechanism.CalculationsGroup.GetCalculations().Cast>(); + calculationsMapData.Features = RingtoetsMapDataFeaturesFactory.CreateStructureCalculationsFeatures(calculations); + } + + #endregion + + #region HydraulicBoundaryLocations MapData + + private void UpdateHydraulicBoundaryLocationsMapData() + { + SetHydraulicBoundaryLocationsMapData(); + hydraulicBoundaryLocationsMapData.NotifyObservers(); + } + + private void SetHydraulicBoundaryLocationsMapData() + { + hydraulicBoundaryLocationsMapData.Features = RingtoetsMapDataFeaturesFactory.CreateHydraulicBoundaryDatabaseFeatures(AssessmentSection.HydraulicBoundaryDatabase); + } + + #endregion + + #region ReferenceLine MapData + + private void UpdateReferenceLineMapData() + { + SetReferenceLineMapData(); referenceLineMapData.NotifyObservers(); + } + + private void SetReferenceLineMapData() + { + ReferenceLine referenceLine = AssessmentSection.ReferenceLine; + referenceLineMapData.Features = RingtoetsMapDataFeaturesFactory.CreateReferenceLineFeatures(referenceLine, AssessmentSection.Id, AssessmentSection.Name); + } + + #endregion + + #region Sections MapData + + private void UpdateSectionsMapData() + { + SetSectionsMapData(); sectionsMapData.NotifyObservers(); sectionsStartPointMapData.NotifyObservers(); sectionsEndPointMapData.NotifyObservers(); - hydraulicBoundaryLocationsMapData.NotifyObservers(); - foreshoreProfilesMapData.NotifyObservers(); - structuresMapData.NotifyObservers(); - calculationsMapData.NotifyObservers(); } - private void SetMapDataFeatures() + private void SetSectionsMapData() { - ReferenceLine referenceLine = AssessmentSection.ReferenceLine; IEnumerable failureMechanismSections = FailureMechanism.Sections; - HydraulicBoundaryDatabase hydraulicBoundaryDatabase = AssessmentSection.HydraulicBoundaryDatabase; - IEnumerable foreshoreProfiles = FailureMechanism.ForeshoreProfiles; - IEnumerable structures = FailureMechanism.ClosingStructures; - IEnumerable> calculations = - FailureMechanism.CalculationsGroup.GetCalculations().Cast>(); - referenceLineMapData.Features = RingtoetsMapDataFeaturesFactory.CreateReferenceLineFeatures(referenceLine, AssessmentSection.Id, AssessmentSection.Name); sectionsMapData.Features = RingtoetsMapDataFeaturesFactory.CreateFailureMechanismSectionFeatures(failureMechanismSections); sectionsStartPointMapData.Features = RingtoetsMapDataFeaturesFactory.CreateFailureMechanismSectionStartPointFeatures(failureMechanismSections); sectionsEndPointMapData.Features = RingtoetsMapDataFeaturesFactory.CreateFailureMechanismSectionEndPointFeatures(failureMechanismSections); - hydraulicBoundaryLocationsMapData.Features = RingtoetsMapDataFeaturesFactory.CreateHydraulicBoundaryDatabaseFeatures(hydraulicBoundaryDatabase); - foreshoreProfilesMapData.Features = RingtoetsMapDataFeaturesFactory.CreateForeshoreProfilesFeatures(foreshoreProfiles); + } + + #endregion + + #region Structures MapData + + private void UpdateStructuresMapData() + { + SetStructuresMapData(); + structuresMapData.NotifyObservers(); + } + + private void SetStructuresMapData() + { + IEnumerable structures = FailureMechanism.ClosingStructures; structuresMapData.Features = RingtoetsMapDataFeaturesFactory.CreateStructuresFeatures(structures); - calculationsMapData.Features = RingtoetsMapDataFeaturesFactory.CreateStructureCalculationsFeatures(calculations); } + + #endregion + + #region Foreshore Profiles MapData + + private void UpdateForeshoreProfilesMapData() + { + SetForeshoreProfilesMapData(); + foreshoreProfilesMapData.NotifyObservers(); + } + + private void SetForeshoreProfilesMapData() + { + IEnumerable foreshoreProfiles = FailureMechanism.ForeshoreProfiles; + foreshoreProfilesMapData.Features = RingtoetsMapDataFeaturesFactory.CreateForeshoreProfilesFeatures(foreshoreProfiles); + } + + #endregion } } \ No newline at end of file Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/Views/ClosingStructuresFailureMechanismViewTest.cs =================================================================== diff -u -r1da3afdee9bf535e09063ac003a188f95669d94b -raa560cbfa0ef023ada5d84652b6c7121370b561c --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/Views/ClosingStructuresFailureMechanismViewTest.cs (.../ClosingStructuresFailureMechanismViewTest.cs) (revision 1da3afdee9bf535e09063ac003a188f95669d94b) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/Views/ClosingStructuresFailureMechanismViewTest.cs (.../ClosingStructuresFailureMechanismViewTest.cs) (revision aa560cbfa0ef023ada5d84652b6c7121370b561c) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.Linq; using System.Windows.Forms; +using Core.Common.Base; using Core.Common.Base.Geometry; using Core.Components.Gis.Data; using Core.Components.Gis.Features; @@ -237,6 +238,11 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[hydraulicBoundaryLocationsIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + MapData hydraulicBoundaryLocationsMapData = map.Data.Collection.ElementAt(hydraulicBoundaryLocationsIndex); // Precondition @@ -248,6 +254,7 @@ // Then MapDataTestHelper.AssertHydraulicBoundaryLocationsMapData(assessmentSection.HydraulicBoundaryDatabase.Locations, hydraulicBoundaryLocationsMapData); + mocks.VerifyAll(); } } @@ -272,6 +279,11 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[hydraulicBoundaryLocationsIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + MapData hydraulicBoundaryLocationsMapData = map.Data.Collection.ElementAt(hydraulicBoundaryLocationsIndex); // Precondition @@ -292,6 +304,7 @@ // Then MapDataTestHelper.AssertHydraulicBoundaryLocationOutputsMapData(assessmentSection.HydraulicBoundaryDatabase.Locations, hydraulicBoundaryLocationsMapData); + mocks.VerifyAll(); } } @@ -313,6 +326,11 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[referenceLineIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + MapData referenceLineMapData = map.Data.Collection.ElementAt(referenceLineIndex); // Precondition @@ -328,6 +346,7 @@ // Then MapDataTestHelper.AssertReferenceLineMapData(assessmentSection.ReferenceLine, referenceLineMapData); + mocks.VerifyAll(); } } @@ -341,6 +360,13 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[sectionsIndex].Expect(obs => obs.UpdateObserver()); + observers[sectionsStartPointIndex].Expect(obs => obs.UpdateObserver()); + observers[sectionsEndPointIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + var sectionMapData = (MapLineData) map.Data.Collection.ElementAt(sectionsIndex); var sectionStartsMapData = (MapPointData) map.Data.Collection.ElementAt(sectionsStartPointIndex); var sectionsEndsMapData = (MapPointData) map.Data.Collection.ElementAt(sectionsEndPointIndex); @@ -357,6 +383,7 @@ MapDataTestHelper.AssertFailureMechanismSectionsMapData(failureMechanism.Sections, sectionMapData); MapDataTestHelper.AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, sectionStartsMapData); MapDataTestHelper.AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, sectionsEndsMapData); + mocks.VerifyAll(); } } @@ -379,6 +406,11 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[foreshoreProfilesIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + MapData foreshoreProfileData = map.Data.Collection.ElementAt(foreshoreProfilesIndex); // Precondition @@ -395,6 +427,7 @@ // Then MapDataTestHelper.AssertForeshoreProfilesMapData(failureMechanism.ForeshoreProfiles, foreshoreProfileData); + mocks.VerifyAll(); } } @@ -416,6 +449,11 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[foreshoreProfilesIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + MapData foreshoreProfileData = map.Data.Collection.ElementAt(foreshoreProfilesIndex); // Precondition @@ -434,36 +472,44 @@ // Then MapDataTestHelper.AssertForeshoreProfilesMapData(failureMechanism.ForeshoreProfiles, foreshoreProfileData); + mocks.VerifyAll(); } } [Test] public void GivenViewWithStructureData_WhenStructureUpdatedAndNotified_ThenMapDataUpdated() { // Given + var structure = new TestClosingStructure(new Point2D(0, 0), "Id"); var failureMechanism = new ClosingStructuresFailureMechanism(); failureMechanism.ClosingStructures.AddRange(new[] { - new TestClosingStructure(new Point2D(0, 0), "Id") + structure }, "path"); using (var view = new ClosingStructuresFailureMechanismView(failureMechanism, new ObservableTestAssessmentSectionStub())) { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[structuresIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + MapData structuresData = map.Data.Collection.ElementAt(structuresIndex); // Precondition MapDataTestHelper.AssertStructuresMapData(failureMechanism.ClosingStructures, structuresData); // When - new TestClosingStructure(new Point2D(0, 0), "Id").CopyProperties(new TestClosingStructure(new Point2D(1, 1), "Id")); - new TestClosingStructure(new Point2D(0, 0), "Id").NotifyObservers(); + structure.CopyProperties(new TestClosingStructure(new Point2D(1, 1), "Id")); + structure.NotifyObservers(); // Then MapDataTestHelper.AssertStructuresMapData(failureMechanism.ClosingStructures, structuresData); + mocks.VerifyAll(); } } @@ -481,6 +527,11 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[structuresIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + MapData structuresData = map.Data.Collection.ElementAt(structuresIndex); // Precondition @@ -497,6 +548,7 @@ // Then MapDataTestHelper.AssertStructuresMapData(failureMechanism.ClosingStructures, structuresData); + mocks.VerifyAll(); } } @@ -520,6 +572,11 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[calculationsIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + var calculationMapData = (MapLineData) map.Data.Collection.ElementAt(calculationsIndex); // Precondition @@ -541,6 +598,7 @@ // Then AssertCalculationsMapData(failureMechanism.Calculations.Cast>(), calculationMapData); + mocks.VerifyAll(); } } @@ -563,6 +621,11 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[calculationsIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + var calculationMapData = (MapLineData) map.Data.Collection.ElementAt(calculationsIndex); // Precondition @@ -575,6 +638,7 @@ // Then AssertCalculationsMapData(failureMechanism.Calculations.Cast>(), calculationMapData); + mocks.VerifyAll(); } } @@ -598,6 +662,11 @@ { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[calculationsIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + var calculationMapData = (MapLineData) map.Data.Collection.ElementAt(calculationsIndex); // Precondition @@ -610,6 +679,7 @@ // Then AssertCalculationsMapData(failureMechanism.Calculations.Cast>(), calculationMapData); + mocks.VerifyAll(); } } @@ -763,5 +833,53 @@ Assert.AreEqual("Hydraulische randvoorwaarden", hydraulicBoundaryLocationsMapData.Name); Assert.AreEqual("Berekeningen", calculationsMapData.Name); } + + /// + /// Attaches mocked observers to all map data components. + /// + /// The . + /// The map data collection containing the + /// elements. + /// An array of mocked observers attached to the data in . + private static IObserver[] AttachMapDataObservers(MockRepository mocks, IEnumerable mapData) + { + MapData[] mapDataArray = mapData.ToArray(); + + var referenceLineMapDataObserver = mocks.StrictMock(); + mapDataArray[referenceLineIndex].Attach(referenceLineMapDataObserver); + + var sectionsMapDataObserver = mocks.StrictMock(); + mapDataArray[sectionsIndex].Attach(sectionsMapDataObserver); + + var sectionsStartPointMapDataObserver = mocks.StrictMock(); + mapDataArray[sectionsStartPointIndex].Attach(sectionsStartPointMapDataObserver); + + var sectionsEndPointMapDataObserver = mocks.StrictMock(); + mapDataArray[sectionsEndPointIndex].Attach(sectionsEndPointMapDataObserver); + + var hydraulicBoundaryLocationsMapDataObserver = mocks.StrictMock(); + mapDataArray[hydraulicBoundaryLocationsIndex].Attach(hydraulicBoundaryLocationsMapDataObserver); + + var foreshoreProfilesMapDataObserver = mocks.StrictMock(); + mapDataArray[foreshoreProfilesIndex].Attach(foreshoreProfilesMapDataObserver); + + var structuresMapDataObserver = mocks.StrictMock(); + mapDataArray[structuresIndex].Attach(structuresMapDataObserver); + + var calculationsMapDataObserver = mocks.StrictMock(); + mapDataArray[calculationsIndex].Attach(calculationsMapDataObserver); + + return new[] + { + referenceLineMapDataObserver, + sectionsMapDataObserver, + sectionsStartPointMapDataObserver, + sectionsEndPointMapDataObserver, + hydraulicBoundaryLocationsMapDataObserver, + foreshoreProfilesMapDataObserver, + structuresMapDataObserver, + calculationsMapDataObserver + }; + } } } \ No newline at end of file