Index: Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Forms/Views/WaveImpactAsphaltCoverFailureMechanismView.cs =================================================================== diff -u -r6e5757c5c7aa457696aba585ea8e3cd9f1f343b7 -r2a10fe514f4bd2ac3822a00693f95e129ca9e21b --- Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Forms/Views/WaveImpactAsphaltCoverFailureMechanismView.cs (.../WaveImpactAsphaltCoverFailureMechanismView.cs) (revision 6e5757c5c7aa457696aba585ea8e3cd9f1f343b7) +++ Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Forms/Views/WaveImpactAsphaltCoverFailureMechanismView.cs (.../WaveImpactAsphaltCoverFailureMechanismView.cs) (revision 2a10fe514f4bd2ac3822a00693f95e129ca9e21b) @@ -45,15 +45,21 @@ /// public partial class WaveImpactAsphaltCoverFailureMechanismView : 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; @@ -71,6 +77,7 @@ private RecursiveObserver calculationGroupObserver; private RecursiveObserver calculationObserver; private RecursiveObserver foreshoreProfileObserver; + private RecursiveObserver, WaveImpactAsphaltCoverFailureMechanismSectionResult> sectionResultObserver; /// /// Creates a new instance of . @@ -98,28 +105,7 @@ CreateObservers(); - var mapDataCollection = new MapDataCollection(WaveImpactAsphaltCoverDataResources.WaveImpactAsphaltCoverFailureMechanism_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); } @@ -162,6 +148,7 @@ calculationInputObserver.Dispose(); calculationGroupObserver.Dispose(); calculationObserver.Dispose(); + sectionResultObserver.Dispose(); if (disposing) { @@ -171,13 +158,50 @@ base.Dispose(disposing); } + private void CreateMapData() + { + mapDataCollection = new MapDataCollection(WaveImpactAsphaltCoverDataResources.WaveImpactAsphaltCoverFailureMechanism_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 }; @@ -225,6 +249,12 @@ { Observable = FailureMechanism.ForeshoreProfiles }; + + sectionResultObserver = new RecursiveObserver, + WaveImpactAsphaltCoverFailureMechanismSectionResult>(UpdateAssemblyMapData, sr => sr) + { + Observable = FailureMechanism.SectionResults + }; } private void SetMapDataFeatures() @@ -234,14 +264,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 = WaveImpactAsphaltCoverAssemblyMapDataFeaturesFactory.CreateSimpleAssemblyFeatures(FailureMechanism); + detailedAssemblyMapData.Features = WaveImpactAsphaltCoverAssemblyMapDataFeaturesFactory.CreateDetailedAssemblyFeatures(FailureMechanism); + tailorMadeAssemblyMapData.Features = WaveImpactAsphaltCoverAssemblyMapDataFeaturesFactory.CreateTailorMadeAssemblyFeatures(FailureMechanism); + combinedAssemblyMapData.Features = WaveImpactAsphaltCoverAssemblyMapDataFeaturesFactory.CreateCombinedAssemblyFeatures(FailureMechanism); + } + + #endregion + #region Calculations MapData private void UpdateCalculationsMapData() { SetCalculationsMapData(); calculationsMapData.NotifyObservers(); + + UpdateAssemblyMapData(); } private void SetCalculationsMapData() @@ -268,9 +322,9 @@ #endregion - #region ReferenceLine MapData + #region AssessmentSection MapData - private void UpdateReferenceLineMapData() + private void UpdateAssessmentSectionData() { SetReferenceLineMapData(); referenceLineMapData.NotifyObservers(); @@ -284,14 +338,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/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Forms.Test/Views/WaveImpactAsphaltCoverFailureMechanismViewTest.cs =================================================================== diff -u -r6e5757c5c7aa457696aba585ea8e3cd9f1f343b7 -r2a10fe514f4bd2ac3822a00693f95e129ca9e21b --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Forms.Test/Views/WaveImpactAsphaltCoverFailureMechanismViewTest.cs (.../WaveImpactAsphaltCoverFailureMechanismViewTest.cs) (revision 6e5757c5c7aa457696aba585ea8e3cd9f1f343b7) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Forms.Test/Views/WaveImpactAsphaltCoverFailureMechanismViewTest.cs (.../WaveImpactAsphaltCoverFailureMechanismViewTest.cs) (revision 2a10fe514f4bd2ac3822a00693f95e129ca9e21b) @@ -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; @@ -47,20 +52,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; [Test] public void Constructor_FailureMechanismNull_ThrowsArgumentNullException() @@ -133,6 +148,8 @@ public void Constructor_WithAllData_DataUpdatedToCollectionOfFilledMapData() { // Setup + var random = new Random(39); + var calculationA = new WaveImpactAsphaltCoverWaveConditionsCalculation { InputParameters = @@ -201,27 +218,50 @@ new HydraulicBoundaryLocation(1, "test", 1.0, 2.0) }); - // Call - using (var view = new WaveImpactAsphaltCoverFailureMechanismView(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 WaveImpactAsphaltCoverFailureMechanismView(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); - MapDataTestHelper.AssertHydraulicBoundaryLocationsMapData(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)); + + MapDataTestHelper.AssertHydraulicBoundaryLocationsMapData(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); + } } } @@ -362,6 +402,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 @@ -495,6 +539,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); @@ -543,6 +591,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); @@ -583,6 +635,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); @@ -602,11 +658,220 @@ } [Test] + public void GivenViewWithAssemblyData_WhenFailureMechanismNotified_ThenMapDataUpdated() + { + // Given + var random = new Random(39); + var failureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + 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 WaveImpactAsphaltCoverFailureMechanismView(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 WaveImpactAsphaltCoverWaveConditionsCalculation(); + + var failureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + 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 WaveImpactAsphaltCoverFailureMechanismView(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 WaveImpactAsphaltCoverFailureMechanism(); + 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 WaveImpactAsphaltCoverFailureMechanismView(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 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; @@ -633,6 +898,9 @@ 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); @@ -661,6 +929,9 @@ 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); @@ -702,7 +973,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]; @@ -735,6 +1006,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); } /// @@ -770,6 +1061,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, @@ -778,7 +1082,11 @@ calculationsMapDataObserver, sectionsMapDataObserver, sectionsStartPointMapDataObserver, - sectionsEndPointMapDataObserver + sectionsEndPointMapDataObserver, + simpleAssemblyMapDataObserver, + detailedAssemblyMapDataObserver, + tailorMadeAssemblyMapDataObserver, + combinedAssemblyMapDataObserver }; } }