// Copyright (C) Stichting Deltares 2023. 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.IO;
using System.Text;
using Deltares.DamEngine.Interface;
using Deltares.DamEngine.Io;
using Deltares.DamEngine.Io.XmlOutput;
using Deltares.DamEngine.TestHelpers;
using NUnit.Framework;
namespace Deltares.DamEngine.IntegrationTests.IntegrationTests;
///
/// These tests were based on DamLiveIntegrationTest.Run_UsingTestFiles_HasExpectedResultsInOutputFile()
///
[TestFixture]
class OperationalPulauTekongTests
{
private const double tolerance = 0.0005;
private const double novalue = -999.0;
private const string stabilityOutsideFactor = "StabilityOutsideFactor";
private const string workingDir = @"TestFiles\";
private string oldWorkingDir;
[SetUp]
public void TestFixtureSetup()
{
oldWorkingDir = Directory.GetCurrentDirectory();
Directory.SetCurrentDirectory(workingDir);
}
[TearDown]
public void TestFixtureTearDown()
{
Directory.SetCurrentDirectory(oldWorkingDir);
}
[Test, Ignore("This test is not yet implemented, waits on stix implementation.")]
[Category(Categories.WorkInProgress)]
[TestCase(@"PulauTekong.InputFile.xml", 2.486106, 2.114159, true)]
[TestCase(@"PulauTekong.InputFile-NoValues.xml", novalue, novalue, false)]
public void Run_UsingTestFiles_HasExpectedResultsInOutputFile(string inputTestcaseFilename, double valueEntry1, double valueEntry2, bool areResultsExpected)
{
const string calcDir = "TestOperationalPulauTekong";
const string baseTestDirectory = @".\Operational\PulauTekong\";
if (Directory.Exists(calcDir))
{
Directory.Delete(calcDir, true); // delete previous results
}
Directory.CreateDirectory(calcDir);
// Based on "Deltares.DamLive.Tests.PulauTekongTest"
string inputFileName = baseTestDirectory + inputTestcaseFilename;
const string outputFileName = baseTestDirectory + @"PulauTekong.OutputFile.xml";
string inputString = File.ReadAllText(inputFileName);
inputString = XmlAdapter.ChangeValueInXml(inputString, "ProjectPath", ""); // Current directory will be used
inputString = XmlAdapter.ChangeValueInXml(inputString, "CalculationMap", calcDir); // Current directory will be used
inputString = XmlAdapter.ChangeValueInXml(inputString, "MapForSoilgeometries2D", baseTestDirectory + @"PulauTekong.geometries2D.0\");
inputString = XmlAdapter.ChangeValueInXml(inputString, "SoilDatabaseName", baseTestDirectory + @"PulauTekong0.soilmaterials.mdb");
Output output = GeneralHelper.RunAfterInputValidation(inputString, areResultsExpected, outputFileName);
Assert.AreEqual(stabilityOutsideFactor, output.Results.OperationalOutputTimeSeries[0].ParameterId);
Assert.AreEqual(valueEntry1, output.Results.OperationalOutputTimeSeries[0].Entries.TimeSerieEntry[0].Value, tolerance);
Assert.AreEqual(stabilityOutsideFactor, output.Results.OperationalOutputTimeSeries[1].ParameterId);
Assert.AreEqual(valueEntry2, output.Results.OperationalOutputTimeSeries[1].Entries.TimeSerieEntry[0].Value, tolerance);
}
[Test, Category(Categories.MultiCore), Ignore("This test is not yet implemented, waits on stix implementation.")]
[Category(Categories.WorkInProgress)]
// This test runs the same project as Run_UsingTestFiles_HasExpectedResultsInOutputFile
// except that it runs it with both single core and multi core.
// The output of both runs must be the same
public void CompareResultFromMultiCoreRunWithSingleCoreRun()
{
var calcDir = "TestOperationalPulauTekongSingleCore";
var outputFileName = @"PulauTekongSingleCore.OutputFile.xml";
Output output = RunTestProjectCores(calcDir, outputFileName, 1);
string outputSingleCore = DamXmlSerialization.SaveOutputAsXmlString(output);
calcDir = "TestOperationalPulauTekongMultiCore";
outputFileName = @"PulauTekongMultiCore.OutputFile.xml";
output = RunTestProjectCores(calcDir, outputFileName, 4);
string outputMultiCore = DamXmlSerialization.SaveOutputAsXmlString(output);
Assert.AreEqual(outputSingleCore, outputMultiCore);
}
private Output RunTestProjectCores(string calcDir, string outputFileName, int coreCount)
{
if (Directory.Exists(calcDir))
{
Directory.Delete(calcDir, true); // delete previous results
}
Directory.CreateDirectory(calcDir);
const string baseTestDirectory = @".\Operational\PulauTekong\";
string inputFileName = baseTestDirectory + @"PulauTekong.InputFile.xml";
string inputString = File.ReadAllText(inputFileName);
inputString = XmlAdapter.ChangeValueInXml(inputString, "ProjectPath", ""); // Current directory will be used
inputString = XmlAdapter.ChangeValueInXml(inputString, "CalculationMap", calcDir); // Current directory will be used
inputString = XmlAdapter.ChangeValueInXml(inputString, "MapForSoilgeometries2D", baseTestDirectory + @"PulauTekong.geometries2D.0\");
inputString = XmlAdapter.ChangeValueInXml(inputString, "SoilDatabaseName", baseTestDirectory + @"PulauTekong0.soilmaterials.mdb");
inputString = XmlAdapter.ChangeValueInXml(inputString, "MaxCalculationCores", coreCount.ToString());
return GeneralHelper.RunAfterInputValidation(inputString);
}
}