Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsInputView.cs =================================================================== diff -u -r462a9f89d625ca85e6ce2e2ff628db3d83913b99 -r18a53a9b2a6c09a3af46cb9c023de3f323639f30 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsInputView.cs (.../GrassCoverErosionInwardsInputView.cs) (revision 462a9f89d625ca85e6ce2e2ff628db3d83913b99) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsInputView.cs (.../GrassCoverErosionInwardsInputView.cs) (revision 18a53a9b2a6c09a3af46cb9c023de3f323639f30) @@ -20,15 +20,20 @@ // All rights reserved. using System.Windows.Forms; +using Core.Common.Base; using Core.Components.Charting.Forms; +using Ringtoets.GrassCoverErosionInwards.Data; namespace Ringtoets.GrassCoverErosionInwards.Forms.Views { /// /// This class is a view to show the grass cover erosion inwards input. /// - public partial class GrassCoverErosionInwardsInputView : UserControl, IChartView + public partial class GrassCoverErosionInwardsInputView : UserControl, IChartView, IObserver { + private object data; + private GrassCoverErosionInwardsCalculation calculation; + /// /// Creates a new instance of . /// @@ -37,14 +42,68 @@ InitializeComponent(); } - public object Data { get; set; } + /// + /// Gets or sets the calculation the input belongs to. + /// + public GrassCoverErosionInwardsCalculation Calculation + { + get + { + return calculation; + } + set + { + DetachFromData(); + calculation = value; + SetChartTitle(); + AttachToData(); + } + } + public object Data + { + get + { + return data; + } + set + { + data = value as GrassCoverErosionInwardsInput; + } + } + public IChartControl Chart { get { return chartControl; } } + + public void UpdateObserver() + { + SetChartTitle(); + } + + private void SetChartTitle() + { + chartControl.ChartTitle = calculation != null ? calculation.Name : string.Empty; + } + + private void DetachFromData() + { + if (calculation != null) + { + calculation.Detach(this); + } + } + + private void AttachToData() + { + if (calculation != null) + { + calculation.Attach(this); + } + } } -} +} \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs =================================================================== diff -u -r8b9903ce9a5e5b860ee8ba6719737783be7a8cab -r18a53a9b2a6c09a3af46cb9c023de3f323639f30 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision 8b9903ce9a5e5b860ee8ba6719737783be7a8cab) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision 18a53a9b2a6c09a3af46cb9c023de3f323639f30) @@ -86,7 +86,8 @@ Image = RingtoetsCommonFormsResources.GenericInputOutputIcon, GetViewName = (view, input) => GrassCoverErosionInwardsFormsResources.GrassCoverErosionInwardsInputContext_NodeDisplayName, GetViewData = context => context.WrappedData, - CloseForData = CloseInputViewForData + CloseForData = CloseInputViewForData, + AfterCreate = (view, context) => view.Calculation = context.Calculation }; } Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsInputViewTest.cs =================================================================== diff -u -r462a9f89d625ca85e6ce2e2ff628db3d83913b99 -r18a53a9b2a6c09a3af46cb9c023de3f323639f30 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsInputViewTest.cs (.../GrassCoverErosionInwardsInputViewTest.cs) (revision 462a9f89d625ca85e6ce2e2ff628db3d83913b99) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsInputViewTest.cs (.../GrassCoverErosionInwardsInputViewTest.cs) (revision 18a53a9b2a6c09a3af46cb9c023de3f323639f30) @@ -20,9 +20,11 @@ // All rights reserved. using System.Windows.Forms; +using Core.Common.Base; using Core.Components.Charting.Forms; using Core.Components.OxyPlot.Forms; using NUnit.Framework; +using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionInwards.Forms.Views; using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; @@ -41,6 +43,7 @@ // Assert Assert.IsInstanceOf(view); Assert.IsInstanceOf(view); + Assert.IsInstanceOf(view); Assert.IsNotNull(view.Chart); Assert.IsNull(view.Data); } @@ -61,7 +64,148 @@ CollectionAssert.IsEmpty(chartControl.Data.List); Assert.AreEqual(RingtoetsCommonFormsResources.InputView_Distance_DisplayName, chartControl.BottomAxisTitle); Assert.AreEqual(RingtoetsCommonFormsResources.InputView_Height_DisplayName, chartControl.LeftAxisTitle); + Assert.IsNull(chartControl.ChartTitle); } } + + [Test] + public void Data_GrassCoverErosionInwardsInput_DataSet() + { + // Setup + using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView()) + { + GrassCoverErosionInwardsInput input = new GrassCoverErosionInwardsInput(); + + // Call + view.Data = input; + + // Assert + Assert.AreSame(input, view.Data); + } + } + + [Test] + public void Data_OtherThanGrassCoverErosionInwardsInput_DataNull() + { + // Setup + using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView()) + { + object input = new object(); + + // Call + view.Data = input; + + // Assert + Assert.IsNull(view.Data); + } + } + + [Test] + public void Calculation_Always_SetsCalculationAndUpdateChartTitle() + { + // Setup + using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView()) + { + GrassCoverErosionInwardsCalculation calculation = new GrassCoverErosionInwardsCalculation() + { + Name = "Test name" + }; + + // Call + view.Calculation = calculation; + + // Assert + Assert.AreSame(calculation, view.Calculation); + Assert.AreEqual(calculation.Name, view.Chart.ChartTitle); + } + } + + [Test] + public void Calculation_SetToNull_ChartTitleCleared() + { + // Setup + using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView()) + { + GrassCoverErosionInwardsCalculation calculation = new GrassCoverErosionInwardsCalculation() + { + Name = "Test name" + }; + + view.Calculation = calculation; + + // Precondition + Assert.AreSame(calculation, view.Calculation); + Assert.AreEqual(calculation.Name, view.Chart.ChartTitle); + + // Call + view.Calculation = null; + + // Assert + Assert.IsNull(view.Calculation); + Assert.AreEqual(string.Empty, view.Chart.ChartTitle); + } + } + + [Test] + public void UpdateObservers_CalculationNameUpdated_ChartTitleUpdated() + { + // Setup + using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView()) + { + var initialName = "Initial name"; + var updatedName = "Updated name"; + + var calculation = new GrassCoverErosionInwardsCalculation + { + Name = initialName + }; + + view.Calculation = calculation; + + // Precondition + Assert.AreEqual(initialName, view.Chart.ChartTitle); + + calculation.Name = updatedName; + + // Call + calculation.NotifyObservers(); + + // Assert + Assert.AreEqual(updatedName, view.Chart.ChartTitle); + } + } + + [Test] + public void UpdateObservers_OtherCalculationNameUpdated_ChartTitleNotUpdated() + { + // Setup + using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView()) + { + var initialName = "Initial name"; + var updatedName = "Updated name"; + + var calculation1 = new GrassCoverErosionInwardsCalculation + { + Name = initialName + }; + var calculation2 = new GrassCoverErosionInwardsCalculation + { + Name = initialName + }; + + view.Calculation = calculation1; + + // Precondition + Assert.AreEqual(initialName, view.Chart.ChartTitle); + + calculation2.Name = updatedName; + + // Call + calculation1.NotifyObservers(); + + // Assert + Assert.AreEqual(initialName, view.Chart.ChartTitle); + } + } } } \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/ViewInfos/GrassCoverErosionInwardsInputViewInfoTest.cs =================================================================== diff -u -r87fcb2097e3a58e611c0de6913cb48851006f7af -r18a53a9b2a6c09a3af46cb9c023de3f323639f30 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/ViewInfos/GrassCoverErosionInwardsInputViewInfoTest.cs (.../GrassCoverErosionInwardsInputViewInfoTest.cs) (revision 87fcb2097e3a58e611c0de6913cb48851006f7af) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/ViewInfos/GrassCoverErosionInwardsInputViewInfoTest.cs (.../GrassCoverErosionInwardsInputViewInfoTest.cs) (revision 18a53a9b2a6c09a3af46cb9c023de3f323639f30) @@ -109,18 +109,18 @@ IAssessmentSection assessmentSection = mocks.StrictMock(); mocks.ReplayAll(); - GrassCoverErosionInwardsCalculation pipingCalculation = new GrassCoverErosionInwardsCalculation(); - GrassCoverErosionInwardsCalculationContext pipingCalculationScenarioContext = new GrassCoverErosionInwardsCalculationContext(pipingCalculation, + GrassCoverErosionInwardsCalculation calculation = new GrassCoverErosionInwardsCalculation(); + GrassCoverErosionInwardsCalculationContext calculationContext = new GrassCoverErosionInwardsCalculationContext(calculation, new GrassCoverErosionInwardsFailureMechanism(), assessmentSection); using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView { - Data = pipingCalculation.InputParameters + Data = calculation.InputParameters }) { // Call - bool closeForData = info.CloseForData(view, pipingCalculationScenarioContext); + bool closeForData = info.CloseForData(view, calculationContext); // Assert Assert.IsTrue(closeForData); @@ -135,20 +135,20 @@ IAssessmentSection assessmentSection = mocks.StrictMock(); mocks.ReplayAll(); - GrassCoverErosionInwardsCalculation pipingCalculation = new GrassCoverErosionInwardsCalculation(); + GrassCoverErosionInwardsCalculation calculation = new GrassCoverErosionInwardsCalculation(); GrassCoverErosionInwardsCalculation calculationToRemove = new GrassCoverErosionInwardsCalculation(); - GrassCoverErosionInwardsCalculationContext pipingCalculationScenarioContext = new GrassCoverErosionInwardsCalculationContext(calculationToRemove, + GrassCoverErosionInwardsCalculationContext calculationContext = new GrassCoverErosionInwardsCalculationContext(calculationToRemove, new GrassCoverErosionInwardsFailureMechanism(), assessmentSection); using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView { - Data = pipingCalculation.InputParameters + Data = calculation.InputParameters }) { // Call - bool closeForData = info.CloseForData(view, pipingCalculationScenarioContext); + bool closeForData = info.CloseForData(view, calculationContext); // Assert Assert.IsFalse(closeForData); @@ -511,5 +511,31 @@ mocks.VerifyAll(); } } + + [Test] + public void AfterCreate_Always_SetsCalculationOnView() + { + // Setup + IAssessmentSection assessmentSection = mocks.StrictMock(); + mocks.ReplayAll(); + + GrassCoverErosionInwardsCalculation calculation = new GrassCoverErosionInwardsCalculation(); + GrassCoverErosionInwardsInputContext context = new GrassCoverErosionInwardsInputContext(calculation.InputParameters, calculation, + new GrassCoverErosionInwardsFailureMechanism(), + assessmentSection); + + using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView + { + Data = calculation.InputParameters + }) + { + // Call + info.AfterCreate(view, context); + + // Assert + Assert.AreSame(calculation, view.Calculation); + mocks.VerifyAll(); + } + } } }