Index: Core/Common/src/Core.Common.Base/Properties/Resources.Designer.cs =================================================================== diff -u -rc71f15ef23debdc4df0719145291de37aea66c97 -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Core/Common/src/Core.Common.Base/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision c71f15ef23debdc4df0719145291de37aea66c97) +++ Core/Common/src/Core.Common.Base/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -281,15 +281,5 @@ return ResourceManager.GetString("Segment2D_Constructor_Segment_must_be_created_with_two_points", resourceCulture); } } - - /// - /// Looks up a localized string similar to Ondergrondschematisatie '{0}' is meerdere keren gevonden in ondergrondmodel '{1}'. Kansen van voorkomen worden opgeteld.. - /// - public static string StochasticSoilProfileHelper_GetValidatedStochasticProfilesToTransform_StochasticSoilProfile_0_has_multiple_occurences_in_SoilModel_1_Probability_Summed { - get { - return ResourceManager.GetString("StochasticSoilProfileHelper_GetValidatedStochasticProfilesToTransform_StochasticS" + - "oilProfile_0_has_multiple_occurences_in_SoilModel_1_Probability_Summed", resourceCulture); - } - } } } Index: Core/Common/src/Core.Common.Base/Properties/Resources.resx =================================================================== diff -u -r76aba900dac58a4328145a2946b774ebd4a37aa5 -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Core/Common/src/Core.Common.Base/Properties/Resources.resx (.../Resources.resx) (revision 76aba900dac58a4328145a2946b774ebd4a37aa5) +++ Core/Common/src/Core.Common.Base/Properties/Resources.resx (.../Resources.resx) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -183,7 +183,4 @@ {0} moeten een unieke {1} hebben. Gevonden dubbele elementen: {2}. - - Ondergrondschematisatie '{0}' is meerdere keren gevonden in ondergrondmodel '{1}'. Kansen van voorkomen worden opgeteld. - \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.Designer.cs =================================================================== diff -u -rda4a311b2ac60defe1a27a61c8d151f47268a941 -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision da4a311b2ac60defe1a27a61c8d151f47268a941) +++ Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -1694,6 +1694,16 @@ } /// + /// Looks up a localized string similar to Ondergrondschematisatie '{0}' is meerdere keren gevonden in ondergrondmodel '{1}'. Kansen van voorkomen worden opgeteld.. + /// + public static string SoilModelTransformer_GetUniqueStochasticSoilProfiles_StochasticSoilProfile_0_has_multiple_occurences_in_SoilModel_1_Probability_Summed { + get { + return ResourceManager.GetString("SoilModelTransformer_GetUniqueStochasticSoilProfiles_StochasticSoilProfile_0_has_" + + "multiple_occurences_in_SoilModel_1_Probability_Summed", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Het uitlezen van de ondergrondschematisatie is mislukt.. /// public static string SoilProfile1DReader_ReadSoilProfile_Failed_to_construct_profile_from_read_data { Index: Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.resx =================================================================== diff -u -rda4a311b2ac60defe1a27a61c8d151f47268a941 -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.resx (.../Resources.resx) (revision da4a311b2ac60defe1a27a61c8d151f47268a941) +++ Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.resx (.../Resources.resx) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -892,4 +892,7 @@ Kon geen grensspanningen verkrijgen uit de database. + + Ondergrondschematisatie '{0}' is meerdere keren gevonden in ondergrondmodel '{1}'. Kansen van voorkomen worden opgeteld. + \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.IO/Ringtoets.Common.IO.csproj =================================================================== diff -u -r604dfe021f6161f8e5d107dd5821ba06390c5ecf -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Ringtoets/Common/src/Ringtoets.Common.IO/Ringtoets.Common.IO.csproj (.../Ringtoets.Common.IO.csproj) (revision 604dfe021f6161f8e5d107dd5821ba06390c5ecf) +++ Ringtoets/Common/src/Ringtoets.Common.IO/Ringtoets.Common.IO.csproj (.../Ringtoets.Common.IO.csproj) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -160,7 +160,6 @@ - Fisheye: Tag c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 refers to a dead (removed) revision in file `Ringtoets/Common/src/Ringtoets.Common.IO/SoilProfile/StochasticSoilProfileHelper.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/Ringtoets.Common.IO.Test.csproj =================================================================== diff -u -ra1fa1538918813373bcc864f0bce092bf28fd0ce -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/Ringtoets.Common.IO.Test.csproj (.../Ringtoets.Common.IO.Test.csproj) (revision a1fa1538918813373bcc864f0bce092bf28fd0ce) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/Ringtoets.Common.IO.Test.csproj (.../Ringtoets.Common.IO.Test.csproj) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -140,7 +140,6 @@ - Fisheye: Tag c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 refers to a dead (removed) revision in file `Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/StochasticSoilProfileHelperTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.IO/SoilProfiles/MacroStabilityInwardsStochasticSoilModelTransformer.cs =================================================================== diff -u -r57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.IO/SoilProfiles/MacroStabilityInwardsStochasticSoilModelTransformer.cs (.../MacroStabilityInwardsStochasticSoilModelTransformer.cs) (revision 57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.IO/SoilProfiles/MacroStabilityInwardsStochasticSoilModelTransformer.cs (.../MacroStabilityInwardsStochasticSoilModelTransformer.cs) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Linq; +using log4net; using Ringtoets.Common.IO.Exceptions; using Ringtoets.Common.IO.SoilProfile; using Ringtoets.Common.IO.SoilProfile.Schema; @@ -36,6 +37,7 @@ public class MacroStabilityInwardsStochasticSoilModelTransformer : IStochasticSoilModelTransformer { private readonly Dictionary soilProfiles = new Dictionary(); + private static readonly ILog log = LogManager.GetLogger(typeof(MacroStabilityInwardsStochasticSoilModelTransformer)); public MacroStabilityInwardsStochasticSoilModel Transform(StochasticSoilModel stochasticSoilModel) { @@ -79,14 +81,12 @@ IEnumerable stochasticSoilProfiles, string soilModelName) { - IEnumerable profilesToTransform = - StochasticSoilProfileHelper.GetValidatedStochasticSoilProfilesToTransform(stochasticSoilProfiles, - soilModelName); - - return profilesToTransform.Select( + MacroStabilityInwardsStochasticSoilProfile[] transformedProfiles = stochasticSoilProfiles.Select( ssp => MacroStabilityInwardsStochasticSoilProfileTransformer.Transform( ssp, GetTransformedSoilProfile(ssp.SoilProfile))).ToArray(); + + return GetUniqueStochasticSoilProfiles(transformedProfiles, soilModelName); } /// @@ -110,5 +110,47 @@ } return macroStabilityInwardsSoilProfile; } + + /// + /// Filters a collection of to determine which items + /// are unique. + /// + /// The collection of + /// to filter. + /// The name of the soil model. + /// A collection of unique . + /// Thrown when a + /// is invalid. + private static IEnumerable GetUniqueStochasticSoilProfiles( + IEnumerable stochasticSoilProfiles, + string soilModelName) + { + List uniqueStochasticSoilProfiles = stochasticSoilProfiles.ToList(); + MacroStabilityInwardsStochasticSoilProfile[] allStochasticSoilProfiles = uniqueStochasticSoilProfiles.ToArray(); + + try + { + for (var i = 1; i < allStochasticSoilProfiles.Length; i++) + { + MacroStabilityInwardsStochasticSoilProfile previousProfile = allStochasticSoilProfiles[i - 1]; + MacroStabilityInwardsStochasticSoilProfile currentProfile = allStochasticSoilProfiles[i]; + if (ReferenceEquals(currentProfile.SoilProfile, previousProfile.SoilProfile)) + { + log.Warn(string.Format(RingtoetsCommonIOResources.SoilModelTransformer_GetUniqueStochasticSoilProfiles_StochasticSoilProfile_0_has_multiple_occurences_in_SoilModel_1_Probability_Summed, + previousProfile.SoilProfile.Name, + soilModelName)); + + previousProfile.AddProbability(currentProfile.Probability); + uniqueStochasticSoilProfiles.Remove(currentProfile); + } + } + } + catch (ArgumentOutOfRangeException e) + { + throw new ImportedDataTransformException(e.Message, e); + } + + return uniqueStochasticSoilProfiles; + } } } \ No newline at end of file Index: Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.IO.Test/SoilProfiles/MacroStabilityInwardsStochasticSoilModelTransformerTest.cs =================================================================== diff -u -r57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.IO.Test/SoilProfiles/MacroStabilityInwardsStochasticSoilModelTransformerTest.cs (.../MacroStabilityInwardsStochasticSoilModelTransformerTest.cs) (revision 57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff) +++ Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.IO.Test/SoilProfiles/MacroStabilityInwardsStochasticSoilModelTransformerTest.cs (.../MacroStabilityInwardsStochasticSoilModelTransformerTest.cs) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -271,15 +271,12 @@ [Test] [SetCulture("nl-NL")] - public void Transform_ValidStochasticSoilModelWithSameProfileProbabilitExceedingValidRange_ThrowsImportedDataException() + [TestCaseSource(nameof(GetValidConfiguredAndSupportedSoilProfiles))] + public void Transform_ValidStochasticSoilModelWithSameProfileProbabilityExceedingValidRange_ThrowsImportedDataException(ISoilProfile profile) { // Setup const string soilModelName = "name"; - var mocks = new MockRepository(); - var profile = mocks.Stub(); - mocks.ReplayAll(); - StochasticSoilModel soilModel = StochasticSoilModelTestFactory.CreateStochasticSoilModelWithGeometry(soilModelName, FailureMechanismType.Stability, new[] { @@ -296,9 +293,7 @@ var exception = Assert.Throws(call); const string expectedMessage = "Het aandeel van de ondergrondschematisatie in het stochastische ondergrondmodel " + "moet in het bereik [0,0, 1,0] liggen."; - Assert.AreEqual(expectedMessage, exception.Message); - - mocks.VerifyAll(); + StringAssert.StartsWith(expectedMessage, exception.Message); } [Test] @@ -356,5 +351,23 @@ .Cast() .Where(t => t != FailureMechanismType.Stability); } + + private static IEnumerable GetValidConfiguredAndSupportedSoilProfiles() + { + var random = new Random(21); + + const long id = 1; + const string name = "test"; + + yield return new SoilProfile2D(id, name, new[] + { + SoilLayer2DTestFactory.CreateSoilLayer2DWithValidAquifer() + }, Enumerable.Empty()); + + yield return new SoilProfile1D(id, name, random.NextDouble(), new [] + { + SoilLayer1DTestFactory.CreateSoilLayer1DWithValidAquifer() + }); + } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfiles/PipingStochasticSoilModelTransformer.cs =================================================================== diff -u -r57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfiles/PipingStochasticSoilModelTransformer.cs (.../PipingStochasticSoilModelTransformer.cs) (revision 57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfiles/PipingStochasticSoilModelTransformer.cs (.../PipingStochasticSoilModelTransformer.cs) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Linq; +using log4net; using Ringtoets.Common.IO.Exceptions; using Ringtoets.Common.IO.SoilProfile; using Ringtoets.Common.IO.SoilProfile.Schema; @@ -36,6 +37,7 @@ /// public class PipingStochasticSoilModelTransformer : IStochasticSoilModelTransformer { + private static readonly ILog log = LogManager.GetLogger(typeof(PipingStochasticSoilModel)); private readonly Dictionary soilProfiles = new Dictionary(); public PipingStochasticSoilModel Transform(StochasticSoilModel stochasticSoilModel) @@ -77,13 +79,10 @@ private IEnumerable TransformStochasticSoilProfiles(IEnumerable stochasticSoilProfiles, string soilModelName) { - IEnumerable profilesToTransform = - StochasticSoilProfileHelper.GetValidatedStochasticSoilProfilesToTransform(stochasticSoilProfiles, - soilModelName); - - return profilesToTransform.Select(ssp => PipingStochasticSoilProfileTransformer.Transform( - ssp, - GetTransformedPipingSoilProfile(ssp.SoilProfile))).ToArray(); + PipingStochasticSoilProfile[] transformedProfiles = stochasticSoilProfiles.Select(ssp => PipingStochasticSoilProfileTransformer.Transform( + ssp, + GetTransformedPipingSoilProfile(ssp.SoilProfile))).ToArray(); + return GetUniqueStochasticSoilProfiles(transformedProfiles, soilModelName); } /// @@ -107,5 +106,47 @@ } return pipingSoilProfile; } + + /// + /// Filters a collection of to determine which items + /// are unique. + /// + /// The collection of + /// to filter. + /// The name of the soil model. + /// A collection of unique . + /// Thrown when a + /// is invalid. + private static IEnumerable GetUniqueStochasticSoilProfiles( + IEnumerable stochasticSoilProfiles, + string soilModelName) + { + List uniqueStochasticSoilProfiles = stochasticSoilProfiles.ToList(); + PipingStochasticSoilProfile[] allStochasticSoilProfiles = uniqueStochasticSoilProfiles.ToArray(); + + try + { + for (var i = 1; i < allStochasticSoilProfiles.Length; i++) + { + PipingStochasticSoilProfile previousProfile = allStochasticSoilProfiles[i - 1]; + PipingStochasticSoilProfile currentProfile = allStochasticSoilProfiles[i]; + if (ReferenceEquals(currentProfile.SoilProfile, previousProfile.SoilProfile)) + { + log.Warn(string.Format(RingtoetsCommonIOResources.SoilModelTransformer_GetUniqueStochasticSoilProfiles_StochasticSoilProfile_0_has_multiple_occurences_in_SoilModel_1_Probability_Summed, + previousProfile.SoilProfile.Name, + soilModelName)); + + previousProfile.AddProbability(currentProfile.Probability); + uniqueStochasticSoilProfiles.Remove(currentProfile); + } + } + } + catch (ArgumentOutOfRangeException e) + { + throw new ImportedDataTransformException(e.Message, e); + } + + return uniqueStochasticSoilProfiles; + } } } \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfiles/PipingStochasticSoilModelTransformerTest.cs =================================================================== diff -u -r57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfiles/PipingStochasticSoilModelTransformerTest.cs (.../PipingStochasticSoilModelTransformerTest.cs) (revision 57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfiles/PipingStochasticSoilModelTransformerTest.cs (.../PipingStochasticSoilModelTransformerTest.cs) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -25,7 +25,6 @@ using Core.Common.Base.Geometry; using Core.Common.TestUtil; using NUnit.Framework; -using Rhino.Mocks; using Ringtoets.Common.IO.Exceptions; using Ringtoets.Common.IO.SoilProfile; using Ringtoets.Common.IO.SoilProfile.Schema; @@ -273,15 +272,12 @@ [Test] [SetCulture("nl-NL")] - public void Transform_ValidStochasticSoilModelWithSameProfileProbabilityExceedingValidRange_ThrowsImportedDataException() + [TestCaseSource(nameof(GetValidConfiguredAndSupportedSoilProfiles))] + public void Transform_ValidStochasticSoilModelWithSameProfileProbabilityExceedingValidRange_ThrowsImportedDataException(ISoilProfile profile) { // Setup const string soilModelName = "name"; - var mocks = new MockRepository(); - var profile = mocks.Stub(); - mocks.ReplayAll(); - StochasticSoilModel soilModel = StochasticSoilModelTestFactory.CreateStochasticSoilModelWithGeometry(soilModelName, FailureMechanismType.Piping, new[] { new StochasticSoilProfile(0.9, profile), @@ -297,9 +293,7 @@ var exception = Assert.Throws(call); const string expectedMessage = "Het aandeel van de ondergrondschematisatie in het stochastische ondergrondmodel " + "moet in het bereik [0,0, 1,0] liggen."; - Assert.AreEqual(expectedMessage, exception.Message); - - mocks.VerifyAll(); + StringAssert.StartsWith(expectedMessage, exception.Message); } [Test] @@ -370,5 +364,26 @@ .Cast() .Where(t => t != FailureMechanismType.Piping); } + + private static IEnumerable GetValidConfiguredAndSupportedSoilProfiles() + { + var random = new Random(21); + + const long id = 1; + const string name = "test"; + + yield return new SoilProfile2D(id, name, new[] + { + SoilLayer2DTestFactory.CreateSoilLayer2DWithValidAquifer() + }, Enumerable.Empty()) + { + IntersectionX = random.NextDouble() + }; + + yield return new SoilProfile1D(id, name, random.NextDouble(), new[] + { + SoilLayer1DTestFactory.CreateSoilLayer1DWithValidAquifer() + }); + } } } \ No newline at end of file