Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Calculator/WaveConditionsCosineCalculator.cs =================================================================== diff -u -rae74507edbfc4fe632ba5f964a147aff630dfe6e -rb22ebfa1f38daadd1bd4f79ac846057e7ee27976 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Calculator/WaveConditionsCosineCalculator.cs (.../WaveConditionsCosineCalculator.cs) (revision ae74507edbfc4fe632ba5f964a147aff630dfe6e) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Calculator/WaveConditionsCosineCalculator.cs (.../WaveConditionsCosineCalculator.cs) (revision b22ebfa1f38daadd1bd4f79ac846057e7ee27976) @@ -65,6 +65,7 @@ public double WaveDirection { get; private set; } public double ReliabilityIndex { get; private set; } + public bool? Converged { get; private set; } public void Calculate(WaveConditionsCosineCalculationInput input) Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/WaveConditionsCalculationParser.cs =================================================================== diff -u -r9b0f9d3bc29ce2e4ad51ed5de1e7cf320cd7b16c -rb22ebfa1f38daadd1bd4f79ac846057e7ee27976 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/WaveConditionsCalculationParser.cs (.../WaveConditionsCalculationParser.cs) (revision 9b0f9d3bc29ce2e4ad51ed5de1e7cf320cd7b16c) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/WaveConditionsCalculationParser.cs (.../WaveConditionsCalculationParser.cs) (revision b22ebfa1f38daadd1bd4f79ac846057e7ee27976) @@ -19,11 +19,11 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. -using System.Globalization; -using System.IO; +using System; +using System.Collections.Generic; using Ringtoets.HydraRing.Calculation.Data.Output; using Ringtoets.HydraRing.Calculation.Exceptions; -using Ringtoets.HydraRing.IO; +using Ringtoets.HydraRing.Calculation.Properties; namespace Ringtoets.HydraRing.Calculation.Parsers { @@ -32,111 +32,51 @@ /// public class WaveConditionsCalculationParser : IHydraRingFileParser { - private const string waveAngleText = "Wave angle"; - private const string waveDirectionText = "Wave direction"; - private const string waveHeightText = "Wave height"; - private const string wavePeakPeriodText = "Wave period"; - private const string reductionFactorText = "reduction factor"; + private const string waveHeightColumnName = "WaveHeight"; + private const string wavePeriodColumnName = "WavePeriod"; + private const string waveDirectionColumnName = "waveDirection"; + private const string waveAngleColumnName = "WaveAngle"; - private const char equalsCharacter = '='; + private readonly string query = $"SELECT {waveHeightColumnName}, {wavePeriodColumnName}, {waveAngleColumnName}, {waveDirectionColumnName} " + + "FROM QVariantResults"; - private double? waveAngle; - private double? waveDirection; - private double? waveHeight; - private double? wavePeakPeriod; - /// /// Gets the output that was parsed from the output file. /// public WaveConditionsCalculationOutput Output { get; private set; } public void Parse(string workingDirectory, int sectionId) { - string fileName = string.Format("{0}{1}", sectionId, HydraRingFileConstants.OutputFileSuffix); + Dictionary result = HydraRingDatabaseParseHelper.ReadSingleLine( + workingDirectory, + query, + sectionId, + Resources.WaveConditionsCalculationParser_Parse_No_calculated_wave_conditions_found_in_output_file); - try - { - ReadFile(Path.Combine(workingDirectory, fileName)); - SetOutput(); - } - catch - { - throw new HydraRingFileParserException(); - } + ReadResult(result); } - private void SetOutput() + /// + /// Reads the . + /// + /// The result from the database read. + /// Thrown when the result + /// cannot be converted to the output format. + private void ReadResult(IDictionary result) { - if (waveAngle != null && waveHeight != null && wavePeakPeriod != null && waveDirection != null) + try { - Output = new WaveConditionsCalculationOutput(waveHeight.Value, wavePeakPeriod.Value, waveAngle.Value, - waveDirection.Value); - } - } + double waveHeight = Convert.ToDouble(result[waveHeightColumnName]); + double wavePeriod = Convert.ToDouble(result[wavePeriodColumnName]); + double waveAngle = Convert.ToDouble(result[waveAngleColumnName]); + double waveDirection = Convert.ToDouble(result[waveDirectionColumnName]); - private void ReadFile(string filePath) - { - if (File.Exists(filePath)) - { - using (var file = new StreamReader(File.OpenRead(filePath))) - { - while (!file.EndOfStream) - { - string currentLine = file.ReadLine(); - - waveAngle = TryParseWaveAngle(currentLine) ?? waveAngle; - waveDirection = TryParseWaveDirection(currentLine) ?? waveDirection; - waveHeight = TryParseWaveHeight(currentLine) ?? waveHeight; - wavePeakPeriod = TryParseWavePeakPeriod(currentLine) ?? wavePeakPeriod; - } - } + Output = new WaveConditionsCalculationOutput(waveHeight, wavePeriod, waveAngle, waveDirection); } - } - - private static double? TryParseWaveAngle(string line) - { - if (line.Contains(waveAngleText) && !line.Contains(reductionFactorText)) + catch (InvalidCastException e) { - string resultAsString = line.Split(equalsCharacter)[1].Trim(); - return ParseStringResult(resultAsString); + throw new HydraRingFileParserException(Resources.WaveConditionsCalculationParser_Parse_No_calculated_wave_conditions_found_in_output_file, e); } - return null; } - - private static double? TryParseWaveDirection(string line) - { - if (line.Contains(waveDirectionText)) - { - string resultAsString = line.Split(equalsCharacter)[1].Trim(); - return ParseStringResult(resultAsString); - } - - return null; - } - - private static double? TryParseWaveHeight(string line) - { - if (line.Contains(waveHeightText)) - { - string resultAsString = line.Split(equalsCharacter)[1].Trim(); - return ParseStringResult(resultAsString); - } - return null; - } - - private static double? TryParseWavePeakPeriod(string line) - { - if (line.Contains(wavePeakPeriodText)) - { - string resultAsString = line.Split(equalsCharacter)[1].Trim(); - return ParseStringResult(resultAsString); - } - return null; - } - - private static double ParseStringResult(string resultAsString) - { - return double.Parse(resultAsString, CultureInfo.InvariantCulture); - } } } \ No newline at end of file Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.Designer.cs =================================================================== diff -u -r9bc5d8bc179ba0be25c9746859da3726b8b6a33e -rb22ebfa1f38daadd1bd4f79ac846057e7ee27976 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 9bc5d8bc179ba0be25c9746859da3726b8b6a33e) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision b22ebfa1f38daadd1bd4f79ac846057e7ee27976) @@ -163,5 +163,15 @@ return ResourceManager.GetString("ReliabilityIndexCalculationParser_Parse_No_reliability_found_in_output_file", resourceCulture); } } + + /// + /// Looks up a localized string similar to Er zijn geen berekende golfcondities gevonden in de Hydra-Ring uitvoerdatabase.. + /// + internal static string WaveConditionsCalculationParser_Parse_No_calculated_wave_conditions_found_in_output_file { + get { + return ResourceManager.GetString("WaveConditionsCalculationParser_Parse_No_calculated_wave_conditions_found_in_outp" + + "ut_file", resourceCulture); + } + } } } Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.resx =================================================================== diff -u -r9bc5d8bc179ba0be25c9746859da3726b8b6a33e -rb22ebfa1f38daadd1bd4f79ac846057e7ee27976 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.resx (.../Resources.resx) (revision 9bc5d8bc179ba0be25c9746859da3726b8b6a33e) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.resx (.../Resources.resx) (revision b22ebfa1f38daadd1bd4f79ac846057e7ee27976) @@ -144,4 +144,7 @@ Er is geen resultaat voor de betrouwbaarheidsindex van de berekende kans van voorkomen gevonden in de Hydra-Ring uitvoerdatabase. + + Er zijn geen berekende golfcondities gevonden in de Hydra-Ring uitvoerdatabase. + \ No newline at end of file Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/WaveConditionsCalculationParserTest.cs =================================================================== diff -u -r0e9042f3bb1c6b0615400c2dbf45a2a06cc024e1 -rb22ebfa1f38daadd1bd4f79ac846057e7ee27976 --- Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/WaveConditionsCalculationParserTest.cs (.../WaveConditionsCalculationParserTest.cs) (revision 0e9042f3bb1c6b0615400c2dbf45a2a06cc024e1) +++ Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/WaveConditionsCalculationParserTest.cs (.../WaveConditionsCalculationParserTest.cs) (revision b22ebfa1f38daadd1bd4f79ac846057e7ee27976) @@ -19,20 +19,25 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; +using System.Data.SQLite; using System.IO; +using System.Security.AccessControl; using Core.Common.TestUtil; using NUnit.Framework; +using Ringtoets.HydraRing.Calculation.Exceptions; using Ringtoets.HydraRing.Calculation.Parsers; namespace Ringtoets.HydraRing.Calculation.Test.Parsers { [TestFixture] public class WaveConditionsCalculationParserTest { - private const int sectionId = 1; - private readonly string testDataPath = Path.Combine(TestHelper.GetTestDataPath(TestDataPath.Ringtoets.HydraRing.Calculation, "Parsers"), "WaveConditionsCalculationParser"); - private readonly string outputFileName = sectionId + "-output.txt"; + private const string validFile = "ValidFile"; + private readonly string testDirectory = Path.Combine(TestHelper.GetTestDataPath(TestDataPath.Ringtoets.HydraRing.Calculation, "Parsers"), + nameof(WaveConditionsCalculationParser)); + [Test] public void Constructor_ExpectedValues() { @@ -45,109 +50,121 @@ } [Test] - public void Parse_NotExistingOutputFile_OutputNull() + public void Parse_WorkingDirectoryNull_ThrowsArgumentNullException() { // Setup var parser = new WaveConditionsCalculationParser(); // Call - parser.Parse(testDataPath, sectionId); + TestDelegate test = () => parser.Parse(null, 1); // Assert - Assert.IsNull(parser.Output); + var exception = Assert.Throws(test); + Assert.AreEqual("workingDirectory", exception.ParamName); } [Test] - public void Parse_EmptyOutputFile_OutputNull() + public void Parse_WithWorkingDirectoryWithoutExpectedFile_ThrowsHydraRingFileParserException() { // Setup + string path = Path.Combine(testDirectory, "EmptyWorkingDirectory"); var parser = new WaveConditionsCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "empty"); // Call - parser.Parse(workingDirectory, sectionId); + TestDelegate test = () => parser.Parse(path, 1); // Assert - Assert.IsNull(parser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, outputFileName))); + var exception = Assert.Throws(test); + Assert.IsInstanceOf(exception.InnerException); } [Test] - public void Parse_ValidHydraRingOutputFile_OutputSetWithExpectedCalculationResult() + public void Parse_WithWorkingDirectoryWithInvalidOutputFile_ThrowsHydraRingFileParserException() { // Setup + string path = Path.Combine(testDirectory, "InvalidFile"); var parser = new WaveConditionsCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "valid"); // Call - parser.Parse(workingDirectory, sectionId); + TestDelegate test = () => parser.Parse(path, 1); // Assert - Assert.AreEqual(22.01300, parser.Output.WaveAngle); - Assert.AreEqual(1.87957, parser.Output.WaveHeight); - Assert.AreEqual(11.15140, parser.Output.WavePeakPeriod); - Assert.AreEqual(337.98700, parser.Output.WaveDirection); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, outputFileName))); + var exception = Assert.Throws(test); + Assert.IsInstanceOf(exception.InnerException); + Assert.AreEqual("Er kon geen resultaat gelezen worden uit de Hydra-Ring uitvoerdatabase.", exception.Message); } [Test] - public void Parse_InvalidHydraRingOutputFileWaveAngleMissing_OutputNull() + public void Parse_WithWorkingDirectoryWithEmptyFile_ThrowsHydraRingFileParserException() { // Setup + string path = Path.Combine(testDirectory, "EmptyDatabase"); var parser = new WaveConditionsCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "output-no-waveAngle"); // Call - parser.Parse(workingDirectory, sectionId); + TestDelegate test = () => parser.Parse(path, 1); // Assert - Assert.IsNull(parser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, outputFileName))); + var exception = Assert.Throws(test); + Assert.AreEqual("Er zijn geen berekende golfcondities gevonden in de Hydra-Ring uitvoerdatabase.", exception.Message); + Assert.IsInstanceOf(exception.InnerException); } [Test] - public void Parse_InvalidHydraRingOutputFileWaveDirectionMissing_OutputNull() + public void Parse_ErrorWhileReadingFile_ThrowsHydraRingFileParserException() { // Setup var parser = new WaveConditionsCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "output-no-waveDirection"); + string workingDirectory = Path.Combine(testDirectory, validFile); - // Call - parser.Parse(workingDirectory, sectionId); + using (new DirectoryPermissionsRevoker(testDirectory, FileSystemRights.ReadData)) + { + // Call + TestDelegate call = () => parser.Parse(workingDirectory, 1); - // Assert - Assert.IsNull(parser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, outputFileName))); + // Assert + var exception = Assert.Throws(call); + var expectedMessage = "Er kon geen resultaat gelezen worden uit de Hydra-Ring uitvoerdatabase."; + Assert.AreEqual(expectedMessage, exception.Message); + Assert.IsInstanceOf(exception.InnerException); + } } [Test] - public void Parse_InvalidHydraRingOutputFileWaveHeightMissing_OutputNull() + [TestCase("ValidFileNoWaveHeight")] + [TestCase("ValidFileNoWavePeriod")] + [TestCase("ValidFileNoWaveDirection")] + [TestCase("ValidFileNoWaveAngle")] + public void Parse_NotAllColumnsHasResults_ThrowsHydraRingFileParserException(string subFolder) { // Setup + string path = Path.Combine(testDirectory, subFolder); var parser = new WaveConditionsCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "output-no-waveHeight"); // Call - parser.Parse(workingDirectory, sectionId); + TestDelegate test = () => parser.Parse(path, 1); // Assert - Assert.IsNull(parser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, outputFileName))); + var exception = Assert.Throws(test); + Assert.AreEqual("Er zijn geen berekende golfcondities gevonden in de Hydra-Ring uitvoerdatabase.", exception.Message); + Assert.IsInstanceOf(exception.InnerException); } [Test] - public void Parse_InvalidHydraRingOutputFileWavePeakPeriodMissing_OutputNull() + public void Parse_ValidData_OutputSet() { // Setup + string path = Path.Combine(testDirectory, validFile); var parser = new WaveConditionsCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "output-no-wavePeakPeriod"); // Call - parser.Parse(workingDirectory, sectionId); + parser.Parse(path, 1); // Assert - Assert.IsNull(parser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, outputFileName))); + Assert.AreEqual(2.76672, parser.Output.WaveHeight); + Assert.AreEqual(-7.97903, parser.Output.WaveAngle); + Assert.AreEqual(292.021, parser.Output.WaveDirection); + Assert.AreEqual(5.02556, parser.Output.WavePeakPeriod); } } } \ No newline at end of file Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/EmptyDatabase/output.sqlite =================================================================== diff -u Binary files differ Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/InvalidFile/output.sqlite =================================================================== diff -u --- Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/InvalidFile/output.sqlite (revision 0) +++ Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/InvalidFile/output.sqlite (revision b22ebfa1f38daadd1bd4f79ac846057e7ee27976) @@ -0,0 +1 @@ \ No newline at end of file Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/ValidFile/output.sqlite =================================================================== diff -u Binary files differ Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/ValidFileNoWaveAngle/output.sqlite =================================================================== diff -u Binary files differ Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/ValidFileNoWaveDirection/output.sqlite =================================================================== diff -u Binary files differ Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/ValidFileNoWaveHeight/output.sqlite =================================================================== diff -u Binary files differ Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/ValidFileNoWavePeriod/output.sqlite =================================================================== diff -u Binary files differ Fisheye: Tag b22ebfa1f38daadd1bd4f79ac846057e7ee27976 refers to a dead (removed) revision in file `Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/empty/1-output.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag b22ebfa1f38daadd1bd4f79ac846057e7ee27976 refers to a dead (removed) revision in file `Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/output-no-waveAngle/1-output.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag b22ebfa1f38daadd1bd4f79ac846057e7ee27976 refers to a dead (removed) revision in file `Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/output-no-waveDirection/1-output.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag b22ebfa1f38daadd1bd4f79ac846057e7ee27976 refers to a dead (removed) revision in file `Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/output-no-waveHeight/1-output.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag b22ebfa1f38daadd1bd4f79ac846057e7ee27976 refers to a dead (removed) revision in file `Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/output-no-wavePeakPeriod/1-output.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag b22ebfa1f38daadd1bd4f79ac846057e7ee27976 refers to a dead (removed) revision in file `Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/WaveConditionsCalculationParser/valid/1-output.txt'. Fisheye: No comparison available. Pass `N' to diff?