Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/DamEngineIo/XMLSoilProfile2DConverter.cs =================================================================== diff -u -r3034 -r3043 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/DamEngineIo/XMLSoilProfile2DConverter.cs (.../XMLSoilProfile2DConverter.cs) (revision 3034) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/DamEngineIo/XMLSoilProfile2DConverter.cs (.../XMLSoilProfile2DConverter.cs) (revision 3043) @@ -25,6 +25,7 @@ using Deltares.DamEngine.Io.XmlInput; using Deltares.Geometry; using Deltares.Geotechnics.Soils; +using Deltares.Standard.Extensions; using SoilProfile2D = Deltares.Geotechnics.Soils.SoilProfile2D; using XMLSoilProfile2D = Deltares.DamEngine.Io.XmlInput.SoilProfile2D; using XMLSoilLayer2D = Deltares.DamEngine.Io.XmlInput.SoilProfile2DLayer2D; @@ -40,13 +41,14 @@ public static class XMLSoilProfile2DConverter { /// - /// Creates a new instance based on . + /// Converts the to a new instance of . /// - /// The to create a - /// for. + /// The to convert. /// A . /// Thrown when /// is null. + /// Thrown when + /// could not be successfully converted. public static XMLSoilProfile2D Convert(SoilProfile2D soilProfile) { if (soilProfile == null) @@ -71,30 +73,53 @@ return convertedSoilProfile; } + /// + /// Converts the input arguments to a new instance of . + /// + /// The soil layer to convert. + /// A . + /// Thrown when + /// could not be successfully created from . private static XMLSoilLayer2D ConvertSoilLayer(SoilLayer2D soilLayer) { + string soilLayerName = soilLayer.Name; var convertedLayer = new XMLSoilLayer2D { - SoilName = soilLayer.Name, - IsAquifer = soilLayer.IsAquifer + SoilName = soilLayerName, + IsAquifer = soilLayer.IsAquifer, + WaterpressureInterpolationModel = 2 // Corresponds with the 'hydrostatic' value in DSoilModel }; GeometrySurface surface = soilLayer.GeometrySurface; - convertedLayer.Surface = ConvertSGeometrySurface(surface); + convertedLayer.Surface = ConvertGeometrySurface(soilLayerName, surface); return convertedLayer; } - private static XMLSoilLayer2DSurface ConvertSGeometrySurface(GeometrySurface surface) + /// + /// Converts a to a . + /// + /// The name of the layer to create a xml soil layer surface for. + /// The surface to create a xml soil layer surface for. + /// A . + /// Thrown when + /// could not be successfully created from . + private static XMLSoilLayer2DSurface ConvertGeometrySurface(string layerName, GeometrySurface surface) { var convertedSurface = new XMLSoilLayer2DSurface { - OuterLoop = ConvertOuterLoop(surface.OuterLoop.Points), + OuterLoop = ConvertOuterLoop(surface.OuterLoop.Points) }; - // TODO: throw exception when there are more inner loops var innerLoop = surface.InnerLoops; - convertedSurface.Innerloop = !surface.InnerLoops.Any() + int nrOfInnerLoops = innerLoop.Count; + if (nrOfInnerLoops > 1) + { + // Note that the exception message does not match of what is being asserted. + throw new ConversionException($"{layerName} contains more than 1 inner loop.", null); + } + + convertedSurface.Innerloop = nrOfInnerLoops == 0 ? new XMLSurfaceInnerPoint[0] : ConvertInnerLoop(innerLoop.Single().Points); Index: DamClients/DamUI/trunk/src/Dam/Tests/DamEngineIo/XMLSoilProfile2DConverterTest.cs =================================================================== diff -u -r3034 -r3043 --- DamClients/DamUI/trunk/src/Dam/Tests/DamEngineIo/XMLSoilProfile2DConverterTest.cs (.../XMLSoilProfile2DConverterTest.cs) (revision 3034) +++ DamClients/DamUI/trunk/src/Dam/Tests/DamEngineIo/XMLSoilProfile2DConverterTest.cs (.../XMLSoilProfile2DConverterTest.cs) (revision 3043) @@ -25,6 +25,7 @@ using Deltares.Dam.Data.DamEngineIo; using Deltares.Geometry; using Deltares.Geotechnics.Soils; +using Deltares.Standard.Extensions; using NUnit.Framework; using SoilProfile2D = Deltares.Geotechnics.Soils.SoilProfile2D; using XMLSoilProfile2D = Deltares.DamEngine.Io.XmlInput.SoilProfile2D; @@ -38,7 +39,6 @@ [TestFixture] public class XMLSoilProfile2DConverterTest { - [Test] public void Convert_SoilProfileNull_ThrowsArgumentNullException() { @@ -53,21 +53,14 @@ /// /// ------------------------------------------------------------- - /// Layer three + /// Layer Two /// |----------------------------------------------------| /// | | /// | | /// | | /// |----------------------------------------------------| /// /// ------------------------------------------------------------- - /// Layer two - /// |------------------------| |---------------------| - /// | | | | - /// | | | | - /// |------------------------| |---------------------| - /// - /// ------------------------------------------------------------- /// Layer one /// /// @@ -92,49 +85,27 @@ var layerTwo = new SoilLayer2D { Name = "LayerTwo", - IsAquifer = true, - GeometrySurface = new GeometrySurface() - }; -// layerTwo.GeometrySurface.InnerLoops.AddRange(new [] -// { -// CreateLoop(new GeometryPoint(6, 0, -9), -// new GeometryPoint(9, 0, -9), -// new GeometryPoint(6, 0, -6), -// new GeometryPoint(9, 0, -6)), -// CreateLoop(new GeometryPoint(1, 0, -9), -// new GeometryPoint(4, 0, -9), -// new GeometryPoint(1, 0, -6), -// new GeometryPoint(4, 0, -6)) -// }); - layerTwo.GeometrySurface.OuterLoop = CreateLoop(new GeometryPoint(0, 0, -10), - new GeometryPoint(10, 0, -10), - new GeometryPoint(0, 0, -5), - new GeometryPoint(10, 0, -5)); - - var layerThree = new SoilLayer2D - { - Name = "LayerThree", IsAquifer = false, GeometrySurface = new GeometrySurface() }; - layerThree.GeometrySurface.InnerLoops.AddRange(new[] + layerTwo.GeometrySurface.InnerLoops.AddRange(new[] { CreateLoop(new GeometryPoint(6, 0, -4), new GeometryPoint(9, 0, -4), new GeometryPoint(6, 0, -1), new GeometryPoint(9, 0, -1)) }); - layerThree.GeometrySurface.OuterLoop = CreateLoop(new GeometryPoint(0, 0, -5), - new GeometryPoint(10, 0, -5), + layerTwo.GeometrySurface.OuterLoop = CreateLoop(new GeometryPoint(0, 0, -10), + new GeometryPoint(10, 0, -10), new GeometryPoint(0, 0, 0), new GeometryPoint(10, 0, 0)); var soilProfile = new SoilProfile2D { Name = "SoilProfile2D" }; + soilProfile.Surfaces.Add(layerOne); soilProfile.Surfaces.Add(layerTwo); - soilProfile.Surfaces.Add(layerThree); // Call XMLSoilProfile2D convertedProfile = XMLSoilProfile2DConverter.Convert(soilProfile); @@ -151,12 +122,55 @@ } } + [Test] + public void Convert_SoilProfileContainsSoilLayerWithTwoInnerLoops_ThrowsConversionException() + { + // Setup + const string invalidLayerName = "invalidLayer"; + var invalidLayer = new SoilLayer2D + { + Name = invalidLayerName, + IsAquifer = true, + GeometrySurface = new GeometrySurface() + }; + invalidLayer.GeometrySurface.InnerLoops.AddRange(new [] + { + CreateLoop(new GeometryPoint(6, 0, -9), + new GeometryPoint(9, 0, -9), + new GeometryPoint(6, 0, -6), + new GeometryPoint(9, 0, -6)), + CreateLoop(new GeometryPoint(1, 0, -9), + new GeometryPoint(4, 0, -9), + new GeometryPoint(1, 0, -6), + new GeometryPoint(4, 0, -6)) + }); + invalidLayer.GeometrySurface.OuterLoop = CreateLoop(new GeometryPoint(0, 0, -10), + new GeometryPoint(10, 0, -10), + new GeometryPoint(0, 0, -5), + new GeometryPoint(10, 0, -5)); + + var soilProfile = new SoilProfile2D + { + Name = "SoilProfile2D" + }; + soilProfile.Surfaces.Add(invalidLayer); + + // Call + TestDelegate call = () => XMLSoilProfile2DConverter.Convert(soilProfile); + + // Assert + Assert.That(call, Throws.Exception.TypeOf() + .With.Message.EqualTo("No soil assigned contains more than 1 inner loop.")); + } + private static void AssertLayer(SoilLayer2D soilLayer, XMLSoilLayer2D convertedSoilLayer) { Assert.That(convertedSoilLayer.SoilName, Is.EqualTo(soilLayer.Name)); Assert.That(convertedSoilLayer.IsAquifer, Is.EqualTo(soilLayer.IsAquifer)); - Assert.That(convertedSoilLayer.WaterpressureInterpolationModel, Is.EqualTo(0)); // Water pressure interpolation model is not instantiated. + // Water pressure interpolation model should be set to Hydrostatic as default (which is value = 2 in DSoilModel) + Assert.That(convertedSoilLayer.WaterpressureInterpolationModel, Is.EqualTo(2)); + AssertSurface(soilLayer.GeometrySurface, convertedSoilLayer.Surface); }