// Copyright (C) Stichting Deltares 2019. 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; using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Linq; using Deltares.DamEngine.Calculators.General; using Deltares.DamEngine.Calculators.KernelWrappers.DamMacroStabilityCommon.Assemblers; using Deltares.DamEngine.Data.Geotechnics; using NUnit.Framework; namespace Deltares.DamEngine.Calculators.Tests.KernelWrappers.DamMacroStabilityCommon { [TestFixture] public class DAMMStabGeometry2DSectionAssemblerTest { private const string TestFolder = @"..\..\Deltares.DamEngine.Calculators.Tests\KernelWrappers\DamMacroStabilityCommon\TestData"; private string outputXml = Path.Combine(TestFolder, "ProfileOutput.xml"); private const string testDirectory = "TestResults"; private const string testFileName = "DAMMStabGeometry2DSectionAssemblerTest.xml"; private const double cTolerance = 1e-8; private DamMstabGeometry2DSectionAssembler assembler; private Geometry2DSectionParameters geometry2DSectionParameters; #region Setup/Teardown [SetUp] public void TestSetup() { const string soilGeometry2DName = "SoilGeometry2DName"; this.assembler = new DamMstabGeometry2DSectionAssembler(); this.geometry2DSectionParameters = new Geometry2DSectionParameters(); this.geometry2DSectionParameters.XCoordinateSection = 65.4; this.geometry2DSectionParameters.SoilGeometry2DName = soilGeometry2DName; // Soil profiles var soilProfile = new SoilProfile1D(); soilProfile.Name = "SoilProfile1"; soilProfile.BottomLevel = -25.3; Soil soilClay = new Soil("Clay", 20.0, 20.0); Soil soilPeat = new Soil("Peat", 20.0, 20.0); Soil 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); this.geometry2DSectionParameters.SoilProfile = soilProfile; } #endregion [TestFixtureSetUp] public void TestFixtureSetup() { } [Test] public void CanCreateAndValidateDAMMStabGeometry2DSectionXML() { // Do the thing: create XML element from SoilProfile XDocument doc = this.assembler.CreateDataTransferObject(this.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 == DamMstabGeometry2DSectionAssembler.XmlElementGeometry2DSectionInput select element).Single(); // Database Assert.AreEqual(this.geometry2DSectionParameters.SoilGeometry2DName, inputElement.AttributeAs(DamMstabGeometry2DSectionAssembler.XmlAttributeSoilGeometry2DFilename), String.Format("{0}", DamMstabGeometry2DSectionAssembler.XmlAttributeSoilGeometry2DFilename)); Assert.AreEqual(this.geometry2DSectionParameters.XCoordinateSection, inputElement.AttributeAs(DamMstabGeometry2DSectionAssembler.XmlAttributeXCoordinateSection), String.Format("{0}", DamMstabGeometry2DSectionAssembler.XmlAttributeXCoordinateSection)); // Profile IEnumerable soilProfileCollectionElements = from element in doc.Root.Descendants() where element.Name.LocalName == DamMStabAssembler.XmlElementProfile select element; Assert.AreEqual(1, soilProfileCollectionElements.Count(), "Number of profiles"); XElement soilProfileElement = soilProfileCollectionElements.Single(); Assert.IsNotNull(soilProfileElement.Attribute(DamMStabAssembler.XmlAttributeName), String.Format("{0}", DamMStabAssembler.XmlAttributeName)); Assert.AreEqual(geometry2DSectionParameters.SoilProfile.Name, soilProfileElement.AttributeAs(DamMStabAssembler.XmlAttributeName), String.Format("{0}", DamMStabAssembler.XmlAttributeName)); Assert.IsNotNull(soilProfileElement.Attribute(DamMStabAssembler.XmlAttributeXCoordinate), String.Format("{0}", DamMStabAssembler.XmlAttributeXCoordinate)); Assert.IsNotNull(soilProfileElement.Attribute(DamMStabAssembler.XmlAttributeYCoordinate), String.Format("{0}", DamMStabAssembler.XmlAttributeYCoordinate)); Assert.IsNotNull(soilProfileElement.Attribute(DamMStabAssembler.XmlAttributePhreaticLevel), String.Format("{0}", DamMStabAssembler.XmlAttributePhreaticLevel)); Assert.IsNotNull(soilProfileElement.Attribute(DamMStabAssembler.XmlAttributeHasPhreaticLevel), String.Format("{0}", DamMStabAssembler.XmlAttributeHasPhreaticLevel)); Assert.IsNotNull(soilProfileElement.Attribute(DamMStabAssembler.XmlAttributeBottomLevel), String.Format("{0}", DamMStabAssembler.XmlAttributeBottomLevel)); Assert.AreEqual(geometry2DSectionParameters.SoilProfile.BottomLevel, soilProfileElement.AttributeAs(DamMStabAssembler.XmlAttributeBottomLevel), cTolerance, String.Format("{0}", DamMStabAssembler.XmlAttributeBottomLevel)); // Created no PL line so characteristic layers are unassigned Assert.IsNotNull(soilProfileElement.Attribute(DamMStabAssembler.XmlAttributeBottomSandLayerID), DamMStabAssembler.XmlAttributeBottomSandLayerID); Assert.IsNotNull(soilProfileElement.Attribute(DamMStabAssembler.XmlAttributeInBetweenSandLayerID), DamMStabAssembler.XmlAttributeInBetweenSandLayerID); Assert.IsNull(soilProfileElement.Attribute(DamMStabAssembler.XmlAttributeInfiltrationLayerID), DamMStabAssembler.XmlAttributeInfiltrationLayerID); // Profile layers IEnumerable layersCollectionElements = from element in soilProfileElement.Descendants() where element.Name.LocalName == DamMStabAssembler.XmlElementLayers select element; Assert.AreEqual(1, layersCollectionElements.Count(), "profile layer collection tag"); IEnumerable layerCollectionElements = from element in layersCollectionElements.Descendants() where element.Name.LocalName == DamMStabAssembler.XmlElementLayer select element; Assert.AreEqual(geometry2DSectionParameters.SoilProfile.Layers.Count, layerCollectionElements.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(DamMStabAssembler.XmlAttributeID), String.Format("{0}", String.Format("ID of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)))); Assert.AreEqual(layer.Name, layerElement.AttributeAs(DamMStabAssembler.XmlAttributeID), String.Format("ID of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer))); Assert.IsNotNull(layerElement.Attribute(DamMStabAssembler.XmlAttributeSoilID), String.Format("{0}", String.Format("SoilID of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)))); Assert.AreEqual(layer.Soil.Name, layerElement.AttributeAs(DamMStabAssembler.XmlAttributeSoilID), String.Format("SoilID of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer))); Assert.IsNotNull(layerElement.Attribute(DamMStabAssembler.XmlAttributeTopLevel), String.Format("{0}", String.Format("TopLevel of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)))); Assert.AreEqual(layer.TopLevel, layerElement.AttributeAs(DamMStabAssembler.XmlAttributeTopLevel), String.Format("TopLevel of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer))); } } [Test] public void CanReadDAMMStabGeometry2DSectionXML() { XDocument doc = XDocument.Load(outputXml); Geometry2DSectionParameters geometry2DSectionParameters = assembler.CreateOutputObject(doc); Assert.AreEqual(6, geometry2DSectionParameters.SoilProfile.Layers.Count); Assert.AreEqual(-10, geometry2DSectionParameters.SoilProfile.BottomLevel, cTolerance); Assert.IsTrue(geometry2DSectionParameters.SoilProfile.Layers[3].SoilName.Equals("DKN3")); Assert.AreEqual(-2.8, geometry2DSectionParameters.SoilProfile.Layers[3].TopLevel, cTolerance); Assert.IsTrue(geometry2DSectionParameters.SoilGeometry2DName.Equals("1D1.sti")); Assert.AreEqual(64.0, geometry2DSectionParameters.XCoordinateSection, cTolerance); } } }