Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/PropertyClasses/GrassCoverErosionInwardsInputContextProperties.cs =================================================================== diff -u -re5658f822fa85cab8e99cb3069867d3a87867386 -rbb4c3689ba695776176d0a03d24e5025b27594ed --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/PropertyClasses/GrassCoverErosionInwardsInputContextProperties.cs (.../GrassCoverErosionInwardsInputContextProperties.cs) (revision e5658f822fa85cab8e99cb3069867d3a87867386) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/PropertyClasses/GrassCoverErosionInwardsInputContextProperties.cs (.../GrassCoverErosionInwardsInputContextProperties.cs) (revision bb4c3689ba695776176d0a03d24e5025b27594ed) @@ -65,8 +65,8 @@ set { data.WrappedData.DikeProfile = value; + AssignUnassignCalculations.Update(data.FailureMechanism, data.Calculation); data.WrappedData.NotifyObservers(); - //AssignUnAssignCalculations.Update(data.FailureMechanism, data.Calculation); } } Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs =================================================================== diff -u -rd207738be4ce6f50f4e3e00839ea433acea10bbd -rbb4c3689ba695776176d0a03d24e5025b27594ed --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision d207738be4ce6f50f4e3e00839ea433acea10bbd) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision bb4c3689ba695776176d0a03d24e5025b27594ed) @@ -44,6 +44,7 @@ using Ringtoets.GrassCoverErosionInwards.Forms.Views; using Ringtoets.GrassCoverErosionInwards.Plugin.FileImporter; using Ringtoets.GrassCoverErosionInwards.Service; +using Ringtoets.GrassCoverErosionInwards.Utils; using Ringtoets.HydraRing.IO; using GrassCoverErosionInwardsDataResources = Ringtoets.GrassCoverErosionInwards.Data.Properties.Resources; using GrassCoverErosionInwardsFormsResources = Ringtoets.GrassCoverErosionInwards.Forms.Properties.Resources; @@ -536,23 +537,25 @@ using (var view = new GrassCoverErosionInwardsDikeProfileSelectionDialog(Gui.MainWindow, nodeData.AvailableDikeProfiles)) { view.ShowDialog(); - GenerateCalculations(nodeData.WrappedData, view.SelectedDikeProfiles); + GenerateCalculations(nodeData.WrappedData, nodeData.FailureMechanism, view.SelectedDikeProfiles); } nodeData.NotifyObservers(); } - private void GenerateCalculations(CalculationGroup target, IEnumerable dikeProfiles) + private void GenerateCalculations(CalculationGroup target, GrassCoverErosionInwardsFailureMechanism failureMechanism, IEnumerable dikeProfiles) { foreach (var profile in dikeProfiles) { - target.Children.Add(new GrassCoverErosionInwardsCalculation + var calculation = new GrassCoverErosionInwardsCalculation { Name = NamingHelper.GetUniqueName(target.Children, profile.Name, c => c.Name), InputParameters = { DikeProfile = profile } - }); + }; + target.Children.Add(calculation); + AssignUnassignCalculations.Update(failureMechanism, calculation); } } Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/Ringtoets.GrassCoverErosionInwards.Plugin.csproj =================================================================== diff -u -r626c54ec06c0074be690c1a7046081293b0289a8 -rbb4c3689ba695776176d0a03d24e5025b27594ed --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/Ringtoets.GrassCoverErosionInwards.Plugin.csproj (.../Ringtoets.GrassCoverErosionInwards.Plugin.csproj) (revision 626c54ec06c0074be690c1a7046081293b0289a8) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/Ringtoets.GrassCoverErosionInwards.Plugin.csproj (.../Ringtoets.GrassCoverErosionInwards.Plugin.csproj) (revision bb4c3689ba695776176d0a03d24e5025b27594ed) @@ -153,6 +153,10 @@ Ringtoets.GrassCoverErosionInwards.Service False + + {99573570-EE00-4264-8147-26A1B25DB23F} + Ringtoets.GrassCoverErosionInwards.Utils + Fisheye: Tag bb4c3689ba695776176d0a03d24e5025b27594ed refers to a dead (removed) revision in file `Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Utils/AssignUnAssignCalculations.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Utils/AssignUnassignCalculations.cs =================================================================== diff -u --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Utils/AssignUnassignCalculations.cs (revision 0) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Utils/AssignUnassignCalculations.cs (revision bb4c3689ba695776176d0a03d24e5025b27594ed) @@ -0,0 +1,77 @@ +// Copyright (C) Stichting Deltares 2016. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +using System; +using System.Collections.Generic; +using System.Linq; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.GrassCoverErosionInwards.Data; + +namespace Ringtoets.GrassCoverErosionInwards.Utils +{ + /// + /// Utility class for data synchronization of the + /// of objects. + /// + public static class AssignUnassignCalculations + { + /// + /// Update objects which used or can use the . + /// + /// The containing the + /// objects. + /// The . + /// When any input parameter is null. + public static void Update(GrassCoverErosionInwardsFailureMechanism failureMechanism, GrassCoverErosionInwardsCalculation calculation) + { + if (failureMechanism == null) + { + throw new ArgumentNullException("failureMechanism"); + } + if (calculation == null) + { + throw new ArgumentNullException("calculation"); + } + + // The FailureMechanismSection which contains the calculation whose dikeprofile has been updated. + FailureMechanismSection failureMechanismSection = GrassCoverErosionInwardsHelper.FailureMechanismSectionForCalculation(failureMechanism.SectionResults, calculation); + + // All SectionResults (0 or 1) which don't contain the calculation, but do have it assigned, have their calculation set to null. + IEnumerable sectionResultsUsingCalculation = failureMechanism.SectionResults.Where(sr => sr.Calculation != null && sr.Calculation.Equals(calculation)); + foreach (var sectionResult in sectionResultsUsingCalculation) + { + if (!sectionResult.Section.Equals(failureMechanismSection)) + { + sectionResult.Calculation = null; + } + } + + // Assign the calculation to the SectionResult which contains it, if that SectionResult currently has no calculation set. + foreach (var sectionResult in failureMechanism.SectionResults) + { + if (sectionResult.Section.Equals(failureMechanismSection) && sectionResult.Calculation == null) + { + sectionResult.Calculation = calculation; + } + } + } + } +} \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Utils/Ringtoets.GrassCoverErosionInwards.Utils.csproj =================================================================== diff -u -re5658f822fa85cab8e99cb3069867d3a87867386 -rbb4c3689ba695776176d0a03d24e5025b27594ed --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Utils/Ringtoets.GrassCoverErosionInwards.Utils.csproj (.../Ringtoets.GrassCoverErosionInwards.Utils.csproj) (revision e5658f822fa85cab8e99cb3069867d3a87867386) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Utils/Ringtoets.GrassCoverErosionInwards.Utils.csproj (.../Ringtoets.GrassCoverErosionInwards.Utils.csproj) (revision bb4c3689ba695776176d0a03d24e5025b27594ed) @@ -44,7 +44,7 @@ Properties\GlobalAssembly.cs - + Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/GrassCoverErosionInwardsInputContextPropertiesIntegrationTest.cs =================================================================== diff -u --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/GrassCoverErosionInwardsInputContextPropertiesIntegrationTest.cs (revision 0) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/GrassCoverErosionInwardsInputContextPropertiesIntegrationTest.cs (revision bb4c3689ba695776176d0a03d24e5025b27594ed) @@ -0,0 +1,151 @@ +using System.Collections.Generic; +using System.Linq; +using Core.Common.Base; +using Core.Common.Base.Geometry; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.GrassCoverErosionInwards.Data; +using Ringtoets.GrassCoverErosionInwards.Forms.PresentationObjects; +using Ringtoets.GrassCoverErosionInwards.Forms.PropertyClasses; + +namespace Ringtoets.GrassCoverErosionInwards.Integration.Test +{ + [TestFixture] + public class GrassCoverErosionInwardsInputContextPropertiesIntegrationTest + { + private MockRepository mockRepository; + + [SetUp] + public void SetUp() + { + mockRepository = new MockRepository(); + } + + [Test] + public void DikeProfile_CalculationDikeProfileChangedToMatchOtherSection_FirstSectionResultCalculationNullSecondSectionResultCalculationSet() + { + // Setup + var assessmentSectionMock = mockRepository.StrictMock(); + mockRepository.ReplayAll(); + + var dikeProfile1 = new DikeProfile(new Point2D(0.51, 0.51), new RoughnessPoint[0], new Point2D[0]); + var dikeProfile2 = new DikeProfile(new Point2D(1.51, 1.51), new RoughnessPoint[0], new Point2D[0]); + + var calculation1 = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + DikeProfile = dikeProfile1 + } + }; + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + + failureMechanism.DikeProfiles.Add(dikeProfile1); + failureMechanism.DikeProfiles.Add(dikeProfile2); + + failureMechanism.CalculationsGroup.Children.Add(calculation1); + + failureMechanism.DikeProfiles.Add(dikeProfile1); + failureMechanism.DikeProfiles.Add(dikeProfile2); + + failureMechanism.AddSection(new FailureMechanismSection("firstSection", new List + { + new Point2D(0.0, 0.0), new Point2D(1.1, 1.1) + })); + failureMechanism.AddSection(new FailureMechanismSection("secondSection", new List + { + new Point2D(1.1, 1.1), new Point2D(2.2, 2.2) + })); + + var sectionResults = failureMechanism.SectionResults.ToArray(); + sectionResults[0].Calculation = calculation1; + + var inputContext = new GrassCoverErosionInwardsInputContext(calculation1.InputParameters, calculation1, failureMechanism, assessmentSectionMock); + + var properties = new GrassCoverErosionInwardsInputContextProperties + { + Data = inputContext + }; + + // Call + properties.DikeProfile = dikeProfile2; + + // Assert + Assert.AreEqual(2, sectionResults.Length); + Assert.IsNull(sectionResults[0].Calculation); + Assert.AreSame(calculation1, sectionResults[1].Calculation); + mockRepository.VerifyAll(); + } + + [Test] + public void DikeProfile_CalculationDikeProfileChangedToMatchOtherSection_FirstSectionResultCalculationNullSecondSectionResultCalculationUnchanged() + { + // Setup + var assessmentSectionMock = mockRepository.StrictMock(); + mockRepository.ReplayAll(); + + var dikeProfile1 = new DikeProfile(new Point2D(0.51, 0.51), new RoughnessPoint[0], new Point2D[0]); + var dikeProfile2 = new DikeProfile(new Point2D(1.51, 1.51), new RoughnessPoint[0], new Point2D[0]); + + var calculation1 = new GrassCoverErosionInwardsCalculation + { + Name = "firstCalculation", + InputParameters = + { + DikeProfile = dikeProfile1 + } + }; + var calculation2 = new GrassCoverErosionInwardsCalculation + { + Name = "secondCalculation", + InputParameters = + { + DikeProfile = dikeProfile2 + } + }; + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + + failureMechanism.DikeProfiles.Add(dikeProfile1); + failureMechanism.DikeProfiles.Add(dikeProfile2); + + failureMechanism.CalculationsGroup.Children.Add(calculation1); + failureMechanism.CalculationsGroup.Children.Add(calculation2); + + failureMechanism.DikeProfiles.Add(dikeProfile1); + failureMechanism.DikeProfiles.Add(dikeProfile2); + + failureMechanism.AddSection(new FailureMechanismSection("firstSection", new List + { + new Point2D(0.0, 0.0), new Point2D(1.1, 1.1) + })); + failureMechanism.AddSection(new FailureMechanismSection("secondSection", new List + { + new Point2D(1.1, 1.1), new Point2D(2.2, 2.2) + })); + + var sectionResults = failureMechanism.SectionResults.ToArray(); + sectionResults[0].Calculation = calculation1; + sectionResults[1].Calculation = calculation2; + + var inputContext = new GrassCoverErosionInwardsInputContext(calculation1.InputParameters, calculation1, failureMechanism, assessmentSectionMock); + + var properties = new GrassCoverErosionInwardsInputContextProperties + { + Data = inputContext + }; + + // Call + properties.DikeProfile = dikeProfile2; + + // Assert + Assert.AreEqual(2, sectionResults.Length); + Assert.IsNull(sectionResults[0].Calculation); + Assert.AreSame(calculation2, sectionResults[1].Calculation); + mockRepository.VerifyAll(); + } + } +} \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/Ringtoets.GrassCoverErosionInwards.Integration.Test.csproj =================================================================== diff -u -r773a5af872870723a798116250805f47f165d966 -rbb4c3689ba695776176d0a03d24e5025b27594ed --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/Ringtoets.GrassCoverErosionInwards.Integration.Test.csproj (.../Ringtoets.GrassCoverErosionInwards.Integration.Test.csproj) (revision 773a5af872870723a798116250805f47f165d966) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/Ringtoets.GrassCoverErosionInwards.Integration.Test.csproj (.../Ringtoets.GrassCoverErosionInwards.Integration.Test.csproj) (revision bb4c3689ba695776176d0a03d24e5025b27594ed) @@ -59,6 +59,7 @@ + @@ -91,6 +92,10 @@ {9a2d67e6-26ac-4d17-b11a-2b4372f2f572} Core.Common.Controls + + {30e4c2ae-719e-4d70-9fa9-668a9767fbfa} + Core.Common.Gui + {F49BD8B2-332A-4C91-A196-8CCE0A2C7D98} Core.Common.Utils Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/AssignUnassignCalculationsTest.cs =================================================================== diff -u --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/AssignUnassignCalculationsTest.cs (revision 0) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/AssignUnassignCalculationsTest.cs (revision bb4c3689ba695776176d0a03d24e5025b27594ed) @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Core.Common.Base.Geometry; +using NUnit.Framework; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.GrassCoverErosionInwards.Data; + +namespace Ringtoets.GrassCoverErosionInwards.Utils.Test +{ + [TestFixture] + public class AssignUnassignCalculationsTest + { + [Test] + public void Update_NullFailureMechanism_ThrowsArgumentNullException() + { + // Setup + var calculation = new GrassCoverErosionInwardsCalculation(); + + // Call + TestDelegate call = () => AssignUnassignCalculations.Update(null, calculation); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("failureMechanism", paramName); + } + + [Test] + public void Update_NullCalculation_ThrowsArgumentNullException() + { + // Setup + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + + // Call + TestDelegate call = () => AssignUnassignCalculations.Update(failureMechanism, null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("calculation", paramName); + } + + [Test] + public void Update_CalculationDikeProfileChangedToMatchOtherSection_FirstSectionResultCalculationNullSecondSectionResultCalculationSet() + { + // Setup + var dikeProfile1 = new DikeProfile(new Point2D(0.51, 0.51), new RoughnessPoint[0], new Point2D[0]); + var dikeProfile2 = new DikeProfile(new Point2D(1.51, 1.51), new RoughnessPoint[0], new Point2D[0]); + + var calculation1 = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + DikeProfile = dikeProfile1 + } + }; + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + + failureMechanism.DikeProfiles.Add(dikeProfile1); + failureMechanism.DikeProfiles.Add(dikeProfile2); + + failureMechanism.CalculationsGroup.Children.Add(calculation1); + + failureMechanism.DikeProfiles.Add(dikeProfile1); + failureMechanism.DikeProfiles.Add(dikeProfile2); + + failureMechanism.AddSection(new FailureMechanismSection("firstSection", new List + { + new Point2D(0.0, 0.0), new Point2D(1.1, 1.1) + })); + failureMechanism.AddSection(new FailureMechanismSection("secondSection", new List + { + new Point2D(1.1, 1.1), new Point2D(2.2, 2.2) + })); + + var sectionResults = failureMechanism.SectionResults.ToArray(); + sectionResults[0].Calculation = calculation1; + + // Call + calculation1.InputParameters.DikeProfile = dikeProfile2; + AssignUnassignCalculations.Update(failureMechanism, calculation1); + + // Assert + Assert.AreEqual(2, sectionResults.Length); + Assert.IsNull(sectionResults[0].Calculation); + Assert.AreSame(calculation1, sectionResults[1].Calculation); + } + + [Test] + public void Update_CalculationDikeProfileChangedToMatchOtherSection_FirstSectionResultCalculationNullSecondSectionResultCalculationUnchanged() + { + // Setup + var dikeProfile1 = new DikeProfile(new Point2D(0.51, 0.51), new RoughnessPoint[0], new Point2D[0]); + var dikeProfile2 = new DikeProfile(new Point2D(1.51, 1.51), new RoughnessPoint[0], new Point2D[0]); + + var calculation1 = new GrassCoverErosionInwardsCalculation + { + Name = "firstCalculation", + InputParameters = + { + DikeProfile = dikeProfile1 + } + }; + var calculation2 = new GrassCoverErosionInwardsCalculation + { + Name = "secondCalculation", + InputParameters = + { + DikeProfile = dikeProfile2 + } + }; + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + + failureMechanism.DikeProfiles.Add(dikeProfile1); + failureMechanism.DikeProfiles.Add(dikeProfile2); + + failureMechanism.CalculationsGroup.Children.Add(calculation1); + failureMechanism.CalculationsGroup.Children.Add(calculation2); + + failureMechanism.DikeProfiles.Add(dikeProfile1); + failureMechanism.DikeProfiles.Add(dikeProfile2); + + failureMechanism.AddSection(new FailureMechanismSection("firstSection", new List + { + new Point2D(0.0, 0.0), new Point2D(1.1, 1.1) + })); + failureMechanism.AddSection(new FailureMechanismSection("secondSection", new List + { + new Point2D(1.1, 1.1), new Point2D(2.2, 2.2) + })); + + var sectionResults = failureMechanism.SectionResults.ToArray(); + sectionResults[0].Calculation = calculation1; + sectionResults[1].Calculation = calculation2; + + // Call + calculation1.InputParameters.DikeProfile = dikeProfile2; + AssignUnassignCalculations.Update(failureMechanism, calculation1); + + // Assert + Assert.AreEqual(2, sectionResults.Length); + Assert.IsNull(sectionResults[0].Calculation); + Assert.AreSame(calculation2, sectionResults[1].Calculation); + } + } +} \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj =================================================================== diff -u -rd207738be4ce6f50f4e3e00839ea433acea10bbd -rbb4c3689ba695776176d0a03d24e5025b27594ed --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj (.../Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj) (revision d207738be4ce6f50f4e3e00839ea433acea10bbd) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj (.../Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj) (revision bb4c3689ba695776176d0a03d24e5025b27594ed) @@ -46,6 +46,7 @@ +