// Copyright (C) Stichting Deltares 2024. All rights reserved. // // This file is part of the Dam Engine. // // The Dam Engine is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero 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.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Linq; using Deltares.DamEngine.Calculators.General; using Deltares.DamEngine.Calculators.KernelWrappers.Assemblers; using Deltares.DamEngine.Data.Geotechnics; using Deltares.DamEngine.TestHelpers; using NUnit.Framework; namespace Deltares.DamEngine.Calculators.Tests.KernelWrappers.Assemblers; [TestFixture] public class Geometry2DSectionAssemblerTest { private const string TestFolder = @"..\..\..\Deltares.DamEngine.Calculators.Tests\KernelWrappers\Assemblers\TestData"; private const string testDirectory = "TestResults"; private const string testFileName = "Geometry2DSectionAssemblerTest.xml"; private const double cTolerance = 1e-8; private readonly string outputXml = Path.Combine(TestFolder, "ProfileOutput.xml"); private Geometry2DSectionAssembler assembler; private Geometry2DSectionParameters geometry2DSectionParameters; [SetUp] public void TestFixtureSetup() {} #region Setup/Teardown [SetUp] public void TestSetup() { const string soilGeometry2DName = "SoilGeometry2DName"; assembler = new Geometry2DSectionAssembler(); geometry2DSectionParameters = new Geometry2DSectionParameters(); geometry2DSectionParameters.XCoordinateSection = 65.4; geometry2DSectionParameters.SoilGeometry2DName = soilGeometry2DName; // Soil profiles var soilProfile = new SoilProfile1D(); soilProfile.Name = "SoilProfile1"; soilProfile.BottomLevel = -25.3; var soilClay = new Soil("Clay", 20.0, 20.0); var soilPeat = new Soil("Peat", 20.0, 20.0); var soilSand = new Soil("Sand", 20.0, 20.0); var layer = new SoilLayer1D(); layer.Name = "L1"; layer.SoilName = "Layer 1"; layer.TopLevel = -1.52; layer.Soil = soilClay; layer.IsAquifer = false; soilProfile.Layers.Add(layer); layer = new SoilLayer1D(); layer.Name = "L2"; layer.SoilName = "Layer 2"; layer.TopLevel = -3.18; layer.Soil = soilPeat; layer.IsAquifer = false; soilProfile.Layers.Add(layer); layer = new SoilLayer1D(); layer.Name = "L3"; layer.SoilName = "Layer 3"; layer.TopLevel = -7.37; layer.Soil = soilSand; layer.IsAquifer = true; soilProfile.Layers.Add(layer); layer = new SoilLayer1D(); layer.Name = "L4"; layer.SoilName = "Layer 4"; layer.TopLevel = -12.28; layer.Soil = soilPeat; layer.IsAquifer = false; soilProfile.Layers.Add(layer); layer = new SoilLayer1D(); layer.Name = "L5"; layer.SoilName = "Layer 5"; layer.TopLevel = -15.62; layer.Soil = soilClay; layer.IsAquifer = false; soilProfile.Layers.Add(layer); layer = new SoilLayer1D(); layer.Name = "L6"; layer.SoilName = "Layer 6"; layer.TopLevel = -18.39; layer.Soil = soilSand; layer.IsAquifer = true; soilProfile.Layers.Add(layer); geometry2DSectionParameters.SoilProfile = soilProfile; } #endregion [Test] [Category(Categories.WorkInProgress), Ignore("This test is not yet implemented, waits on stix implementation")] public void CanCreateAndValidateGeometry2DSectionXML() { // Do the thing: create XML element from SoilProfile XDocument doc = assembler.CreateDataTransferObject(geometry2DSectionParameters); Directory.CreateDirectory(testDirectory); doc.Save(Path.Combine(testDirectory, testFileName)); //// Validate against schema //string message; //if (!this.assembler.ValidateSchema(doc, out message)) //{ // Assert.Fail("SCHEMA VALIDATION: " + message); //} // Compare resulting XML to original object // Input XElement inputElement = (from element in doc.Root.Descendants() where element.Name.LocalName == Geometry2DSectionAssembler.XmlElementGeometry2DSectionInput select element).Single(); // Database Assert.That(inputElement.AttributeAs(Geometry2DSectionAssembler.XmlAttributeSoilGeometry2DFilename), Is.EqualTo(geometry2DSectionParameters.SoilGeometry2DName), $"{Geometry2DSectionAssembler.XmlAttributeSoilGeometry2DFilename}"); Assert.That(inputElement.AttributeAs(Geometry2DSectionAssembler.XmlAttributeXCoordinateSection), Is.EqualTo(geometry2DSectionParameters.XCoordinateSection), $"{Geometry2DSectionAssembler.XmlAttributeXCoordinateSection}"); // Profile IEnumerable soilProfileCollectionElements = from element in doc.Root.Descendants() where element.Name.LocalName == XMLAttributes.XmlElementProfile select element; Assert.That(soilProfileCollectionElements.Count(), Is.EqualTo(1), "Number of profiles"); XElement soilProfileElement = soilProfileCollectionElements.Single(); Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeName), $"{XMLAttributes.XmlAttributeName}"); Assert.That(soilProfileElement.AttributeAs(XMLAttributes.XmlAttributeName), Is.EqualTo(geometry2DSectionParameters.SoilProfile.Name), $"{XMLAttributes.XmlAttributeName}"); Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeXCoordinate), $"{XMLAttributes.XmlAttributeXCoordinate}"); Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeYCoordinate), $"{XMLAttributes.XmlAttributeYCoordinate}"); Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributePhreaticLevel), $"{XMLAttributes.XmlAttributePhreaticLevel}"); Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeHasPhreaticLevel), $"{XMLAttributes.XmlAttributeHasPhreaticLevel}"); Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeBottomLevel), $"{XMLAttributes.XmlAttributeBottomLevel}"); Assert.That(soilProfileElement.AttributeAs(XMLAttributes.XmlAttributeBottomLevel), Is.EqualTo(geometry2DSectionParameters.SoilProfile.BottomLevel).Within(cTolerance), $"{XMLAttributes.XmlAttributeBottomLevel}"); // Created no PL line so characteristic layers are unassigned Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeBottomSandLayerID), XMLAttributes.XmlAttributeBottomSandLayerID); Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeInBetweenSandLayerID), XMLAttributes.XmlAttributeInBetweenSandLayerID); Assert.IsNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeInfiltrationLayerID), XMLAttributes.XmlAttributeInfiltrationLayerID); // Profile layers IEnumerable layersCollectionElements = from element in soilProfileElement.Descendants() where element.Name.LocalName == XMLAttributes.XmlElementLayers select element; Assert.That(layersCollectionElements.Count(), Is.EqualTo(1), "profile layer collection tag"); IEnumerable layerCollectionElements = from element in layersCollectionElements.Descendants() where element.Name.LocalName == XMLAttributes.XmlElementLayer select element; Assert.That(layerCollectionElements.Count(), Is.EqualTo(geometry2DSectionParameters.SoilProfile.Layers.Count), "Number of profile layers"); IEnumerator layerElementEnumerator = layerCollectionElements.GetEnumerator(); foreach (SoilLayer1D layer in geometry2DSectionParameters.SoilProfile.Layers) { layerElementEnumerator.MoveNext(); XElement layerElement = layerElementEnumerator.Current; Assert.IsNotNull(layerElement.Attribute(XMLAttributes.XmlAttributeID), $"{$"ID of layer #{geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)}"}"); Assert.That(layerElement.AttributeAs(XMLAttributes.XmlAttributeID), Is.EqualTo(layer.Name), $"ID of layer #{geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)}"); Assert.IsNotNull(layerElement.Attribute(XMLAttributes.XmlAttributeSoilID), $"{$"SoilID of layer #{geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)}"}"); Assert.That(layerElement.AttributeAs(XMLAttributes.XmlAttributeSoilID), Is.EqualTo(layer.Soil.Name), $"SoilID of layer #{geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)}"); Assert.IsNotNull(layerElement.Attribute(XMLAttributes.XmlAttributeTopLevel), $"{$"TopLevel of layer #{geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)}"}"); Assert.That(layerElement.AttributeAs(XMLAttributes.XmlAttributeTopLevel), Is.EqualTo(layer.TopLevel), $"TopLevel of layer #{geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)}"); } } [Test] public void CanReadGeometry2DSectionXML() { XDocument doc = XDocument.Load(outputXml); Geometry2DSectionParameters geometry2DSectionParameters = assembler.CreateOutputObject(doc); Assert.That(geometry2DSectionParameters.SoilProfile.Layers.Count, Is.EqualTo(6)); Assert.That(geometry2DSectionParameters.SoilProfile.BottomLevel, Is.EqualTo(-10).Within(cTolerance)); Assert.IsTrue(geometry2DSectionParameters.SoilProfile.Layers[3].SoilName.Equals("DKN3")); Assert.That(geometry2DSectionParameters.SoilProfile.Layers[3].TopLevel, Is.EqualTo(-2.8).Within(cTolerance)); Assert.IsTrue(geometry2DSectionParameters.SoilGeometry2DName.Equals("1D1.sti")); Assert.That(geometry2DSectionParameters.XCoordinateSection, Is.EqualTo(64.0).Within(cTolerance)); } }