Index: Riskeer/DuneErosion/src/Riskeer.DuneErosion.Forms/Views/DuneErosionLocationsMapLayer.cs =================================================================== diff -u -r81d44fe88645a0e550bcfde4cb0ce6c6d172ffbc -r7f87b1e830f2c7612a75b19326543ce03e07fa34 --- Riskeer/DuneErosion/src/Riskeer.DuneErosion.Forms/Views/DuneErosionLocationsMapLayer.cs (.../DuneErosionLocationsMapLayer.cs) (revision 81d44fe88645a0e550bcfde4cb0ce6c6d172ffbc) +++ Riskeer/DuneErosion/src/Riskeer.DuneErosion.Forms/Views/DuneErosionLocationsMapLayer.cs (.../DuneErosionLocationsMapLayer.cs) (revision 7f87b1e830f2c7612a75b19326543ce03e07fa34) @@ -20,6 +20,8 @@ // All rights reserved. using System; +using System.Collections.Generic; +using System.Linq; using Core.Common.Base; using Core.Components.Gis.Data; using Riskeer.Common.Forms.Factories; @@ -38,6 +40,8 @@ private Observer duneLocationsObserver; private Observer userDefinedTargetProbabilitiesListObserver; + private List, DuneLocationCalculation>> calculationsForTargetProbabilityObservers; + /// /// Creates a new instance of . /// @@ -77,21 +81,58 @@ { duneLocationsObserver.Dispose(); userDefinedTargetProbabilitiesListObserver.Dispose(); + + DeleteTargetProbabilitiesObservers(); } } + private void DeleteTargetProbabilitiesObservers() + { + foreach (RecursiveObserver, DuneLocationCalculation> observer in calculationsForTargetProbabilityObservers) + { + observer.Dispose(); + } + + calculationsForTargetProbabilityObservers.Clear(); + } + private void CreateObservers() { duneLocationsObserver = new Observer(UpdateFeatures) { Observable = failureMechanism.DuneLocations }; - userDefinedTargetProbabilitiesListObserver = new Observer(UpdateFeatures) + userDefinedTargetProbabilitiesListObserver = new Observer(() => { + DeleteTargetProbabilitiesObservers(); + CreateTargetProbabilitiesObservers(); + UpdateFeatures(); + }) + { Observable = failureMechanism.DuneLocationCalculationsForUserDefinedTargetProbabilities }; + + calculationsForTargetProbabilityObservers = new List, DuneLocationCalculation>>(); + CreateTargetProbabilitiesObservers(); } + private void CreateTargetProbabilitiesObservers() + { + calculationsForTargetProbabilityObservers.AddRange(failureMechanism.DuneLocationCalculationsForUserDefinedTargetProbabilities + .Select(calculationsForTargetProbability => CreateDuneLocationCalculationsObserver( + calculationsForTargetProbability.DuneLocationCalculations))); + } + + private RecursiveObserver, DuneLocationCalculation> CreateDuneLocationCalculationsObserver( + IObservableEnumerable calculations) + { + return new RecursiveObserver, DuneLocationCalculation>( + UpdateFeatures, calc => calc) + { + Observable = calculations + }; + } + private void UpdateFeatures() { SetFeatures(); Index: Riskeer/DuneErosion/test/Riskeer.DuneErosion.Forms.Test/Views/DuneErosionLocationsMapLayerTest.cs =================================================================== diff -u -r81d44fe88645a0e550bcfde4cb0ce6c6d172ffbc -r7f87b1e830f2c7612a75b19326543ce03e07fa34 --- Riskeer/DuneErosion/test/Riskeer.DuneErosion.Forms.Test/Views/DuneErosionLocationsMapLayerTest.cs (.../DuneErosionLocationsMapLayerTest.cs) (revision 81d44fe88645a0e550bcfde4cb0ce6c6d172ffbc) +++ Riskeer/DuneErosion/test/Riskeer.DuneErosion.Forms.Test/Views/DuneErosionLocationsMapLayerTest.cs (.../DuneErosionLocationsMapLayerTest.cs) (revision 7f87b1e830f2c7612a75b19326543ce03e07fa34) @@ -110,6 +110,113 @@ mocks.VerifyAll(); } + [Test] + public void GivenMapLayerWithDuneLocations_WhenCalculationsForUserDefinedTargetProbabilityUpdatedAndNotified_ThenMapDataUpdated() + { + // Given + var targetProbability = new DuneLocationCalculationsForTargetProbability(0.1); + var failureMechanism = new DuneErosionFailureMechanism(); + failureMechanism.DuneLocationCalculationsForUserDefinedTargetProbabilities.Add(targetProbability); + failureMechanism.SetDuneLocations(new[] + { + new TestDuneLocation("test1") + }); + + var mapLayer = new DuneErosionLocationsMapLayer(failureMechanism); + + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + mapLayer.MapData.Attach(observer); + + // Precondition + AssertDuneLocationsMapData(failureMechanism, mapLayer.MapData); + + // When + DuneLocationCalculation duneLocationCalculation = targetProbability.DuneLocationCalculations.First(); + duneLocationCalculation.Output = new TestDuneLocationCalculationOutput(); + duneLocationCalculation.NotifyObservers(); + + // Then + AssertDuneLocationsMapData(failureMechanism, mapLayer.MapData); + mocks.VerifyAll(); + } + + [Test] + public void GivenMapLayerWithDuneLocations_WhenCalculationsForAddedUserDefinedTargetProbabilityUpdatedAndNotified_ThenMapDataUpdated() + { + // Given + var failureMechanism = new DuneErosionFailureMechanism(); + failureMechanism.SetDuneLocations(new[] + { + new TestDuneLocation("test1") + }); + + var mapLayer = new DuneErosionLocationsMapLayer(failureMechanism); + + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var targetProbability = new DuneLocationCalculationsForTargetProbability(0.1); + targetProbability.DuneLocationCalculations.AddRange(failureMechanism.DuneLocations.Select(l => new DuneLocationCalculation(l))); + failureMechanism.DuneLocationCalculationsForUserDefinedTargetProbabilities.Add(targetProbability); + failureMechanism.DuneLocationCalculationsForUserDefinedTargetProbabilities.NotifyObservers(); + + mapLayer.MapData.Attach(observer); + + // Precondition + AssertDuneLocationsMapData(failureMechanism, mapLayer.MapData); + + // When + DuneLocationCalculation duneLocationCalculation = targetProbability.DuneLocationCalculations.First(); + duneLocationCalculation.Output = new TestDuneLocationCalculationOutput(); + duneLocationCalculation.NotifyObservers(); + + // Then + AssertDuneLocationsMapData(failureMechanism, mapLayer.MapData); + mocks.VerifyAll(); + } + + [Test] + public void GivenMapLayerWithDuneLocations_WhenCalculationsForRemovedUserDefinedTargetProbabilityUpdatedAndNotified_ThenMapDataUpdated() + { + // Given + var targetProbability = new DuneLocationCalculationsForTargetProbability(0.1); + var failureMechanism = new DuneErosionFailureMechanism(); + failureMechanism.DuneLocationCalculationsForUserDefinedTargetProbabilities.Add(targetProbability); + failureMechanism.SetDuneLocations(new[] + { + new TestDuneLocation("test1") + }); + + var mapLayer = new DuneErosionLocationsMapLayer(failureMechanism); + + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + mocks.ReplayAll(); + + failureMechanism.DuneLocationCalculationsForUserDefinedTargetProbabilities.Clear(); + failureMechanism.DuneLocationCalculationsForUserDefinedTargetProbabilities.NotifyObservers(); + + mapLayer.MapData.Attach(observer); + + // Precondition + AssertDuneLocationsMapData(failureMechanism, mapLayer.MapData); + + // When + DuneLocationCalculation duneLocationCalculation = targetProbability.DuneLocationCalculations.First(); + duneLocationCalculation.Output = new TestDuneLocationCalculationOutput(); + duneLocationCalculation.NotifyObservers(); + + // Then + AssertDuneLocationsMapData(failureMechanism, mapLayer.MapData); + mocks.VerifyAll(); + } + private static void AssertDuneLocationsMapData(DuneErosionFailureMechanism failureMechanism, MapData mapData) {