// Copyright (C) Stichting Deltares 2019. All rights reserved. // // This file is part of the application DAM - Live. // // DAM - UI is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. // // You should have received a copy of the GNU 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 { // This test is based on a early configuration of the project Pulau Tekong for stability outward // It tests if having missing values in the time serie is handled correctly [TestFixture] [Category("Integration")] public class PulauTekongMissingValuesTest { #region Test Setup private const double missingValue = -999.0; const string projectStabilityFilename = @"PulauTekong.damx"; const string inputFilenameWithValues = @"live.InputTimeSeries.xml"; const string inputFilenameWithMissingValues = @"live.InputTimeSeries - novalues.xml"; const string outputFilename = @"live.OutputTimeSeries.xml"; const string calculationParametersStabilityFilename = @"live.ParametersFile.xml"; const string testWorkingFolder = @".\damLivePulauTekongWork"; private const string testStablityDataFolder = @"..\..\..\data\Projects\Pulau Tekong"; private List locations; private string inputFileFullname; private string outputFileFullname; private string projectFile; private string parameterFile; private DamEngineRunner runner; [TestFixtureSetUp] public void SetupFixture() { IoHelper.RemoveTestWorkingDirectory(testWorkingFolder); // to be sure no test directory exist from previous tests Directory.CreateDirectory(testWorkingFolder); } [TestFixtureTearDown] public void TearDownFixture() { IoHelper.RemoveTestWorkingDirectory(testWorkingFolder); } [TearDown] public void TearDownTest() { AssertNoErrors(); } [SetUp] public void SetupTest() { } /// /// Sets up the stability project. /// private void SetupStabilityProject(string inputFilename) { var actualTestPath = Path.GetFullPath(testWorkingFolder); Directory.CreateDirectory(actualTestPath); DirectoryHelper.CopyRecursive(actualTestPath, testStablityDataFolder); inputFileFullname = Path.Combine(actualTestPath, inputFilename); outputFileFullname = Path.Combine(actualTestPath, outputFilename); parameterFile = Path.Combine(actualTestPath, calculationParametersStabilityFilename); projectFile = Path.Combine(actualTestPath, projectStabilityFilename); DamProject.SetTestProgramVersion("19.1"); var damData = DamProject.LoadData(projectFile); locations = damData.Locations; // Load the sensor time serie data (see input file for details) var inputTimeSeries = TimeSerieCollection.LoadFromFile(inputFileFullname); ShortenTimeSeries(inputTimeSeries); inputTimeSeries.Save(Path.ChangeExtension(inputFileFullname, "short.xml")); if (String.IsNullOrEmpty(inputFileFullname)) { throw new Exception("Inputfilename not specified"); } runner = new DamEngineRunner { DamXFile = new FileInfo(projectFile), ParametersFile = new FileInfo(parameterFile), FewsInputFile = new FileInfo(inputFileFullname), FewsOutputFile = new FileInfo(outputFileFullname), 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 (var 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 #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 /// /// This test calls the runner's Run method. /// This test is an integration test. /// /// Required files are: /// - the DAMX file which contains the dike models /// - FEWS input file containing the water level time series for the locations /// or monitoring points /// - FEWS output file containing the time series results for each node /// (location/monitoring point) /// /// See setup method /// [Test] [Category("Integration")] [Category("Work_In_Progress")] [TestCase(inputFilenameWithValues, 2.486106, 2.114159)] [TestCase(inputFilenameWithMissingValues, missingValue, missingValue)] public void CalculateStabilityOutsideUsingTestFilesHasExpectedResultsInOutputFile(string inputTestcaseFilename, double valueEntry1, double valueEntry2) { const double cTolerance = 0.0005; SetupStabilityProject(inputTestcaseFilename); runner.Initialize(); Assert.IsNotNull(runner); Assert.IsNotNull(runner.DamProjectData); Assert.IsNotNull(runner.CalculationParameters); Assert.IsNotNull(runner.CalculationParameters.CalculationModules); Assert.IsNotNull(runner.CalculationParameters.MStabParameters); runner.Run(); AssertNoErrors(); // Assertions var series = runner.OutputTimeSeriesCollection.Series; int seriesCount = 0; int calculatedLocationCount = 0; var validParameterIDs = Enum.GetNames(typeof(TimeSerieParameters)); foreach (var timeSeries in series) { Assert.IsTrue(validParameterIDs.Any(n => n == timeSeries.ParameterId)); Assert.IsTrue(locations.Any(l => l.Name == timeSeries.LocationId)); // StabilityOutside check if (timeSeries.ParameterId == TimeSerieParameters.StabilityOutsideFactor.ToString()) { if (timeSeries.LocationId == "CD CS1 X1") { calculatedLocationCount++; var firstEntry = timeSeries.Entries.First(); Assert.AreEqual(valueEntry1, firstEntry.Value, cTolerance, "The computed safety factory is not correct"); } if (timeSeries.LocationId == "CD CS2 X3") { calculatedLocationCount++; var firstEntry = timeSeries.Entries.First(); Assert.AreEqual(valueEntry2, firstEntry.Value, cTolerance, "The computed safety factory is not correct"); } } seriesCount++; } Assert.IsTrue(seriesCount == 0, "No output time series expected"); Assert.IsTrue(calculatedLocationCount == 0, "No locations should have output for stability outside"); } } }