// 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.Collections.Generic;
using System.IO;
using System.Linq;
using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon;
using NUnit.Framework;
using Deltares.MacroStability.Kernel;
using Deltares.DamEngine.Data.General;
using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo;
using Deltares.DamEngine.Data.Geotechnics;
using Deltares.DamEngine.TestHelpers.Factories;
using Deltares.MacroStability.Data;
using Deltares.MacroStability.Geometry;
using Deltares.MacroStability.Standard;
using Deltares.SoilStress.Data;
using KellermanSoftware.CompareNetObjects;
using CharacteristicPointSet = Deltares.MacroStability.Geometry.CharacteristicPointSet;
using CharacteristicPointType = Deltares.DamEngine.Data.Geotechnics.CharacteristicPointType;
using HeadLine = Deltares.DamEngine.Data.Geometry.HeadLine;
using Soil = Deltares.MacroStability.Geometry.Soil;
using SoilProfile2D = Deltares.DamEngine.Data.Geotechnics.SoilProfile2D;
using SurfaceLine2 = Deltares.DamEngine.Data.Geotechnics.SurfaceLine2;
using Waternet = Deltares.MacroStability.Geometry.Waternet;
namespace Deltares.DamEngine.Calculators.Tests.KernelWrappers.MacroStabilityCommon
{
[TestFixture]
public class MacroStabilityIoTests
{
private const string WtiFilesMap = @"KernelWrappers\MacroStabilityCommon\TestFiles";
private static readonly List SoilParametersToIgnore = new List()
{
"StrengthIncreaseExponent",
"RRatio",
"RheologicalCoefficient",
"BondStressCurve",
"UseSoilType"
};
[TestCase("Benchmark 1-01b.wti")]
[TestCase("Benchmark 2-04a.wti")]
[TestCase("bm3-10c.wti")]
public void GivenWtiFileWhenDeserializingAndSerializingThenTheStringsAreEqual(string fileNameIn)
{
// Given WTI file
string fullFileNameIn = Path.Combine(WtiFilesMap, fileNameIn);
// When Deserializing and Serializing
string xmlInput = File.ReadAllText(fullFileNameIn);
string fileNameOut = fileNameIn + ".out";
string fullFileNameOut = Path.Combine(WtiFilesMap, fileNameOut);
KernelModel kernelModel = WtiDeserializer.Deserialize(xmlInput);
string xmlOutput = WtiSerializer.Serialize(kernelModel);
File.WriteAllText(fullFileNameOut, xmlOutput);
// Then the strings are equal
Assert.AreEqual(xmlInput, xmlOutput);
}
[Test]
// [Category(Categories.WorkInProgress)] // The actual code has to be implemented
public void GivenDamEngineDataModelWhenSerializingAndDeserializingTheDataModelsAreEqual()
{
// Given DamEngine data (DamProjectData)
DamProjectData expectedDamProjectData = CreateExampleDamProjectData();
Data.Geometry.Waternet expectedWaternet = CreateExampleWaternet();
UpliftVanCalculationGrid expectedUpliftVanCalculationGrid = CreateExampleUpliftVanCalculationGrid();
Location expectedLocation = expectedDamProjectData.Dike.Locations[0];
SoilList expectedSoilList = expectedDamProjectData.Dike.SoilList;
SoilProfile2D expectedSoilProfile2D = expectedLocation.Segment.SoilProfileProbabilities[0].SoilProfile2D;
SurfaceLine2 expectedSurfaceLine2D = expectedLocation.SurfaceLine;
FailureMechanismParametersMStab expectedParametersMStab = expectedDamProjectData.DamProjectCalculationSpecification.CurrentSpecification.FailureMechanismParametersMStab;
TrafficLoad expectedTrafficLoad = new TrafficLoad()
{
Pressure = 6.0,
XStart = expectedSurfaceLine2D.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X,
XEnd = expectedSurfaceLine2D.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X,
};
FillWtiKernelData fillWtiKernelData = new FillWtiKernelData()
{
SoilList = expectedSoilList,
FailureMechanismParametersMStab = expectedParametersMStab,
Location = expectedLocation,
SoilProfile2D = expectedSoilProfile2D,
SurfaceLine2 = expectedSurfaceLine2D,
Waternet = expectedWaternet,
UpliftVanCalculationGrid = expectedUpliftVanCalculationGrid,
TrafficLoad = expectedTrafficLoad
};
KernelModel expectedKernelModel = fillWtiKernelData.CreateKernelModel();
// When Serializing and Deserializing
string xmlWti = WtiSerializer.Serialize(expectedKernelModel);
const string fileName = "TestInput.wti";
string fullFileName = Path.Combine(WtiFilesMap, fileName);
File.WriteAllText(fullFileName, xmlWti);
KernelModel actualKernelModel = WtiDeserializer.Deserialize(xmlWti);
var fillDamEngineFromWti = new FillDamEngineFromWti();
fillDamEngineFromWti.FillDamProjectDataFromKernelModel(actualKernelModel);
// Then the data models are equal
var compare = new CompareLogic { Config = { MaxDifferences = 100 } };
ComparisonResult result;
return;
// TODO fix following comparisons. Can be done if all code is implemented
result = compare.Compare(expectedSurfaceLine2D, fillDamEngineFromWti.SurfaceLine2);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel SurfaceLine2");
result = compare.Compare(expectedSoilProfile2D, fillDamEngineFromWti.SoilProfile2D);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel SoilProfile2D");
result = compare.Compare(expectedSoilList, fillDamEngineFromWti.SoilList);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel SoilList");
result = compare.Compare(expectedLocation, fillDamEngineFromWti.Location);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel Location");
result = compare.Compare(expectedParametersMStab, fillDamEngineFromWti.FailureMechanismParametersMStab);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel FailureMechanismParametersMStab");
}
private UpliftVanCalculationGrid CreateExampleUpliftVanCalculationGrid()
{
var upliftVanCalculationGrid = new UpliftVanCalculationGrid()
{
LeftGridXLeft = 1.1,
LeftGridXRight = 2.1,
LeftGridZTop = 3.1,
LeftGridZBottom = 4.1,
LeftGridXCount = 4,
LeftGridZCount = 6,
RightGridXLeft = 5.1,
RightGridXRight = 6.1,
RightGridZTop = 7.1,
RightGridZBottom = 8.1,
RightGridXCount = 5,
RightGridZCount = 7,
};
return upliftVanCalculationGrid;
}
private Data.Geometry.Waternet CreateExampleWaternet()
{
var waterNet = new Data.Geometry.Waternet()
{
IsGenerated = false,
UnitWeight = 9.81,
Name = "Test Waternet",
};
var phreaticLine = new Data.Geometry.PhreaticLine()
{
Name = "Test Phreatic line"
};
waterNet.PhreaticLine = phreaticLine;
var headLine = new HeadLine()
{
Name = "Test Head line"
};
waterNet.HeadLineList.Add(headLine);
var waternetLine = new Data.Geometry.WaternetLine()
{
Name = "Test waternet line",
HeadLine = headLine
};
waterNet.WaternetLineList.Add(waternetLine);
return waterNet;
}
[TestCase("Benchmark 1-01b.wti")]
[TestCase("bm3-10c.wti")]
public void GivenWtiFileWhenFillingToDamEngineDataAndWritingBackToKernelDataThenTheKernelModelsAreEqual(string fileNameIn)
{
// Given Wti file
string fullFileNameIn = Path.Combine(WtiFilesMap, fileNameIn);
// When filling to DamEngine data
string xmlInput = File.ReadAllText(fullFileNameIn);
KernelModel expectedKernelModel = WtiDeserializer.Deserialize(xmlInput);
FillDamEngineFromWti fillDamEngineFromWti = new FillDamEngineFromWti();
fillDamEngineFromWti.FillDamProjectDataFromKernelModel(expectedKernelModel);
// And writing back to kernel data
FillWtiKernelData fillWtiKernelData = new FillWtiKernelData()
{
SoilList = fillDamEngineFromWti.SoilList,
Waternet = fillDamEngineFromWti.Waternet,
FailureMechanismParametersMStab = fillDamEngineFromWti.FailureMechanismParametersMStab,
Location = fillDamEngineFromWti.Location,
SoilProfile2D = fillDamEngineFromWti.SoilProfile2D,
SurfaceLine2 = fillDamEngineFromWti.SurfaceLine2,
UpliftVanCalculationGrid = fillDamEngineFromWti.UpliftVanCalculationGrid,
TrafficLoad = fillDamEngineFromWti.TrafficLoad
};
KernelModel actualKernelModel = fillWtiKernelData.CreateKernelModel();
string xmlOutput = WtiSerializer.Serialize(actualKernelModel);
string fileNameOut = fileNameIn + ".out";
string fullFileNameOut = Path.Combine(WtiFilesMap, fileNameOut);
File.WriteAllText(fullFileNameOut, xmlOutput);
// Then the kernel models are equal
CompareStabilityModel(expectedKernelModel.StabilityModel, actualKernelModel.StabilityModel);
CompareSoilModel(expectedKernelModel.StabilityModel.SoilModel, actualKernelModel.StabilityModel.SoilModel);
CompareSoilProfile2D(expectedKernelModel.StabilityModel.SoilProfile, actualKernelModel.StabilityModel.SoilProfile);
CompareSoilSurfaceLine(expectedKernelModel.PreprocessingModel.LastStage.SurfaceLine.CharacteristicPoints,
actualKernelModel.PreprocessingModel.LastStage.SurfaceLine.CharacteristicPoints);
CompareWaternet(expectedKernelModel.StabilityModel.LastStage.GeotechnicsData.CurrentWaternet,
actualKernelModel.StabilityModel.LastStage.GeotechnicsData.CurrentWaternet);
CompareUpliftVanCalculationGrid(expectedKernelModel.StabilityModel.SlipPlaneUpliftVan, actualKernelModel.StabilityModel.SlipPlaneUpliftVan);
CompareTrafficLoad(expectedKernelModel.StabilityModel.LastStage.UniformLoads, actualKernelModel.StabilityModel.LastStage.UniformLoads);
}
private void CompareTrafficLoad(List expectedUniformLoads, List actualUniformLoads)
{
var compare = new CompareLogic { Config = { MaxDifferences = 100 } };
compare.Config.MembersToInclude = new List()
{
"XEnd",
"XStart",
"Pressure"
};
ComparisonResult result;
result = compare.Compare(expectedUniformLoads, actualUniformLoads);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel Traffic Load");
}
private void CompareUpliftVanCalculationGrid(SlipPlaneUpliftVan expectedSlipPlaneUpliftVan, SlipPlaneUpliftVan actualSlipPlaneUpliftVan)
{
var compare = new CompareLogic { Config = { MaxDifferences = 100 } };
compare.Config.MembersToIgnore = new List()
{
"TangentLinesBoundaries", // Needed to avoid exception in comparison
"TangentLineXLeft", // not relevant
"TangentLineXRight", // not relevant
"MoveGrid" // not relevant
};
ComparisonResult result;
result = compare.Compare(expectedSlipPlaneUpliftVan.SlipPlaneTangentLine, actualSlipPlaneUpliftVan.SlipPlaneTangentLine);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel UpliftVanCalculationGrid Tangent Lines");
result = compare.Compare(expectedSlipPlaneUpliftVan.SlipPlaneRightGrid, actualSlipPlaneUpliftVan.SlipPlaneRightGrid);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel UpliftVanCalculationGrid Right grid");
result = compare.Compare(expectedSlipPlaneUpliftVan.SlipPlaneLeftGrid, actualSlipPlaneUpliftVan.SlipPlaneLeftGrid);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel UpliftVanCalculationGrid Left grid");
}
private void CompareWaternet(Waternet expectedWaternet, Waternet actualWaternet)
{
var compare = new CompareLogic { Config = { MaxDifferences = 100 } };
compare.Config.MembersToIgnore = new List()
{
"Waternet",
"Owner"
};
ComparisonResult result;
Assert.AreEqual(expectedWaternet.IsGenerated, actualWaternet.IsGenerated);
Assert.AreEqual(expectedWaternet.UnitWeight, actualWaternet.UnitWeight);
result = compare.Compare(expectedWaternet.PhreaticLine, actualWaternet.PhreaticLine);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel Waternet.PhreaticLine");
result = compare.Compare(expectedWaternet.WaternetLineList, actualWaternet.WaternetLineList);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel Waternet.WaternetLineList");
result = compare.Compare(expectedWaternet.HeadLineList, actualWaternet.HeadLineList);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel Waternet.HeadLineList");
Assert.AreEqual(expectedWaternet.ExternalWaterLevel, actualWaternet.ExternalWaterLevel);
}
private void CompareSoilSurfaceLine(CharacteristicPointSet expectedCharacteristicPoints, CharacteristicPointSet actualCharacteristicPoints)
{
var compare = new CompareLogic { Config = { MaxDifferences = 100 } };
compare.Config.MembersToIgnore = new List()
{
"Owner"
};
var result = compare.Compare(expectedCharacteristicPoints, actualCharacteristicPoints);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel SurfaceLine");
}
private void CompareSoilProfile2D(MacroStability.Geometry.SoilProfile2D expectedSoilProfile, MacroStability.Geometry.SoilProfile2D actualSoilProfile)
{
var compare = new CompareLogic { Config = { MaxDifferences = 100 } };
compare.Config.MembersToIgnore = SoilParametersToIgnore;
var result = compare.Compare(expectedSoilProfile, actualSoilProfile);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel SoilProfile2D");
}
private void CompareSoilModel(SoilModel expectedSoilModel, SoilModel actualSoilModel)
{
Assert.AreEqual(expectedSoilModel.Soils.Count, actualSoilModel.Soils.Count, "Soil Count does not match");
foreach (Soil expectedSoil in expectedSoilModel.Soils)
{
var actualSoil = actualSoilModel.Soils.First(soil => soil.Name.Equals(expectedSoil.Name));
Assert.IsNotNull(actualSoil, string.Format("Soil {0} not found", expectedSoil.Name));
var compare = new CompareLogic { Config = { MaxDifferences = 100 } };
compare.Config.MembersToIgnore = SoilParametersToIgnore;
var result = compare.Compare(expectedSoil, actualSoil);
Assert.AreEqual(0, result.Differences.Count, "Differences found read/write kernel SoilModel");
}
}
private void CompareStabilityModel(StabilityModel expectedStabilityModel, StabilityModel actualStabilityModel)
{
Assert.AreEqual(expectedStabilityModel.SearchAlgorithm, actualStabilityModel.SearchAlgorithm);
Assert.AreEqual(expectedStabilityModel.ModelOption, actualStabilityModel.ModelOption);
Assert.AreEqual(expectedStabilityModel.GridOrientation, actualStabilityModel.GridOrientation);
}
[TestCase("ValidateOk.xml")]
[TestCase("ValidateError.xml")]
public void GivenValidationResultFileWhenDeserializingAndSerializingThenTheStringsAreEqual(string fileNameIn)
{
// Given validation result file from kernel
string fullFileNameIn = Path.Combine(WtiFilesMap, fileNameIn);
// When Deserializing and Serializing
string xmlInput = File.ReadAllText(fullFileNameIn);
string fileNameOut = fileNameIn + ".out";
string fullFileNameOut = Path.Combine(WtiFilesMap, fileNameOut);
IValidationResult[] validationResults = WtiDeserializer.DeserializeValidation(xmlInput);
string xmlOutput = WtiSerializer.SerializeValidation(validationResults);
File.WriteAllText(fullFileNameOut, xmlOutput);
// Then the strings are equal
Assert.AreEqual(xmlInput, xmlOutput);
}
[TestCase("Result1.xml")]
public void GivenCalculationResultFileWhenDeserializingAndSerializingThenTheStringsAreEqual(string fileNameIn)
{
// Given calculation result file from kernel
string fullFileNameIn = Path.Combine(WtiFilesMap, fileNameIn);
// When Deserializing and Serializing
string xmlInput = File.ReadAllText(fullFileNameIn);
string fileNameOut = fileNameIn + ".out";
string fullFileNameOut = Path.Combine(WtiFilesMap, fileNameOut);
var calculationResults = WtiDeserializer.DeserializeResult(xmlInput);
string xmlOutput = WtiSerializer.SerializeResult(calculationResults);
File.WriteAllText(fullFileNameOut, xmlOutput);
// Then the strings are equal
Assert.AreEqual(xmlInput, xmlOutput);
}
private DamProjectData CreateExampleDamProjectData()
{
return FactoryForDamProjectData.CreateExampleDamProjectData();
}
}
}