Index: DamClients/DamLive/trunk/src/Deltares.DamLive.Tests/Deltares.DamLive.Tests.csproj =================================================================== diff -u -r1551 -r1807 --- DamClients/DamLive/trunk/src/Deltares.DamLive.Tests/Deltares.DamLive.Tests.csproj (.../Deltares.DamLive.Tests.csproj) (revision 1551) +++ DamClients/DamLive/trunk/src/Deltares.DamLive.Tests/Deltares.DamLive.Tests.csproj (.../Deltares.DamLive.Tests.csproj) (revision 1807) @@ -55,6 +55,7 @@ + Index: DamClients/DamLive/trunk/src/Deltares.DamLive.Tests/DamLivePulauTekong.cs =================================================================== diff -u --- DamClients/DamLive/trunk/src/Deltares.DamLive.Tests/DamLivePulauTekong.cs (revision 0) +++ DamClients/DamLive/trunk/src/Deltares.DamLive.Tests/DamLivePulauTekong.cs (revision 1807) @@ -0,0 +1,215 @@ +// Copyright (C) Stichting Deltares 2018. 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 +{ + [TestFixture] + [Category("Integration")] + public class PulauTekongTest + { + #region Test Setup + + const string projectStabilityFilename = @"PulauTekong.damx"; + const string input1aFilename = @"live.InputTimeSeries.xml"; + const string output1aFilename = @"live.OutputTimeSeries.xml"; + const string calculationParametersStabilityFilename = @"live.ParametersFile.xml"; + + const string testWorkingFolder = @".\damLiveWork"; + private const string testStablityDataFolder = @"..\..\..\data\Projects\Pulau Tekong"; + private List locations; + + private string inputFile; + private string outputFile; + 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() + { + var actualTestPath = Path.GetFullPath(testWorkingFolder); + + Directory.CreateDirectory(actualTestPath); + + DirectoryHelper.CopyRecursive(actualTestPath, testStablityDataFolder); + + //inputFile = Path.Combine(actualTestPath, "live.FEWS.InputFile.1Step.xml"); + inputFile = Path.Combine(actualTestPath, input1aFilename); + outputFile = Path.Combine(actualTestPath, output1aFilename); + parameterFile = Path.Combine(actualTestPath, calculationParametersStabilityFilename); + projectFile = Path.Combine(actualTestPath, projectStabilityFilename); + + var damData = DamProject.LoadData(projectFile); + locations = damData.Locations; + + // Load the sensor time serie data (see input file for details) + var 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 (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")] + public void CalculateStabilityUsingTestFilesHasExpectedResultsInOutputFile() + { + const double cTolerance = 0.0005; + SetupStabilityProject(); + 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(); + //runner.WriteResultsToFile(outputFile); + + AssertNoErrors(); + + // Assertions + + var series = runner.OutputTimeSeriesCollection.Series; + + int seriesCount = 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)); + // Stability inside check + if (timeSeries.ParameterId == TimeSerieParameters.StabilityInsideFactor.ToString()) + { + if (timeSeries.LocationId == "CD CS1 X1") + { + var firstEntry = timeSeries.Entries.First(); + Assert.AreEqual(1.513023, firstEntry.Value, cTolerance, "The computed safety factory is not correct"); + } + if (timeSeries.LocationId == "CD CS2 X3") + { + var firstEntry = timeSeries.Entries.First(); + Assert.AreEqual(0.88223, firstEntry.Value, cTolerance, "The computed safety factory is not correct"); + } + } + + seriesCount++; + } + + Assert.IsTrue(seriesCount > 0, "No output time series"); + } + + } +}