Index: Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Forms/Factories/DuneErosionMapDataFeaturesFactory.cs =================================================================== diff -u -rd77f0eae87afa15b1a5484d5ef7c54f952a04166 -r96ac681afe124833d844548e00dee33c5aa81414 --- Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Forms/Factories/DuneErosionMapDataFeaturesFactory.cs (.../DuneErosionMapDataFeaturesFactory.cs) (revision d77f0eae87afa15b1a5484d5ef7c54f952a04166) +++ Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Forms/Factories/DuneErosionMapDataFeaturesFactory.cs (.../DuneErosionMapDataFeaturesFactory.cs) (revision 96ac681afe124833d844548e00dee33c5aa81414) @@ -20,13 +20,16 @@ // All rights reserved. using System; +using System.Collections.Generic; using System.Globalization; +using System.Linq; using Core.Components.Gis.Data; using Core.Components.Gis.Features; using Ringtoets.Common.Forms.Factories; using Ringtoets.Common.Util; using Ringtoets.DuneErosion.Data; using Ringtoets.DuneErosion.Forms.Properties; +using Ringtoets.DuneErosion.Forms.Views; using RingtoetsDuneErosionDataResources = Ringtoets.DuneErosion.Data.Properties.Resources; using RingtoetsCommonUtilResources = Ringtoets.Common.Util.Properties.Resources; @@ -75,5 +78,54 @@ return features; } + + /// + /// Create dune location features based on the provided . + /// + /// The to create the location features for. + /// An array of features or an empty array when does not contain + /// any dune locations. + /// Thrown when is null. + public static IEnumerable CreateDuneLocationFeatures(DuneErosionFailureMechanism failureMechanism) + { + if (failureMechanism == null) + { + throw new ArgumentNullException(nameof(failureMechanism)); + } + + return AggregatedDuneLocationFactory.CreateAggregatedDuneLocations(failureMechanism) + .Select(CreateDuneLocationFeature) + .ToArray(); + } + + private static MapFeature CreateDuneLocationFeature(AggregatedDuneLocation location) + { + MapFeature feature = RingtoetsMapDataFeaturesFactoryHelper.CreateSinglePointMapFeature(location.Location); + feature.MetaData[RingtoetsCommonUtilResources.MetaData_ID] = location.Id; + feature.MetaData[RingtoetsCommonUtilResources.MetaData_Name] = location.Name; + feature.MetaData[Resources.MetaData_CoastalAreaId] = location.CoastalAreaId; + feature.MetaData[Resources.MetaData_Offset] = location.Offset.ToString(RingtoetsDuneErosionDataResources.DuneLocation_Offset_format, + CultureInfo.InvariantCulture); + + feature.MetaData["Rekenwaarde h(Iv->IIv)"] = location.WaterLevelForMechanismSpecificFactorizedSignalingNorm.ToString(); + feature.MetaData["Rekenwaarde h(IIv->IIIv)"] = location.WaterLevelForMechanismSpecificSignalingNorm.ToString(); + feature.MetaData["Rekenwaarde h(IIIv->IVv)"] = location.WaterLevelForMechanismSpecificLowerLimitNorm.ToString(); + feature.MetaData["Rekenwaarde h(IVv->Vv)"] = location.WaterLevelForLowerLimitNorm.ToString(); + feature.MetaData["Rekenwaarde h(Vv->VIv)"] = location.WaterLevelForFactorizedLowerLimitNorm.ToString(); + + feature.MetaData["Rekenwaarde Hs(Iv->IIv)"] = location.WaveHeightForMechanismSpecificFactorizedSignalingNorm.ToString(); + feature.MetaData["Rekenwaarde Hs(IIv->IIIv)"] = location.WaveHeightForMechanismSpecificSignalingNorm.ToString(); + feature.MetaData["Rekenwaarde Hs(IIIv->IVv)"] = location.WaveHeightForMechanismSpecificLowerLimitNorm.ToString(); + feature.MetaData["Rekenwaarde Hs(IVv->Vv)"] = location.WaveHeightForLowerLimitNorm.ToString(); + feature.MetaData["Rekenwaarde Hs(Vv->VIv)"] = location.WaveHeightForFactorizedLowerLimitNorm.ToString(); + + feature.MetaData["Rekenwaarde Tp(Iv->IIv)"] = location.WavePeriodForMechanismSpecificFactorizedSignalingNorm.ToString(); + feature.MetaData["Rekenwaarde Tp(IIv->IIIv)"] = location.WavePeriodForMechanismSpecificSignalingNorm.ToString(); + feature.MetaData["Rekenwaarde Tp(IIIv->IVv)"] = location.WavePeriodForMechanismSpecificLowerLimitNorm.ToString(); + feature.MetaData["Rekenwaarde Tp(IVv->Vv)"] = location.WavePeriodForLowerLimitNorm.ToString(); + feature.MetaData["Rekenwaarde Tp(Vv->VIv)"] = location.WavePeriodForFactorizedLowerLimitNorm.ToString(); + + return feature; + } } } \ No newline at end of file Index: Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/Factories/DuneErosionMapDataFeaturesFactoryTest.cs =================================================================== diff -u -r649b0974fb71df7368d19682bc255618f44d49c1 -r96ac681afe124833d844548e00dee33c5aa81414 --- Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/Factories/DuneErosionMapDataFeaturesFactoryTest.cs (.../DuneErosionMapDataFeaturesFactoryTest.cs) (revision 649b0974fb71df7368d19682bc255618f44d49c1) +++ Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/Factories/DuneErosionMapDataFeaturesFactoryTest.cs (.../DuneErosionMapDataFeaturesFactoryTest.cs) (revision 96ac681afe124833d844548e00dee33c5aa81414) @@ -20,13 +20,15 @@ // All rights reserved. using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Core.Components.Gis.Features; using NUnit.Framework; using Ringtoets.Common.Data.TestUtil; +using Ringtoets.Common.Util.TestUtil; using Ringtoets.DuneErosion.Data; using Ringtoets.DuneErosion.Data.TestUtil; using Ringtoets.DuneErosion.Forms.Factories; @@ -40,7 +42,7 @@ public void CreateDuneLocationFeatures_DuneLocationsNull_ThrowsArgumentNullException() { // Call - TestDelegate call = () => DuneErosionMapDataFeaturesFactory.CreateDuneLocationFeatures(null); + TestDelegate call = () => DuneErosionMapDataFeaturesFactory.CreateDuneLocationFeatures((DuneLocation[]) null); // Assert string paramName = Assert.Throws(call).ParamName; @@ -132,6 +134,159 @@ AssertEqualFeatureCollections(points, features); } + [Test] + public void CreateDuneLocationsFeatures_FailureMechanismNull_ThrowsArgumentNullException() + { + // Call + TestDelegate call = () => DuneErosionMapDataFeaturesFactory.CreateDuneLocationFeatures((DuneErosionFailureMechanism) null); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("failureMechanism", exception.ParamName); + } + + [Test] + public void CreateDuneLocationFeatures_FailureMechanismWithoutDuneLocations_ReturnsEmptyFeaturesArray() + { + // Call + IEnumerable features = DuneErosionMapDataFeaturesFactory.CreateDuneLocationFeatures(new DuneErosionFailureMechanism()); + + // Assert + CollectionAssert.IsEmpty(features); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void CreateDuneLocationsFeatures_WithFailureMechanism_ReturnFeature(bool withOutput) + { + // Setup + var duneLocations = new[] + { + CreateDuneLocation(1), + CreateDuneLocation(2) + }; + + var failureMechanism = new DuneErosionFailureMechanism(); + failureMechanism.SetDuneLocations(duneLocations); + + if (withOutput) + { + DuneLocationsTestHelper.SetDuneLocationCalculationOutput(failureMechanism); + } + + // Call + IEnumerable features = DuneErosionMapDataFeaturesFactory.CreateDuneLocationFeatures(failureMechanism); + + // Assert + Assert.AreEqual(duneLocations.Length, features.Count()); + + for (var i = 0; i < duneLocations.Length; i++) + { + DuneLocation expectedDuneLocation = duneLocations[i]; + MapFeature mapFeature = features.ElementAt(i); + + Assert.AreEqual(expectedDuneLocation.Id, mapFeature.MetaData["ID"]); + Assert.AreEqual(expectedDuneLocation.Name, mapFeature.MetaData["Naam"]); + Assert.AreEqual(expectedDuneLocation.CoastalAreaId, mapFeature.MetaData["Kustvaknummer"]); + Assert.AreEqual(expectedDuneLocation.Offset.ToString("0.#", CultureInfo.InvariantCulture), mapFeature.MetaData["Metrering"]); + Assert.AreEqual(expectedDuneLocation.Location, mapFeature.MapGeometries.First().PointCollections.First().Single()); + + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaterLevel(failureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde h(Iv->IIv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaterLevel(failureMechanism.CalculationsForMechanismSpecificSignalingNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde h(IIv->IIIv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaterLevel(failureMechanism.CalculationsForMechanismSpecificLowerLimitNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde h(IIIv->IVv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaterLevel(failureMechanism.CalculationsForLowerLimitNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde h(IVv->Vv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaterLevel(failureMechanism.CalculationsForFactorizedLowerLimitNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde h(Vv->VIv)"); + + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaveHeight(failureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Hs(Iv->IIv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaveHeight(failureMechanism.CalculationsForMechanismSpecificSignalingNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Hs(IIv->IIIv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaveHeight(failureMechanism.CalculationsForMechanismSpecificLowerLimitNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Hs(IIIv->IVv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaveHeight(failureMechanism.CalculationsForLowerLimitNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Hs(IVv->Vv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWaveHeight(failureMechanism.CalculationsForFactorizedLowerLimitNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Hs(Vv->VIv)"); + + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWavePeriod(failureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Tp(Iv->IIv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWavePeriod(failureMechanism.CalculationsForMechanismSpecificSignalingNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Tp(IIv->IIIv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWavePeriod(failureMechanism.CalculationsForMechanismSpecificLowerLimitNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Tp(IIIv->IVv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWavePeriod(failureMechanism.CalculationsForLowerLimitNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Tp(IVv->Vv)"); + MapFeaturesMetaDataTestHelper.AssertMetaData( + GetExpectedWavePeriod(failureMechanism.CalculationsForFactorizedLowerLimitNorm, expectedDuneLocation), + mapFeature, "Rekenwaarde Tp(Vv->VIv)"); + + Assert.AreEqual(19, mapFeature.MetaData.Keys.Count); + } + } + + private static DuneLocation CreateDuneLocation(int seed) + { + var random = new Random(seed); + + int id = random.Next(); + return new DuneLocation(id, $"Location_{id}", new Point2D(random.NextDouble(), random.NextDouble()), new DuneLocation.ConstructionProperties + { + CoastalAreaId = random.Next(), + D50 = random.NextDouble(), + Offset = random.NextDouble() + }); + } + + private static string GetExpectedWaterLevel(IEnumerable calculations, + DuneLocation duneLocation) + { + RoundedDouble result = calculations + .Single(calculation => calculation.DuneLocation.Equals(duneLocation)) + .Output?.WaterLevel ?? RoundedDouble.NaN; + + return result.ToString(); + } + + private static string GetExpectedWaveHeight(IEnumerable calculations, + DuneLocation duneLocation) + { + RoundedDouble result = calculations + .Single(calculation => calculation.DuneLocation.Equals(duneLocation)) + .Output?.WaveHeight ?? RoundedDouble.NaN; + + return result.ToString(); + } + + private static string GetExpectedWavePeriod(IEnumerable calculations, + DuneLocation duneLocation) + { + RoundedDouble result = calculations + .Single(calculation => calculation.DuneLocation.Equals(duneLocation)) + .Output?.WavePeriod ?? RoundedDouble.NaN; + + return result.ToString(); + } + private class ValidDuneLocation : DuneLocation { public ValidDuneLocation(Point2D location) : base(0, "", location, new ConstructionProperties()) {} Index: Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/Ringtoets.DuneErosion.Forms.Test.csproj =================================================================== diff -u -rbece430ab05641ddb6fe2976c5683028b82acb08 -r96ac681afe124833d844548e00dee33c5aa81414 --- Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/Ringtoets.DuneErosion.Forms.Test.csproj (.../Ringtoets.DuneErosion.Forms.Test.csproj) (revision bece430ab05641ddb6fe2976c5683028b82acb08) +++ Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/Ringtoets.DuneErosion.Forms.Test.csproj (.../Ringtoets.DuneErosion.Forms.Test.csproj) (revision 96ac681afe124833d844548e00dee33c5aa81414) @@ -118,6 +118,10 @@ {52093DA6-D545-476A-ADFD-12F56625E36B} Ringtoets.Common.Service.TestUtil + + {54DF6303-BF9A-4AE9-BE09-4AF50EF27412} + Ringtoets.Common.Util.TestUtil + {888D4097-8BC2-4703-9FB1-8744C94D525E} Ringtoets.HydraRing.Calculation