// 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);
}
}
}