Index: Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Forms/Views/GrassCoverErosionOutwardsFailureMechanismView.cs =================================================================== diff -u -r8d2450c4255d130362fc2bd4a9acc574393e343d -r392816db801f7722e20b8a67c919d0cb824bd672 --- Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Forms/Views/GrassCoverErosionOutwardsFailureMechanismView.cs (.../GrassCoverErosionOutwardsFailureMechanismView.cs) (revision 8d2450c4255d130362fc2bd4a9acc574393e343d) +++ Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Forms/Views/GrassCoverErosionOutwardsFailureMechanismView.cs (.../GrassCoverErosionOutwardsFailureMechanismView.cs) (revision 392816db801f7722e20b8a67c919d0cb824bd672) @@ -45,15 +45,21 @@ /// public partial class GrassCoverErosionOutwardsFailureMechanismView : UserControl, IMapView { - private readonly MapLineData referenceLineMapData; - private readonly MapPointData hydraulicBoundaryLocationsMapData; - private readonly MapLineData foreshoreProfilesMapData; - private readonly MapLineData calculationsMapData; + private MapDataCollection mapDataCollection; + private MapLineData referenceLineMapData; + private MapPointData hydraulicBoundaryLocationsMapData; + private MapLineData foreshoreProfilesMapData; + private MapLineData calculationsMapData; - private readonly MapLineData sectionsMapData; - private readonly MapPointData sectionsStartPointMapData; - private readonly MapPointData sectionsEndPointMapData; + private MapLineData sectionsMapData; + private MapPointData sectionsStartPointMapData; + private MapPointData sectionsEndPointMapData; + private MapLineData simpleAssemblyMapData; + private MapLineData detailedAssemblyMapData; + private MapLineData tailorMadeAssemblyMapData; + private MapLineData combinedAssemblyMapData; + private Observer failureMechanismObserver; private Observer assessmentSectionObserver; private Observer hydraulicBoundaryLocationsObserver; @@ -73,6 +79,7 @@ private RecursiveObserver calculationGroupObserver; private RecursiveObserver calculationObserver; private RecursiveObserver foreshoreProfileObserver; + private RecursiveObserver, GrassCoverErosionOutwardsFailureMechanismSectionResult> sectionResultObserver; /// /// Creates a new instance of . @@ -100,28 +107,7 @@ CreateObservers(); - var mapDataCollection = new MapDataCollection(GrassCoverErosionOutwardsDataResources.GrassCoverErosionOutwardsFailureMechanism_DisplayName); - referenceLineMapData = RingtoetsMapDataFactory.CreateReferenceLineMapData(); - hydraulicBoundaryLocationsMapData = RingtoetsMapDataFactory.CreateHydraulicBoundaryLocationsMapData(); - foreshoreProfilesMapData = RingtoetsMapDataFactory.CreateForeshoreProfileMapData(); - calculationsMapData = RingtoetsMapDataFactory.CreateCalculationsMapData(); - - MapDataCollection sectionsMapDataCollection = RingtoetsMapDataFactory.CreateSectionsMapDataCollection(); - sectionsMapData = RingtoetsMapDataFactory.CreateFailureMechanismSectionsMapData(); - sectionsStartPointMapData = RingtoetsMapDataFactory.CreateFailureMechanismSectionsStartPointMapData(); - sectionsEndPointMapData = RingtoetsMapDataFactory.CreateFailureMechanismSectionsEndPointMapData(); - - mapDataCollection.Add(referenceLineMapData); - - sectionsMapDataCollection.Add(sectionsMapData); - sectionsMapDataCollection.Add(sectionsStartPointMapData); - sectionsMapDataCollection.Add(sectionsEndPointMapData); - mapDataCollection.Add(sectionsMapDataCollection); - - mapDataCollection.Add(hydraulicBoundaryLocationsMapData); - mapDataCollection.Add(foreshoreProfilesMapData); - mapDataCollection.Add(calculationsMapData); - + CreateMapData(); SetMapDataFeatures(); ringtoetsMapControl.SetAllData(mapDataCollection, AssessmentSection.BackgroundData); } @@ -166,6 +152,7 @@ calculationInputObserver.Dispose(); calculationGroupObserver.Dispose(); calculationObserver.Dispose(); + sectionResultObserver.Dispose(); if (disposing) { @@ -175,13 +162,50 @@ base.Dispose(disposing); } + private void CreateMapData() + { + mapDataCollection = new MapDataCollection(GrassCoverErosionOutwardsDataResources.GrassCoverErosionOutwardsFailureMechanism_DisplayName); + referenceLineMapData = RingtoetsMapDataFactory.CreateReferenceLineMapData(); + hydraulicBoundaryLocationsMapData = RingtoetsMapDataFactory.CreateHydraulicBoundaryLocationsMapData(); + foreshoreProfilesMapData = RingtoetsMapDataFactory.CreateForeshoreProfileMapData(); + calculationsMapData = RingtoetsMapDataFactory.CreateCalculationsMapData(); + + MapDataCollection sectionsMapDataCollection = RingtoetsMapDataFactory.CreateSectionsMapDataCollection(); + sectionsMapData = RingtoetsMapDataFactory.CreateFailureMechanismSectionsMapData(); + sectionsStartPointMapData = RingtoetsMapDataFactory.CreateFailureMechanismSectionsStartPointMapData(); + sectionsEndPointMapData = RingtoetsMapDataFactory.CreateFailureMechanismSectionsEndPointMapData(); + + MapDataCollection assemblyMapDataCollection = AssemblyMapDataFactory.CreateAssemblyMapDataCollection(); + tailorMadeAssemblyMapData = AssemblyMapDataFactory.CreateTailorMadeAssemblyMapData(); + detailedAssemblyMapData = AssemblyMapDataFactory.CreateDetailedAssemblyMapData(); + simpleAssemblyMapData = AssemblyMapDataFactory.CreateSimpleAssemblyMapData(); + combinedAssemblyMapData = AssemblyMapDataFactory.CreateCombinedAssemblyMapData(); + + mapDataCollection.Add(referenceLineMapData); + + sectionsMapDataCollection.Add(sectionsMapData); + sectionsMapDataCollection.Add(sectionsStartPointMapData); + sectionsMapDataCollection.Add(sectionsEndPointMapData); + mapDataCollection.Add(sectionsMapDataCollection); + + assemblyMapDataCollection.Add(tailorMadeAssemblyMapData); + assemblyMapDataCollection.Add(detailedAssemblyMapData); + assemblyMapDataCollection.Add(simpleAssemblyMapData); + assemblyMapDataCollection.Add(combinedAssemblyMapData); + mapDataCollection.Add(assemblyMapDataCollection); + + mapDataCollection.Add(hydraulicBoundaryLocationsMapData); + mapDataCollection.Add(foreshoreProfilesMapData); + mapDataCollection.Add(calculationsMapData); + } + private void CreateObservers() { - failureMechanismObserver = new Observer(UpdateSectionsMapData) + failureMechanismObserver = new Observer(UpdateFailureMechanismData) { Observable = FailureMechanism }; - assessmentSectionObserver = new Observer(UpdateReferenceLineMapData) + assessmentSectionObserver = new Observer(UpdateAssessmentSectionData) { Observable = AssessmentSection }; @@ -233,6 +257,12 @@ { Observable = FailureMechanism.ForeshoreProfiles }; + + sectionResultObserver = new RecursiveObserver, + GrassCoverErosionOutwardsFailureMechanismSectionResult>(UpdateAssemblyMapData, sr => sr) + { + Observable = FailureMechanism.SectionResults + }; } private void SetMapDataFeatures() @@ -242,14 +272,38 @@ SetHydraulicBoundaryLocationsMapData(); SetForeshoreProfilesMapData(); SetCalculationsMapData(); + SetAssemblyMapData(); } + #region Assembly MapData + + private void UpdateAssemblyMapData() + { + SetAssemblyMapData(); + simpleAssemblyMapData.NotifyObservers(); + detailedAssemblyMapData.NotifyObservers(); + tailorMadeAssemblyMapData.NotifyObservers(); + combinedAssemblyMapData.NotifyObservers(); + } + + private void SetAssemblyMapData() + { + simpleAssemblyMapData.Features = GrassCoverErosionOutwardsAssemblyMapDataFeaturesFactory.CreateSimpleAssemblyFeatures(FailureMechanism); + detailedAssemblyMapData.Features = GrassCoverErosionOutwardsAssemblyMapDataFeaturesFactory.CreateDetailedAssemblyFeatures(FailureMechanism); + tailorMadeAssemblyMapData.Features = GrassCoverErosionOutwardsAssemblyMapDataFeaturesFactory.CreateTailorMadeAssemblyFeatures(FailureMechanism); + combinedAssemblyMapData.Features = GrassCoverErosionOutwardsAssemblyMapDataFeaturesFactory.CreateCombinedAssemblyFeatures(FailureMechanism); + } + + #endregion + #region Calculations MapData private void UpdateCalculationsMapData() { SetCalculationsMapData(); calculationsMapData.NotifyObservers(); + + UpdateAssemblyMapData(); } private void SetCalculationsMapData() @@ -276,9 +330,9 @@ #endregion - #region ReferenceLine MapData + #region AssessmentSection MapData - private void UpdateReferenceLineMapData() + private void UpdateAssessmentSectionData() { SetReferenceLineMapData(); referenceLineMapData.NotifyObservers(); @@ -292,14 +346,16 @@ #endregion - #region Sections MapData + #region FailureMechanism MapData - private void UpdateSectionsMapData() + private void UpdateFailureMechanismData() { SetSectionsMapData(); sectionsMapData.NotifyObservers(); sectionsStartPointMapData.NotifyObservers(); sectionsEndPointMapData.NotifyObservers(); + + UpdateAssemblyMapData(); } private void SetSectionsMapData() Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/Views/GrassCoverErosionOutwardsFailureMechanismViewTest.cs =================================================================== diff -u -r8d2450c4255d130362fc2bd4a9acc574393e343d -r392816db801f7722e20b8a67c919d0cb824bd672 --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/Views/GrassCoverErosionOutwardsFailureMechanismViewTest.cs (.../GrassCoverErosionOutwardsFailureMechanismViewTest.cs) (revision 8d2450c4255d130362fc2bd4a9acc574393e343d) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/Views/GrassCoverErosionOutwardsFailureMechanismViewTest.cs (.../GrassCoverErosionOutwardsFailureMechanismViewTest.cs) (revision 392816db801f7722e20b8a67c919d0cb824bd672) @@ -25,12 +25,17 @@ using System.Windows.Forms; using Core.Common.Base; using Core.Common.Base.Geometry; +using Core.Common.TestUtil; using Core.Components.Gis.Data; using Core.Components.Gis.Features; using Core.Components.Gis.Forms; using Core.Components.Gis.Geometries; using NUnit.Framework; using Rhino.Mocks; +using Ringtoets.AssemblyTool.Data; +using Ringtoets.AssemblyTool.KernelWrapper.Calculators; +using Ringtoets.AssemblyTool.KernelWrapper.TestUtil.Calculators; +using Ringtoets.AssemblyTool.KernelWrapper.TestUtil.Calculators.Assembly; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Hydraulics; @@ -49,20 +54,30 @@ { private const int referenceLineIndex = 0; private const int sectionsCollectionIndex = 1; - private const int hydraulicBoundaryLocationsIndex = 2; - private const int foreshoreProfilesIndex = 3; - private const int calculationsIndex = 4; + private const int assemblyResultsIndex = 2; + private const int hydraulicBoundaryLocationsIndex = 3; + private const int foreshoreProfilesIndex = 4; + private const int calculationsIndex = 5; private const int sectionsIndex = 0; private const int sectionsStartPointIndex = 1; private const int sectionsEndPointIndex = 2; + private const int tailorMadeAssemblyIndex = 0; + private const int detailedAssemblyIndex = 1; + private const int simpleAssemblyIndex = 2; + private const int combinedAssemblyIndex = 3; + private const int hydraulicBoundaryLocationsObserverIndex = 1; private const int foreshoreProfileObserverIndex = 2; private const int calculationObserverIndex = 3; private const int sectionsObserverIndex = 4; private const int sectionsStartPointObserverIndex = 5; private const int sectionsEndPointObserverIndex = 6; + private const int simpleAssemblyObserverIndex = 7; + private const int detailedAssemblyObserverIndex = 8; + private const int tailorMadeAssemblyObserverIndex = 9; + private const int combinedAssemblyObserverIndex = 10; private static IEnumerable GetCalculationFuncs { @@ -160,6 +175,8 @@ public void Constructor_WithAllData_DataUpdatedToCollectionOfFilledMapData() { // Setup + var random = new Random(39); + var referenceLine = new ReferenceLine(); referenceLine.SetGeometry(new[] { @@ -229,28 +246,51 @@ new HydraulicBoundaryLocation(1, "test", 1.0, 2.0) }); - // Call - using (var view = new GrassCoverErosionOutwardsFailureMechanismView(failureMechanism, assessmentSection)) + var expectedSimpleAssembly = new FailureMechanismSectionAssembly(random.NextDouble(), random.NextEnumValue()); + var expectedDetailedAssemblyCategory = random.NextEnumValue(); + var expectedTailorMadeAssemblyCategory = random.NextEnumValue(); + var expectedCombinedAssemblyCategory = random.NextEnumValue(); + + using (new AssemblyToolCalculatorFactoryConfig()) { - IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismSectionAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismSectionAssemblyCalculator; - // Assert - MapDataCollection mapData = map.Data; - Assert.IsInstanceOf(mapData); + calculator.SimpleAssessmentAssemblyOutput = expectedSimpleAssembly; + calculator.DetailedAssessmentAssemblyGroupOutput = expectedDetailedAssemblyCategory; + calculator.TailorMadeAssemblyCategoryOutput = expectedTailorMadeAssemblyCategory; + calculator.CombinedAssemblyCategoryOutput = expectedCombinedAssemblyCategory; - List mapDataList = mapData.Collection.ToList(); - Assert.AreEqual(5, mapDataList.Count); - MapDataTestHelper.AssertReferenceLineMapData(assessmentSection.ReferenceLine, mapDataList[referenceLineIndex]); + // Call + using (var view = new GrassCoverErosionOutwardsFailureMechanismView(failureMechanism, assessmentSection)) + { + IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; - IEnumerable sectionsCollection = ((MapDataCollection) mapDataList[sectionsCollectionIndex]).Collection; - MapDataTestHelper.AssertFailureMechanismSectionsMapData(failureMechanism.Sections, sectionsCollection.ElementAt(sectionsIndex)); - MapDataTestHelper.AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, sectionsCollection.ElementAt(sectionsStartPointIndex)); - MapDataTestHelper.AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, sectionsCollection.ElementAt(sectionsEndPointIndex)); + // Assert + MapDataCollection mapData = map.Data; + Assert.IsInstanceOf(mapData); - GrassCoverErosionOutwardsMapDataTestHelper.AssertHydraulicBoundaryLocationsMapData(failureMechanism, assessmentSection, mapDataList[hydraulicBoundaryLocationsIndex]); - MapDataTestHelper.AssertForeshoreProfilesMapData(failureMechanism.ForeshoreProfiles, mapDataList[foreshoreProfilesIndex]); - AssertCalculationsMapData(failureMechanism.Calculations.Cast(), - mapDataList[calculationsIndex]); + List mapDataList = mapData.Collection.ToList(); + Assert.AreEqual(6, mapDataList.Count); + MapDataTestHelper.AssertReferenceLineMapData(assessmentSection.ReferenceLine, mapDataList[referenceLineIndex]); + + IEnumerable sectionsCollection = ((MapDataCollection) mapDataList[sectionsCollectionIndex]).Collection; + MapDataTestHelper.AssertFailureMechanismSectionsMapData(failureMechanism.Sections, sectionsCollection.ElementAt(sectionsIndex)); + MapDataTestHelper.AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, sectionsCollection.ElementAt(sectionsStartPointIndex)); + MapDataTestHelper.AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, sectionsCollection.ElementAt(sectionsEndPointIndex)); + + GrassCoverErosionOutwardsMapDataTestHelper.AssertHydraulicBoundaryLocationsMapData(failureMechanism, assessmentSection, mapDataList[hydraulicBoundaryLocationsIndex]); + MapDataTestHelper.AssertForeshoreProfilesMapData(failureMechanism.ForeshoreProfiles, mapDataList[foreshoreProfilesIndex]); + AssertCalculationsMapData(failureMechanism.Calculations.Cast(), + mapDataList[calculationsIndex]); + + MapDataTestHelper.AssertAssemblyMapDataCollection(expectedSimpleAssembly.Group, + expectedDetailedAssemblyCategory, + expectedTailorMadeAssemblyCategory, + expectedCombinedAssemblyCategory, + (MapDataCollection) mapDataList[assemblyResultsIndex], + failureMechanism); + } } } @@ -394,6 +434,10 @@ observers[sectionsObserverIndex].Expect(obs => obs.UpdateObserver()); observers[sectionsStartPointObserverIndex].Expect(obs => obs.UpdateObserver()); observers[sectionsEndPointObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[simpleAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[detailedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[tailorMadeAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[combinedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); mocks.ReplayAll(); // When @@ -527,6 +571,10 @@ var mocks = new MockRepository(); IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); observers[calculationObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[simpleAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[detailedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[tailorMadeAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[combinedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); mocks.ReplayAll(); var calculationMapData = (MapLineData) map.Data.Collection.ElementAt(calculationsIndex); @@ -574,12 +622,17 @@ var mocks = new MockRepository(); IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); observers[calculationObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[simpleAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[detailedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[tailorMadeAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[combinedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); mocks.ReplayAll(); var calculationMapData = (MapLineData) map.Data.Collection.ElementAt(calculationsIndex); // Precondition - AssertCalculationsMapData(failureMechanism.Calculations.Cast(), calculationMapData); + AssertCalculationsMapData(failureMechanism.Calculations.Cast(), + calculationMapData); // When calculationA.InputParameters.ForeshoreProfile = new TestForeshoreProfile(new Point2D(1.5, 1.5)); @@ -613,6 +666,10 @@ var mocks = new MockRepository(); IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); observers[calculationObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[simpleAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[detailedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[tailorMadeAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[combinedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); mocks.ReplayAll(); var calculationMapData = (MapLineData) map.Data.Collection.ElementAt(calculationsIndex); @@ -631,17 +688,227 @@ } [Test] + public void GivenViewWithAssemblyData_WhenFailureMechanismNotified_ThenMapDataUpdated() + { + // Given + var random = new Random(39); + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + FailureMechanismTestHelper.AddSections(failureMechanism, random.Next(1, 10)); + + var originalSimpleAssembly = new FailureMechanismSectionAssembly(random.NextDouble(), random.NextEnumValue()); + var originalDetailedAssemblyCategory = random.NextEnumValue(); + var originalTailorMadeAssemblyCategory = random.NextEnumValue(); + var originalCombinedAssemblyCategory = random.NextEnumValue(); + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismSectionAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismSectionAssemblyCalculator; + + calculator.SimpleAssessmentAssemblyOutput = originalSimpleAssembly; + calculator.DetailedAssessmentAssemblyGroupOutput = originalDetailedAssemblyCategory; + calculator.TailorMadeAssemblyCategoryOutput = originalTailorMadeAssemblyCategory; + calculator.CombinedAssemblyCategoryOutput = originalCombinedAssemblyCategory; + + using (var view = new GrassCoverErosionOutwardsFailureMechanismView(failureMechanism, new AssessmentSectionStub())) + { + IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[sectionsObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[sectionsStartPointObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[sectionsEndPointObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[simpleAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[detailedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[tailorMadeAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[combinedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + + // Precondition + var assemblyMapData = (MapDataCollection) map.Data.Collection.ElementAt(assemblyResultsIndex); + MapDataTestHelper.AssertAssemblyMapDataCollection(originalSimpleAssembly.Group, + originalDetailedAssemblyCategory, + originalTailorMadeAssemblyCategory, + originalCombinedAssemblyCategory, + assemblyMapData, + failureMechanism); + + // When + var updatedSimpleAssembly = new FailureMechanismSectionAssembly(random.NextDouble(), random.NextEnumValue()); + var updatedDetailedAssemblyCategory = random.NextEnumValue(); + var updatedTailorMadeAssemblyCategory = random.NextEnumValue(); + var updatedCombinedAssemblyCategory = random.NextEnumValue(); + calculator.SimpleAssessmentAssemblyOutput = updatedSimpleAssembly; + calculator.DetailedAssessmentAssemblyGroupOutput = updatedDetailedAssemblyCategory; + calculator.TailorMadeAssemblyCategoryOutput = updatedTailorMadeAssemblyCategory; + calculator.CombinedAssemblyCategoryOutput = updatedCombinedAssemblyCategory; + failureMechanism.NotifyObservers(); + + // Then + MapDataTestHelper.AssertAssemblyMapDataCollection(updatedSimpleAssembly.Group, + updatedDetailedAssemblyCategory, + updatedTailorMadeAssemblyCategory, + updatedCombinedAssemblyCategory, + assemblyMapData, + failureMechanism); + mocks.VerifyAll(); + } + } + } + + [Test] + public void GivenViewWithAssemblyData_WhenCalculationNotified_ThenMapDataUpdated() + { + // Given + var random = new Random(39); + var calculationA = new GrassCoverErosionOutwardsWaveConditionsCalculation(); + + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + failureMechanism.WaveConditionsCalculationGroup.Children.Add(calculationA); + FailureMechanismTestHelper.AddSections(failureMechanism, random.Next(1, 10)); + + var originalSimpleAssembly = new FailureMechanismSectionAssembly(random.NextDouble(), random.NextEnumValue()); + var originalDetailedAssemblyCategory = random.NextEnumValue(); + var originalTailorMadeAssemblyCategory = random.NextEnumValue(); + var originalCombinedAssemblyCategory = random.NextEnumValue(); + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismSectionAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismSectionAssemblyCalculator; + + calculator.SimpleAssessmentAssemblyOutput = originalSimpleAssembly; + calculator.DetailedAssessmentAssemblyGroupOutput = originalDetailedAssemblyCategory; + calculator.TailorMadeAssemblyCategoryOutput = originalTailorMadeAssemblyCategory; + calculator.CombinedAssemblyCategoryOutput = originalCombinedAssemblyCategory; + + using (var view = new GrassCoverErosionOutwardsFailureMechanismView(failureMechanism, new AssessmentSectionStub())) + { + IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[calculationObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[simpleAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[detailedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[tailorMadeAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[combinedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + + // Precondition + var assemblyMapData = (MapDataCollection) map.Data.Collection.ElementAt(assemblyResultsIndex); + MapDataTestHelper.AssertAssemblyMapDataCollection(originalSimpleAssembly.Group, + originalDetailedAssemblyCategory, + originalTailorMadeAssemblyCategory, + originalCombinedAssemblyCategory, + assemblyMapData, + failureMechanism); + + // When + var updatedSimpleAssembly = new FailureMechanismSectionAssembly(random.NextDouble(), random.NextEnumValue()); + var updatedDetailedAssemblyCategory = random.NextEnumValue(); + var updatedTailorMadeAssemblyCategory = random.NextEnumValue(); + var updatedCombinedAssemblyCategory = random.NextEnumValue(); + calculator.SimpleAssessmentAssemblyOutput = updatedSimpleAssembly; + calculator.DetailedAssessmentAssemblyGroupOutput = updatedDetailedAssemblyCategory; + calculator.TailorMadeAssemblyCategoryOutput = updatedTailorMadeAssemblyCategory; + calculator.CombinedAssemblyCategoryOutput = updatedCombinedAssemblyCategory; + calculationA.NotifyObservers(); + + // Then + MapDataTestHelper.AssertAssemblyMapDataCollection(updatedSimpleAssembly.Group, + updatedDetailedAssemblyCategory, + updatedTailorMadeAssemblyCategory, + updatedCombinedAssemblyCategory, + assemblyMapData, + failureMechanism); + mocks.VerifyAll(); + } + } + } + + [Test] + public void GivenViewWithAssemblyData_WhenFailureMechanismSectionResultNotified_ThenMapDataUpdated() + { + // Given + var random = new Random(39); + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + FailureMechanismTestHelper.AddSections(failureMechanism, random.Next(1, 10)); + + var originalSimpleAssembly = new FailureMechanismSectionAssembly(random.NextDouble(), random.NextEnumValue()); + var originalDetailedAssemblyCategory = random.NextEnumValue(); + var originalTailorMadeAssemblyCategory = random.NextEnumValue(); + var originalCombinedAssemblyCategory = random.NextEnumValue(); + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismSectionAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismSectionAssemblyCalculator; + + calculator.SimpleAssessmentAssemblyOutput = originalSimpleAssembly; + calculator.DetailedAssessmentAssemblyGroupOutput = originalDetailedAssemblyCategory; + calculator.TailorMadeAssemblyCategoryOutput = originalTailorMadeAssemblyCategory; + calculator.CombinedAssemblyCategoryOutput = originalCombinedAssemblyCategory; + + using (var view = new GrassCoverErosionOutwardsFailureMechanismView(failureMechanism, new AssessmentSectionStub())) + { + IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; + + var mocks = new MockRepository(); + IObserver[] observers = AttachMapDataObservers(mocks, map.Data.Collection); + observers[simpleAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[detailedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[tailorMadeAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + observers[combinedAssemblyObserverIndex].Expect(obs => obs.UpdateObserver()); + mocks.ReplayAll(); + + // Precondition + var assemblyMapData = (MapDataCollection) map.Data.Collection.ElementAt(assemblyResultsIndex); + MapDataTestHelper.AssertAssemblyMapDataCollection(originalSimpleAssembly.Group, + originalDetailedAssemblyCategory, + originalTailorMadeAssemblyCategory, + originalCombinedAssemblyCategory, + assemblyMapData, + failureMechanism); + + // When + var updatedSimpleAssembly = new FailureMechanismSectionAssembly(random.NextDouble(), random.NextEnumValue()); + var updatedDetailedAssemblyCategory = random.NextEnumValue(); + var updatedTailorMadeAssemblyCategory = random.NextEnumValue(); + var updatedCombinedAssemblyCategory = random.NextEnumValue(); + calculator.SimpleAssessmentAssemblyOutput = updatedSimpleAssembly; + calculator.DetailedAssessmentAssemblyGroupOutput = updatedDetailedAssemblyCategory; + calculator.TailorMadeAssemblyCategoryOutput = updatedTailorMadeAssemblyCategory; + calculator.CombinedAssemblyCategoryOutput = updatedCombinedAssemblyCategory; + failureMechanism.SectionResults.First().NotifyObservers(); + + // Then + MapDataTestHelper.AssertAssemblyMapDataCollection(updatedSimpleAssembly.Group, + updatedDetailedAssemblyCategory, + updatedTailorMadeAssemblyCategory, + updatedCombinedAssemblyCategory, + assemblyMapData, + failureMechanism); + mocks.VerifyAll(); + } + } + } + + [Test] public void UpdateObserver_DataUpdated_MapLayersSameOrder() { // Setup - const int updatedReferenceLineLayerIndex = referenceLineIndex + 4; - const int updatedSectionsLayerIndex = sectionsCollectionIndex - 1; + const int updatedReferenceLineLayerIndex = referenceLineIndex + 5; + const int updatedSectionsCollectionLayerIndex = sectionsCollectionIndex - 1; + const int updatedAssemblyResultsCollectionIndex = assemblyResultsIndex - 1; const int updatedHydraulicLocationsLayerIndex = hydraulicBoundaryLocationsIndex - 1; const int updatedForeshoreProfilesLayerIndex = foreshoreProfilesIndex - 1; const int updatedCalculationsIndex = calculationsIndex - 1; var assessmentSection = new AssessmentSectionStub(); var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + using (var view = new GrassCoverErosionOutwardsFailureMechanismView(failureMechanism, assessmentSection)) { IMapControl map = ((RingtoetsMapControl) view.Controls[0]).MapControl; @@ -658,9 +925,12 @@ var referenceLineData = (MapLineData) mapDataList[updatedReferenceLineLayerIndex]; Assert.AreEqual("Referentielijn", referenceLineData.Name); - var sectionsData = (MapDataCollection) mapDataList[updatedSectionsLayerIndex]; + var sectionsData = (MapDataCollection) mapDataList[updatedSectionsCollectionLayerIndex]; Assert.AreEqual("Vakindeling", sectionsData.Name); + var assemblyResultsData = (MapDataCollection) mapDataList[updatedAssemblyResultsCollectionIndex]; + Assert.AreEqual("Toetsoordeel", assemblyResultsData.Name); + var hydraulicLocationsData = (MapPointData) mapDataList[updatedHydraulicLocationsLayerIndex]; Assert.AreEqual("Hydraulische belastingen", hydraulicLocationsData.Name); @@ -686,9 +956,12 @@ var actualReferenceLineData = (MapLineData) mapDataList[updatedReferenceLineLayerIndex]; Assert.AreEqual("Referentielijn", actualReferenceLineData.Name); - var actualSectionsData = (MapDataCollection) mapDataList[updatedSectionsLayerIndex]; + var actualSectionsData = (MapDataCollection) mapDataList[updatedSectionsCollectionLayerIndex]; Assert.AreEqual("Vakindeling", actualSectionsData.Name); + var actualAssemblyResultsData = (MapDataCollection) mapDataList[updatedAssemblyResultsCollectionIndex]; + Assert.AreEqual("Toetsoordeel", actualAssemblyResultsData.Name); + var actualHydraulicLocationsData = (MapPointData) mapDataList[updatedHydraulicLocationsLayerIndex]; Assert.AreEqual("Hydraulische belastingen", actualHydraulicLocationsData.Name); @@ -731,7 +1004,7 @@ List mapDataList = mapDataCollection.Collection.ToList(); - Assert.AreEqual(5, mapDataList.Count); + Assert.AreEqual(6, mapDataList.Count); var referenceLineMapData = (MapLineData) mapDataList[referenceLineIndex]; var foreshoreProfilesMapData = (MapLineData) mapDataList[foreshoreProfilesIndex]; @@ -764,6 +1037,26 @@ Assert.AreEqual("Vakindeling (eindpunten)", sectionsEndPointMapData.Name); Assert.AreEqual("Vakindeling (startpunten)", sectionsStartPointMapData.Name); Assert.AreEqual("Vakindeling", sectionsMapData.Name); + + var assemblyResultsMapDataCollection = (MapDataCollection) mapDataList[assemblyResultsIndex]; + Assert.AreEqual("Toetsoordeel", assemblyResultsMapDataCollection.Name); + List assemblyMapDataList = assemblyResultsMapDataCollection.Collection.ToList(); + Assert.AreEqual(4, assemblyMapDataList.Count); + + var combinedAssemblyMapData = (MapLineData) assemblyMapDataList[combinedAssemblyIndex]; + var simpleAssemblyMapData = (MapLineData) assemblyMapDataList[simpleAssemblyIndex]; + var detailedAssemblyMapData = (MapLineData) assemblyMapDataList[detailedAssemblyIndex]; + var tailorMadeAssemblyMapData = (MapLineData) assemblyMapDataList[tailorMadeAssemblyIndex]; + + CollectionAssert.IsEmpty(combinedAssemblyMapData.Features); + CollectionAssert.IsEmpty(simpleAssemblyMapData.Features); + CollectionAssert.IsEmpty(detailedAssemblyMapData.Features); + CollectionAssert.IsEmpty(tailorMadeAssemblyMapData.Features); + + Assert.AreEqual("Gecombineerd toetsoordeel", combinedAssemblyMapData.Name); + Assert.AreEqual("Toetsoordeel eenvoudige toets", simpleAssemblyMapData.Name); + Assert.AreEqual("Toetsoordeel gedetailleerde toets", detailedAssemblyMapData.Name); + Assert.AreEqual("Toetsoordeel toets op maat", tailorMadeAssemblyMapData.Name); } /// @@ -799,6 +1092,19 @@ var sectionsEndPointMapDataObserver = mocks.StrictMock(); sectionsCollection[sectionsEndPointIndex].Attach(sectionsEndPointMapDataObserver); + MapData[] assemblyResultsCollection = ((MapDataCollection) mapDataArray[assemblyResultsIndex]).Collection.ToArray(); + var simpleAssemblyMapDataObserver = mocks.StrictMock(); + assemblyResultsCollection[simpleAssemblyIndex].Attach(simpleAssemblyMapDataObserver); + + var detailedAssemblyMapDataObserver = mocks.StrictMock(); + assemblyResultsCollection[detailedAssemblyIndex].Attach(detailedAssemblyMapDataObserver); + + var tailorMadeAssemblyMapDataObserver = mocks.StrictMock(); + assemblyResultsCollection[tailorMadeAssemblyIndex].Attach(tailorMadeAssemblyMapDataObserver); + + var combinedAssemblyMapDataObserver = mocks.StrictMock(); + assemblyResultsCollection[combinedAssemblyIndex].Attach(combinedAssemblyMapDataObserver); + return new[] { referenceLineMapDataObserver, @@ -807,7 +1113,11 @@ calculationsMapDataObserver, sectionsMapDataObserver, sectionsStartPointMapDataObserver, - sectionsEndPointMapDataObserver + sectionsEndPointMapDataObserver, + simpleAssemblyMapDataObserver, + detailedAssemblyMapDataObserver, + tailorMadeAssemblyMapDataObserver, + combinedAssemblyMapDataObserver }; } }