// Copyright (C) Stichting Deltares 2021. 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.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 string outputXml = Path.Combine(TestFolder, "ProfileOutput.xml");
private const string testDirectory = "TestResults";
private const string testFileName = "Geometry2DSectionAssemblerTest.xml";
private const double cTolerance = 1e-8;
private Geometry2DSectionAssembler assembler;
private Geometry2DSectionParameters geometry2DSectionParameters;
#region Setup/Teardown
[SetUp]
public void TestSetup()
{
const string soilGeometry2DName = "SoilGeometry2DName";
this.assembler = new Geometry2DSectionAssembler();
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, Ignore]
[Category(Categories.WorkInProgress)]
public void CanCreateAndValidateGeometry2DSectionXML()
{
// 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 == Geometry2DSectionAssembler.XmlElementGeometry2DSectionInput
select element).Single();
// Database
Assert.AreEqual(this.geometry2DSectionParameters.SoilGeometry2DName, inputElement.AttributeAs(Geometry2DSectionAssembler.XmlAttributeSoilGeometry2DFilename), String.Format("{0}", Geometry2DSectionAssembler.XmlAttributeSoilGeometry2DFilename));
Assert.AreEqual(this.geometry2DSectionParameters.XCoordinateSection, inputElement.AttributeAs(Geometry2DSectionAssembler.XmlAttributeXCoordinateSection), String.Format("{0}", Geometry2DSectionAssembler.XmlAttributeXCoordinateSection));
// Profile
IEnumerable soilProfileCollectionElements = from element in doc.Root.Descendants()
where element.Name.LocalName == XMLAttributes.XmlElementProfile
select element;
Assert.AreEqual(1, soilProfileCollectionElements.Count(), "Number of profiles");
XElement soilProfileElement = soilProfileCollectionElements.Single();
Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeName), String.Format("{0}", XMLAttributes.XmlAttributeName));
Assert.AreEqual(geometry2DSectionParameters.SoilProfile.Name, soilProfileElement.AttributeAs(XMLAttributes.XmlAttributeName), String.Format("{0}", XMLAttributes.XmlAttributeName));
Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeXCoordinate), String.Format("{0}", XMLAttributes.XmlAttributeXCoordinate));
Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeYCoordinate), String.Format("{0}", XMLAttributes.XmlAttributeYCoordinate));
Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributePhreaticLevel), String.Format("{0}", XMLAttributes.XmlAttributePhreaticLevel));
Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeHasPhreaticLevel), String.Format("{0}", XMLAttributes.XmlAttributeHasPhreaticLevel));
Assert.IsNotNull(soilProfileElement.Attribute(XMLAttributes.XmlAttributeBottomLevel), String.Format("{0}", XMLAttributes.XmlAttributeBottomLevel));
Assert.AreEqual(geometry2DSectionParameters.SoilProfile.BottomLevel, soilProfileElement.AttributeAs(XMLAttributes.XmlAttributeBottomLevel), cTolerance, String.Format("{0}", 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.AreEqual(1, layersCollectionElements.Count(), "profile layer collection tag");
IEnumerable layerCollectionElements = from element in layersCollectionElements.Descendants()
where element.Name.LocalName == XMLAttributes.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(XMLAttributes.XmlAttributeID), String.Format("{0}", String.Format("ID of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer))));
Assert.AreEqual(layer.Name, layerElement.AttributeAs(XMLAttributes.XmlAttributeID), String.Format("ID of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)));
Assert.IsNotNull(layerElement.Attribute(XMLAttributes.XmlAttributeSoilID), String.Format("{0}", String.Format("SoilID of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer))));
Assert.AreEqual(layer.Soil.Name, layerElement.AttributeAs(XMLAttributes.XmlAttributeSoilID), String.Format("SoilID of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)));
Assert.IsNotNull(layerElement.Attribute(XMLAttributes.XmlAttributeTopLevel), String.Format("{0}", String.Format("TopLevel of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer))));
Assert.AreEqual(layer.TopLevel, layerElement.AttributeAs(XMLAttributes.XmlAttributeTopLevel), String.Format("TopLevel of layer #{0}", geometry2DSectionParameters.SoilProfile.Layers.IndexOf(layer)));
}
}
[Test]
public void CanReadGeometry2DSectionXML()
{
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);
}
}
}