Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsHelper.cs =================================================================== diff -u -r164556e75ddc489940c96a84fd41589a4acbac80 -r686a257dd8e21e34a52b265f85ef4ac4e11e44a3 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsHelper.cs (.../GrassCoverErosionInwardsHelper.cs) (revision 164556e75ddc489940c96a84fd41589a4acbac80) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsHelper.cs (.../GrassCoverErosionInwardsHelper.cs) (revision 686a257dd8e21e34a52b265f85ef4ac4e11e44a3) @@ -22,12 +22,13 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base.Geometry; +using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.GrassCoverErosionInwards.Data; namespace Ringtoets.GrassCoverErosionInwards.Forms.Views { /// - /// Class holds a method to help . + /// Class holds a helper method to help . /// public static class GrassCoverErosionInwardsHelper { @@ -36,7 +37,9 @@ /// /// The objects. /// The objects. - /// A containing a of objects for each section name which has calculations. + /// A containing a + /// of objects + /// for each section name which has calculations. public static Dictionary> CollectCalculationsPerSegment( IEnumerable sectionResults, IEnumerable calculations) @@ -48,49 +51,73 @@ return calculationsPerSegment; } - SectionSegments[] sectionSegments = - (from sectionResult in sectionResults - let section = sectionResult.Section - let lineSegments = Math2D.ConvertLinePointsToLineSegments(section.Points) - select new SectionSegments(section.Name, lineSegments) - ).ToArray(); + SectionSegments[] sectionSegments = MakeSectionSegments(sectionResults); foreach (var calculation in calculations) { - string sectionName = FindSectionForCalculation(sectionSegments, calculation); - if (sectionName == null) + FailureMechanismSection section = FindSectionForCalculation(sectionSegments, calculation); + if (section == null) { continue; } - UpdateCalculationsOfSegment(calculationsPerSegment, sectionName, calculation); + UpdateCalculationsOfSegment(calculationsPerSegment, section.Name, calculation); } return calculationsPerSegment; } - private static string FindSectionForCalculation(SectionSegments[] sectionSegmentsCollection, GrassCoverErosionInwardsCalculation calculation) + /// + /// Determine which geometrically contains the . + /// + /// The objects + /// whose are considered. + /// The . + /// The containing , or null. + public static FailureMechanismSection FailureMechanismSectionForCalculation( + IEnumerable sectionResults, + GrassCoverErosionInwardsCalculation calculation) { + if (sectionResults == null || calculation == null) + { + return null; + } + + SectionSegments[] sectionSegments = MakeSectionSegments(sectionResults); + + return FindSectionForCalculation(sectionSegments, calculation); + } + + private static SectionSegments[] MakeSectionSegments(IEnumerable sectionResults) + { + SectionSegments[] sectionSegments = + (from sectionResult in sectionResults + let section = sectionResult.Section + select new SectionSegments(section) + ).ToArray(); + return sectionSegments; + } + + private static FailureMechanismSection FindSectionForCalculation(SectionSegments[] sectionSegmentsCollection, GrassCoverErosionInwardsCalculation calculation) + { + var dikeProfile = calculation.InputParameters.DikeProfile; + if (dikeProfile == null) + { + return null; + } + var minimumDistance = double.PositiveInfinity; - string sectionName = null; + FailureMechanismSection section = null; foreach (var sectionSegments in sectionSegmentsCollection) { - var dikeProfile = calculation.InputParameters.DikeProfile; - if (dikeProfile == null) + var distance = sectionSegments.Distance(dikeProfile.WorldReferencePoint); + if (distance < minimumDistance) { - continue; + minimumDistance = distance; + section = sectionSegments.Section; } - - var distance = sectionSegments.Segments.Min(segment => segment.GetEuclideanDistanceToPoint(dikeProfile.WorldReferencePoint)); - if (!(distance < minimumDistance)) - { - continue; - } - - minimumDistance = distance; - sectionName = sectionSegments.Name; } - return sectionName; + return section; } private static void UpdateCalculationsOfSegment(Dictionary> calculationsPerSegment, @@ -104,30 +131,37 @@ } /// - /// This class represents a named collection of objects. + /// This class represents the geometry of a as a collection of objects. /// private class SectionSegments { + private readonly IEnumerable segments; + /// /// Creates a new instance of . /// - /// The name of a dike section. - /// The representing the geometry of a dike section. - public SectionSegments(string name, IEnumerable segments) + /// The whose + /// this class represents as a collection of objects. + public SectionSegments(FailureMechanismSection section) { - Name = name; - Segments = segments; + Section = section; + segments = Math2D.ConvertLinePointsToLineSegments(section.Points); } /// - /// Gets the name this contains. + /// Gets the . /// - public string Name { get; private set; } + public FailureMechanismSection Section { get; private set; } /// - /// Gets the this contains. + /// Calculate the Euclidean distance between the and a . /// - public IEnumerable Segments { get; private set; } + /// The . + /// The Euclidean distance as a . + public double Distance(Point2D point) + { + return segments.Min(segment => segment.GetEuclideanDistanceToPoint(point)); + } } } } \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationActivity.cs =================================================================== diff -u -r164556e75ddc489940c96a84fd41589a4acbac80 -r686a257dd8e21e34a52b265f85ef4ac4e11e44a3 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationActivity.cs (.../GrassCoverErosionInwardsCalculationActivity.cs) (revision 164556e75ddc489940c96a84fd41589a4acbac80) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationActivity.cs (.../GrassCoverErosionInwardsCalculationActivity.cs) (revision 686a257dd8e21e34a52b265f85ef4ac4e11e44a3) @@ -23,6 +23,7 @@ using System.Linq; using Core.Common.Base.Service; using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Service; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionInwards.Forms.Views; @@ -66,11 +67,9 @@ protected override void OnRun() { - Dictionary> calculationsPerSegmentName = - GrassCoverErosionInwardsHelper.CollectCalculationsPerSegment(failureMechanism.SectionResults, new[]{calculation}); + FailureMechanismSection failureMechanismSection = + GrassCoverErosionInwardsHelper.FailureMechanismSectionForCalculation(failureMechanism.SectionResults, calculation); - var failureMechanismSection = failureMechanism.Sections.FirstOrDefault(section => section.Name.Equals(calculationsPerSegmentName.Keys.FirstOrDefault())); - PerformRun(() => GrassCoverErosionInwardsCalculationService.Validate(calculation, assessmentSection), () => calculation.ClearOutput(), () => GrassCoverErosionInwardsCalculationService.Calculate(calculation, Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsViewHelperTest.cs =================================================================== diff -u -r164556e75ddc489940c96a84fd41589a4acbac80 -r686a257dd8e21e34a52b265f85ef4ac4e11e44a3 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsViewHelperTest.cs (.../GrassCoverErosionInwardsViewHelperTest.cs) (revision 164556e75ddc489940c96a84fd41589a4acbac80) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsViewHelperTest.cs (.../GrassCoverErosionInwardsViewHelperTest.cs) (revision 686a257dd8e21e34a52b265f85ef4ac4e11e44a3) @@ -31,7 +31,6 @@ [TestFixture] public class GrassCoverErosionInwardsViewHelperTest { - private readonly GrassCoverErosionInwardsFailureMechanismSectionResult[] oneSectionResult = new[] { new GrassCoverErosionInwardsFailureMechanismSectionResult( @@ -164,5 +163,89 @@ Assert.AreEqual(1, collectCalculationsPerSegment["firstSection"].Count); Assert.AreEqual(1, collectCalculationsPerSegment["secondSection"].Count); } + + [Test] + public void FailureMechanismSectionForCalculation_NullParameters_Null() + { + // Call + var failureMechanismSection = GrassCoverErosionInwardsHelper.FailureMechanismSectionForCalculation(null, null); + + // Assert + Assert.IsNull(failureMechanismSection); + } + + [Test] + public void FailureMechanismSectionForCalculation_FirstParameterNull_Null() + { + // Setup + var calculation = new GrassCoverErosionInwardsCalculation(); + + // Call + var failureMechanismSection = GrassCoverErosionInwardsHelper.FailureMechanismSectionForCalculation(null, calculation); + + // Assert + Assert.IsNull(failureMechanismSection); + } + + [Test] + public void FailureMechanismSectionForCalculation_SecondParameterNull_Null() + { + // Call + var failureMechanismSection = GrassCoverErosionInwardsHelper.FailureMechanismSectionForCalculation(oneSectionResult, null); + + // Assert + Assert.IsNull(failureMechanismSection); + } + + [Test] + public void FailureMechanismSectionForCalculation_ValidEmptyFirstParameter_Null() + { + // Setup + var calculation = new GrassCoverErosionInwardsCalculation(); + + // Call + var failureMechanismSection = GrassCoverErosionInwardsHelper.FailureMechanismSectionForCalculation(oneSectionResult, calculation); + + // Assert + Assert.IsNull(failureMechanismSection); + } + + [Test] + public void FailureMechanismSectionForCalculation_FirstSectionResultContainsCalculation_FailureMechanismSectionOfFirstSectionResult() + { + // Setup + var calculation = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + DikeProfile = new DikeProfile(new Point2D(1.1, 2.2), new RoughnessPoint[0], new Point2D[0]) + } + }; + + // Call + var failureMechanismSection = GrassCoverErosionInwardsHelper.FailureMechanismSectionForCalculation(twoSectionResults, calculation); + + // Assert + Assert.AreSame(twoSectionResults[0].Section, failureMechanismSection); + } + + [Test] + public void FailureMechanismSectionForCalculation_SecondSectionResultContainsCalculation_FailureMechanismSectionOfSecondSectionResult() + { + // Setup + var calculation = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + DikeProfile = new DikeProfile(new Point2D(50.0, 66.0), new RoughnessPoint[0], new Point2D[0]) + } + }; + + // Call + var failureMechanismSection = GrassCoverErosionInwardsHelper.FailureMechanismSectionForCalculation(twoSectionResults, calculation); + + // Assert + Assert.AreSame(twoSectionResults[1].Section, failureMechanismSection); + } } } \ No newline at end of file