Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsInputView.cs =================================================================== diff -u -r6ece2b192fc90bb8ad6ce27a457d8691fb36b12b -r248d8a19f75dff2b22237c139199914e1047f103 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsInputView.cs (.../GrassCoverErosionInwardsInputView.cs) (revision 6ece2b192fc90bb8ad6ce27a457d8691fb36b12b) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsInputView.cs (.../GrassCoverErosionInwardsInputView.cs) (revision 248d8a19f75dff2b22237c139199914e1047f103) @@ -88,7 +88,7 @@ SetChartData(); chartControl.Data = chartDataCollection; - chartControl.ChartTitle = data.Name; + UpdateChartTitle(); } } } Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsInputViewTest.cs =================================================================== diff -u -r6ece2b192fc90bb8ad6ce27a457d8691fb36b12b -r248d8a19f75dff2b22237c139199914e1047f103 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsInputViewTest.cs (.../GrassCoverErosionInwardsInputViewTest.cs) (revision 6ece2b192fc90bb8ad6ce27a457d8691fb36b12b) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsInputViewTest.cs (.../GrassCoverErosionInwardsInputViewTest.cs) (revision 248d8a19f75dff2b22237c139199914e1047f103) @@ -22,11 +22,13 @@ using System.Collections.Generic; using System.Linq; using System.Windows.Forms; +using Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Core.Components.Charting.Data; using Core.Components.Charting.Forms; using NUnit.Framework; +using Rhino.Mocks; using Ringtoets.Common.Data.DikeProfiles; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionInwards.Forms.Views; @@ -274,6 +276,11 @@ public void UpdateObserver_CalculationDikeProfileUpdated_SetNewChartData() { // Setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Times(3); + mocks.ReplayAll(); + using (var view = new GrassCoverErosionInwardsInputView()) { DikeProfile dikeProfile = GetDikeProfileWithGeometry(); @@ -292,6 +299,10 @@ var foreshoreChartData = (ChartLineData) view.Chart.Data.Collection.ElementAt(foreshoreIndex); var dikeHeightChartData = (ChartLineData) view.Chart.Data.Collection.ElementAt(dikeHeightIndex); + dikeProfileChartData.Attach(observer); + foreshoreChartData.Attach(observer); + dikeHeightChartData.Attach(observer); + DikeProfile dikeProfile2 = GetSecondDikeProfileWithGeometry(); calculation.InputParameters.DikeProfile = dikeProfile2; @@ -306,13 +317,18 @@ AssertForeshoreChartData(dikeProfile2, foreshoreChartData); Assert.AreSame(dikeHeightChartData, (ChartLineData) view.Chart.Data.Collection.ElementAt(dikeHeightIndex)); AssertDikeHeightChartData(dikeProfile2, dikeHeightChartData); + mocks.VerifyAll(); } } [Test] public void UpdateObserver_OtherGrassCoverErosionInwardsCalculationUpdated_ChartDataNotUpdated() { // Setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + mocks.ReplayAll(); + using (var view = new GrassCoverErosionInwardsInputView()) { DikeProfile dikeProfile = GetDikeProfileWithGeometry(); @@ -334,6 +350,14 @@ view.Data = calculation1; + var dikeProfileChartData = (ChartLineData)view.Chart.Data.Collection.ElementAt(dikeProfileIndex); + var foreshoreChartData = (ChartLineData)view.Chart.Data.Collection.ElementAt(foreshoreIndex); + var dikeHeightChartData = (ChartLineData)view.Chart.Data.Collection.ElementAt(dikeHeightIndex); + + dikeProfileChartData.Attach(observer); + foreshoreChartData.Attach(observer); + dikeHeightChartData.Attach(observer); + DikeProfile dikeProfile2 = GetSecondDikeProfileWithGeometry(); calculation2.InputParameters.DikeProfile = dikeProfile2; @@ -343,6 +367,7 @@ // Assert Assert.AreEqual(calculation1, view.Data); + mocks.VerifyAll(); // no update observer expected } } Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingInputView.cs =================================================================== diff -u -r6ece2b192fc90bb8ad6ce27a457d8691fb36b12b -r248d8a19f75dff2b22237c139199914e1047f103 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingInputView.cs (.../PipingInputView.cs) (revision 6ece2b192fc90bb8ad6ce27a457d8691fb36b12b) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingInputView.cs (.../PipingInputView.cs) (revision 248d8a19f75dff2b22237c139199914e1047f103) @@ -117,7 +117,7 @@ SetChartData(); chartControl.Data = chartDataCollection; - chartControl.ChartTitle = data.Name; + UpdateChartTitle(); } UpdateTableData(); } Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingInputViewTest.cs =================================================================== diff -u -r6ece2b192fc90bb8ad6ce27a457d8691fb36b12b -r248d8a19f75dff2b22237c139199914e1047f103 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingInputViewTest.cs (.../PipingInputViewTest.cs) (revision 6ece2b192fc90bb8ad6ce27a457d8691fb36b12b) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingInputViewTest.cs (.../PipingInputViewTest.cs) (revision 248d8a19f75dff2b22237c139199914e1047f103) @@ -22,10 +22,12 @@ using System.Collections.Generic; using System.Linq; using System.Windows.Forms; +using Core.Common.Base; using Core.Common.Base.Geometry; using Core.Components.Charting.Data; using Core.Components.Charting.Forms; using NUnit.Framework; +using Rhino.Mocks; using Ringtoets.Piping.Data; using Ringtoets.Piping.Forms.Views; using Ringtoets.Piping.Primitives; @@ -414,6 +416,11 @@ public void UpdateObserver_CalculationSurfaceLineUpdated_ChartDataUpdated() { // Setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Times(9); + mocks.ReplayAll(); + using (var view = new PipingInputView()) { var characteristicPoint = new Point3D(1.2, 2.3, 4.0); @@ -447,6 +454,16 @@ var dikeToeAtPolderData = (ChartPointData) chartDataList[dikeToeAtPolderIndex]; var dikeToeAtRiverData = (ChartPointData) chartDataList[dikeToeAtRiverIndex]; + surfaceLineChartData.Attach(observer); + entryPointChartData.Attach(observer); + exitPointChartData.Attach(observer); + ditchDikeSideData.Attach(observer); + bottomDitchDikeSideData.Attach(observer); + ditchPolderSideData.Attach(observer); + bottomDitchPolderSideData.Attach(observer); + dikeToeAtPolderData.Attach(observer); + dikeToeAtRiverData.Attach(observer); + var characteristicPoint2 = new Point3D(3.5, 2.3, 8.0); RingtoetsPipingSurfaceLine surfaceLine2 = GetSecondSurfaceLineWithGeometry(); @@ -479,13 +496,19 @@ AssertEntryPointLPointchartData(calculation.InputParameters, surfaceLine2, entryPointChartData); AssertExitPointLPointchartData(calculation.InputParameters, surfaceLine2, exitPointChartData); AssertCharacteristicPoints(surfaceLine2, chartDataList); + mocks.VerifyAll(); } } [Test] public void UpdateObserver_StochasticSoilProfileUpdated_ChartDataUpdated() { // Setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + using (var view = new PipingInputView()) { RingtoetsPipingSurfaceLine surfaceLine = GetSurfaceLineWithGeometry(); @@ -512,6 +535,7 @@ view.Data = calculation; var soilProfileData = (ChartDataCollection) view.Chart.Data.Collection.ElementAt(soilProfileIndex); + soilProfileData.Attach(observer); calculation.InputParameters.StochasticSoilProfile = soilProfile2; @@ -521,6 +545,7 @@ // Assert Assert.AreSame(soilProfileData, (ChartDataCollection) view.Chart.Data.Collection.ElementAt(soilProfileIndex)); AssertSoilProfileChartData(soilProfile2, soilProfileData, true); + mocks.VerifyAll(); } } @@ -613,6 +638,10 @@ public void UpdateObserver_OtherCalculationUpdated_ChartDataNotUpdated() { // Setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + mocks.ReplayAll(); + using (var view = new PipingInputView()) { RingtoetsPipingSurfaceLine surfaceLine = GetSurfaceLineWithGeometry(); @@ -627,8 +656,13 @@ var calculation2 = new PipingCalculationScenario(new GeneralPipingInput()); view.Data = calculation1; - ChartData dataBeforeUpdate = view.Chart.Data; + ChartDataCollection dataBeforeUpdate = view.Chart.Data; + foreach (ChartData chartData in dataBeforeUpdate.Collection) + { + chartData.Attach(observer); + } + view.Data = calculation2; RingtoetsPipingSurfaceLine surfaceLine2 = GetSecondSurfaceLineWithGeometry(); @@ -640,6 +674,7 @@ // Assert Assert.AreEqual(dataBeforeUpdate, view.Chart.Data); + mocks.VerifyAll(); // no update observer expected } } Index: Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Views/WaveConditionsInputView.Designer.cs =================================================================== diff -u -r62ed6462b31529a87c231f131195aef6efa6e3a7 -r248d8a19f75dff2b22237c139199914e1047f103 --- Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Views/WaveConditionsInputView.Designer.cs (.../WaveConditionsInputView.Designer.cs) (revision 62ed6462b31529a87c231f131195aef6efa6e3a7) +++ Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Views/WaveConditionsInputView.Designer.cs (.../WaveConditionsInputView.Designer.cs) (revision 248d8a19f75dff2b22237c139199914e1047f103) @@ -30,19 +30,6 @@ /// private System.ComponentModel.IContainer components = null; - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - #region Component Designer generated code /// Index: Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Views/WaveConditionsInputView.cs =================================================================== diff -u -r6ece2b192fc90bb8ad6ce27a457d8691fb36b12b -r248d8a19f75dff2b22237c139199914e1047f103 --- Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Views/WaveConditionsInputView.cs (.../WaveConditionsInputView.cs) (revision 6ece2b192fc90bb8ad6ce27a457d8691fb36b12b) +++ Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Views/WaveConditionsInputView.cs (.../WaveConditionsInputView.cs) (revision 248d8a19f75dff2b22237c139199914e1047f103) @@ -20,6 +20,7 @@ // All rights reserved. using System.Windows.Forms; +using Core.Common.Base; using Core.Components.Charting.Data; using Core.Components.Charting.Forms; using Ringtoets.Common.Forms.Views; @@ -33,6 +34,9 @@ /// public partial class WaveConditionsInputView : UserControl, IChartView { + private readonly Observer calculationObserver; + private readonly Observer calculationInputObserver; + private readonly ChartDataCollection chartDataCollection; private readonly ChartLineData foreshoreChartData; @@ -45,6 +49,9 @@ { InitializeComponent(); + calculationObserver = new Observer(UpdateChartTitle); + calculationInputObserver = new Observer(UpdateChartData); + chartDataCollection = new ChartDataCollection(RingtoetsCommonFormsResources.Calculation_Input); foreshoreChartData = RingtoetsChartDataFactory.CreateForeshoreGeometryChartData(); @@ -61,6 +68,9 @@ { data = value as IWaveConditionsCalculation; + calculationObserver.Observable = data; + calculationInputObserver.Observable = data?.InputParameters; + if (data == null) { chartControl.Data = null; @@ -71,7 +81,7 @@ SetChartData(); chartControl.Data = chartDataCollection; - chartControl.ChartTitle = data.Name; + UpdateChartTitle(); } } } @@ -84,6 +94,30 @@ } } + protected override void Dispose(bool disposing) + { + calculationObserver.Dispose(); + calculationInputObserver.Dispose(); + + if (disposing) + { + components?.Dispose(); + } + base.Dispose(disposing); + } + + private void UpdateChartData() + { + SetChartData(); + + foreshoreChartData.NotifyObservers(); + } + + private void UpdateChartTitle() + { + chartControl.ChartTitle = data.Name; + } + private void SetChartData() { WaveConditionsInput input = data.InputParameters; Index: Ringtoets/Revetment/test/Ringtoets.Revetment.Forms.Test/Views/WaveConditionsInputViewTest.cs =================================================================== diff -u -r6ece2b192fc90bb8ad6ce27a457d8691fb36b12b -r248d8a19f75dff2b22237c139199914e1047f103 --- Ringtoets/Revetment/test/Ringtoets.Revetment.Forms.Test/Views/WaveConditionsInputViewTest.cs (.../WaveConditionsInputViewTest.cs) (revision 6ece2b192fc90bb8ad6ce27a457d8691fb36b12b) +++ Ringtoets/Revetment/test/Ringtoets.Revetment.Forms.Test/Views/WaveConditionsInputViewTest.cs (.../WaveConditionsInputViewTest.cs) (revision 248d8a19f75dff2b22237c139199914e1047f103) @@ -21,14 +21,15 @@ using System.Linq; using System.Windows.Forms; +using Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Core.Components.Charting.Data; using Core.Components.Charting.Forms; using NUnit.Framework; +using Rhino.Mocks; using Ringtoets.Common.Data.DikeProfiles; using Ringtoets.Common.Data.TestUtil; -using Ringtoets.Revetment.Data; using Ringtoets.Revetment.Forms.Views; using Ringtoets.Revetment.TestUtil; @@ -151,6 +152,139 @@ } } + [Test] + public void UpdateObserver_CalculationNameUpdated_ChartTitleUpdated() + { + // Setup + using (var view = new WaveConditionsInputView()) + { + const string initialName = "Initial name"; + const string updatedName = "Updated name"; + + var calculation = new TestWaveConditionsCalculation + { + Name = initialName + }; + + view.Data = calculation; + + // Precondition + Assert.AreEqual(initialName, view.Chart.ChartTitle); + + calculation.Name = updatedName; + + // Call + calculation.NotifyObservers(); + + // Assert + Assert.AreEqual(updatedName, view.Chart.ChartTitle); + } + } + + [Test] + public void UpdateObserver_OtherCalculationNameUpdated_ChartTitleNotUpdated() + { + // Setup + using (var view = new WaveConditionsInputView()) + { + const string initialName = "Initial name"; + const string updatedName = "Updated name"; + + var calculation1 = new TestWaveConditionsCalculation + { + Name = initialName + }; + var calculation2 = new TestWaveConditionsCalculation + { + Name = initialName + }; + + view.Data = calculation1; + + // Precondition + Assert.AreEqual(initialName, view.Chart.ChartTitle); + + calculation2.Name = updatedName; + + // Call + calculation1.NotifyObservers(); + + // Assert + Assert.AreEqual(initialName, view.Chart.ChartTitle); + } + } + + [Test] + public void UpdateObserver_ForeshoreProfileUpdated_ChartDataUpdatedAndObserversNotified() + { + // Setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var calculation = new TestWaveConditionsCalculation(); + using (var view = new WaveConditionsInputView + { + Data = calculation + }) + { + var foreshoreChartData = (ChartLineData) view.Chart.Data.Collection.ElementAt(0); + foreshoreChartData.Attach(observer); + ForeshoreProfile profile2 = new TestForeshoreProfile(new [] + { + new Point2D(0, 0), + new Point2D(3, 3), + new Point2D(8, 8) + }); + + calculation.InputParameters.ForeshoreProfile = profile2; + + // Call + calculation.InputParameters.NotifyObservers(); + + // Assert + Assert.AreSame(foreshoreChartData, (ChartLineData) view.Chart.Data.Collection.ElementAt(0)); + AssertForeshoreChartData(profile2, foreshoreChartData); + mocks.VerifyAll(); + } + } + + [Test] + public void UpdateObserver_OtherCalculationUpdated_ChartDataNotUpdated() + { + // Setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + mocks.ReplayAll(); + + var calculation1 = new TestWaveConditionsCalculation(); + using (var view = new WaveConditionsInputView + { + Data = calculation1 + }) + { + ((ChartLineData) view.Chart.Data.Collection.ElementAt(0)).Attach(observer); + + var calculation2 = new TestWaveConditionsCalculation(); + ForeshoreProfile profile2 = new TestForeshoreProfile(new[] + { + new Point2D(0, 0), + new Point2D(3, 3), + new Point2D(8, 8) + }); + + calculation2.InputParameters.ForeshoreProfile = profile2; + + // Call + calculation2.InputParameters.NotifyObservers(); + + // Assert + Assert.AreEqual(calculation1, view.Data); + mocks.VerifyAll(); // no update observer expected + } + } + private static void AssertForeshoreChartData(ForeshoreProfile foreshoreProfile, ChartData chartData) { Assert.IsInstanceOf(chartData);