Index: DamClients/DamLive/trunk/src/Deltares.DamLive.Tests/DamLiveHHNKTests.cs =================================================================== diff -u --- DamClients/DamLive/trunk/src/Deltares.DamLive.Tests/DamLiveHHNKTests.cs (revision 0) +++ DamClients/DamLive/trunk/src/Deltares.DamLive.Tests/DamLiveHHNKTests.cs (revision 5591) @@ -0,0 +1,205 @@ +// Copyright (C) Stichting Deltares 2023. All rights reserved. +// +// This file is part of the application DAM - Live. +// +// DAM - Live 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 Deltares.Dam.Application.Live; +using Deltares.Dam.Data; +using Deltares.DamLive.TestHelper; +using Deltares.Standard.IO; +using NUnit.Framework; + +namespace Deltares.DamLive.Tests; + +[TestFixture] +[Category("Integration")] +public class DamLiveHHNKTests +{ + [Test] + [Category("Integration")] + [Category("Work_In_Progress")] + public void CalculateStabilityUsingTestFilesHasExpectedResultsInOutputFile() + { + const double cTolerance = 0.0005; + SetupStabilityProject(); + runner.Initialize(); + runner.DamProjectData.MaxCalculationCores = 1; + Assert.That(runner, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(runner.DamProjectData, Is.Not.Null); + Assert.That(runner.CalculationParameters, Is.Not.Null); + }); + Assert.Multiple(() => + { + Assert.That(runner.CalculationParameters.CalculationModules, Is.Not.Null); + Assert.That(runner.CalculationParameters.MStabParameters, Is.Not.Null); + }); + + runner.Run(); + //runner.WriteResultsToFile(outputFile); + + AssertNoErrors(); + + // Assertions + List series = runner.OutputTimeSeriesCollection.Series; + var seriesCount = 0; + string[] validParameterIDs = Enum.GetNames(typeof(TimeSerieParameters)); + foreach (TimeSerie timeSeries in series) + { + Assert.Multiple(() => + { + Assert.That(validParameterIDs.Any(n => n == timeSeries.ParameterId), Is.True); + Assert.That(locations.Any(l => l.Name == timeSeries.LocationId), Is.True); + }); + // StabilityInside check + if (timeSeries.ParameterId == TimeSerieParameters.StabilityInsideFactor.ToString()) + { + if (timeSeries.LocationId == "Purmer_PU0110+20_R_V") + { + TimeSerieEntry firstEntry = timeSeries.Entries.First(); + Assert.That(firstEntry.Value, Is.EqualTo(0.742).Within(cTolerance), "The computed safety factory is not correct"); + } + + if (timeSeries.LocationId == "Purmer_PU0042+00_K") + { + TimeSerieEntry firstEntry = timeSeries.Entries.First(); + Assert.That(firstEntry.Value, Is.EqualTo(0.8555).Within(cTolerance), "The computed safety factory is not correct"); + } + } + seriesCount++; + } + Assert.That(seriesCount, Is.GreaterThan(0), "No output time series"); + } + + #region Helper methods + + /// + /// Asserts that there are no errors in the runner + /// + private void AssertNoErrors() + { + if (runner.HasErrors) + { + Assert.Fail("The test failed. See the error log in the test output console for more info"); + } + } + + #endregion + + #region Test Setup + + private const string projectStabilityFilename = @"DAMLive.damx"; + private const string input1aFilename = @"live.InputTimeSeries.xml"; + private const string output1aFilename = @"live.OutputTimeSeries.xml"; + private const string calculationParametersStabilityFilename = @"live.ParametersFile.xml"; + + private const string testWorkingFolder = @".\damLiveHHNKWork"; + private const string testStablityDataFolder = @"..\..\..\..\data\HHNK Purmer"; + private List locations; + + private string inputFile; + private string outputFile; + private string projectFile; + private string parameterFile; + + private DamEngineRunner runner; + + [SetUp] + public void SetupFixture() + { + IoHelper.RemoveTestWorkingDirectory(testWorkingFolder); // to be sure no test directory exist from previous tests + Directory.CreateDirectory(testWorkingFolder); + } + + [TearDown] + public void TearDownFixture() + { + IoHelper.RemoveTestWorkingDirectory(testWorkingFolder); + } + + [TearDown] + public void TearDownTest() + { + AssertNoErrors(); + } + + [SetUp] + public void SetupTest() {} + + /// + /// Sets up the stability project. + /// + private void SetupStabilityProject() + { + string actualTestPath = Path.GetFullPath(testWorkingFolder); + + Directory.CreateDirectory(actualTestPath); + + DirectoryHelper.CopyRecursive(actualTestPath, testStablityDataFolder); + + inputFile = Path.Combine(actualTestPath, input1aFilename); + outputFile = Path.Combine(actualTestPath, output1aFilename); + parameterFile = Path.Combine(actualTestPath, calculationParametersStabilityFilename); + projectFile = Path.Combine(actualTestPath, projectStabilityFilename); + DamProject.SetTestProgramVersion("24.1"); + DamProjectData damData = DamProject.LoadData(projectFile); + locations = damData.Locations; + + // Load the sensor time serie data (see input file for details) + TimeSerieCollection inputTimeSeries = TimeSerieCollection.LoadFromFile(inputFile); + ShortenTimeSeries(inputTimeSeries); + inputTimeSeries.Save(Path.ChangeExtension(inputFile, "short.xml")); + + runner = new DamEngineRunner + { + DamXFile = new FileInfo(projectFile), + ParametersFile = new FileInfo(parameterFile), + FewsInputFile = new FileInfo(inputFile), + FewsOutputFile = new FileInfo(outputFile), + Filter = "", + InputTimeSeriesCollection = inputTimeSeries + }; + } + + /// + /// Make timeserie shorter for testing: the first, the last and the middle entry are only used + /// + /// + private static void ShortenTimeSeries(TimeSerieCollection inputTimeSeries) + { + foreach (TimeSerie serie in inputTimeSeries.Series) + { + for (int i = serie.Entries.Count - 2; i > 0; i--) + { + if (i != 120) // keep the time entry in the middle of the serie + { + serie.Entries.RemoveAt(i); + } + } + } + } + + #endregion + +} \ No newline at end of file