Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/ReliabilityIndexCalculationParser.cs =================================================================== diff -u -r12fa48e392e145311f2f6fe5822a8692594aaf0f -r9a23940073476cb6293dd921afb5298d0aeaab7d --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/ReliabilityIndexCalculationParser.cs (.../ReliabilityIndexCalculationParser.cs) (revision 12fa48e392e145311f2f6fe5822a8692594aaf0f) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/ReliabilityIndexCalculationParser.cs (.../ReliabilityIndexCalculationParser.cs) (revision 9a23940073476cb6293dd921afb5298d0aeaab7d) @@ -20,12 +20,9 @@ // All rights reserved. using System; -using System.Globalization; -using System.IO; -using System.Linq; using Ringtoets.HydraRing.Calculation.Data.Output; -using Ringtoets.HydraRing.Calculation.Exceptions; -using Ringtoets.HydraRing.IO; +using Ringtoets.HydraRing.Calculation.Properties; +using Ringtoets.HydraRing.Calculation.Readers; namespace Ringtoets.HydraRing.Calculation.Parsers { @@ -34,6 +31,16 @@ /// public class ReliabilityIndexCalculationParser : IHydraRingFileParser { + private const string sectionIdParameterName = "@sectionId"; + private const string betaColumnName = "BetaValue"; + private const string valueColumnName = "Value"; + + private readonly string query = $"SELECT {betaColumnName}, {valueColumnName} " + + "FROM IterateToGivenBetaConvergence " + + $"WHERE SectionId = {sectionIdParameterName} " + + "ORDER BY OuterIterationId DESC " + + "LIMIT 1;"; + /// /// Gets a /// corresponding to the section id if executed successfully; or null otherwise. @@ -42,33 +49,29 @@ public void Parse(string workingDirectory, int sectionId) { - try + if (workingDirectory == null) { - using (var streamReader = new StreamReader(Path.Combine(workingDirectory, HydraRingFileConstants.DesignTablesFileName))) - { - var fileContents = streamReader.ReadToEnd(); - var lines = fileContents.Split('\n'); - - foreach (var resultLine in lines.Skip(3)) // Skip the header lines - { - var results = resultLine.Split((char[]) null, StringSplitOptions.RemoveEmptyEntries); - - if (results.Any() && results.ElementAt(0) == sectionId.ToString()) - { - Output = new ReliabilityIndexCalculationOutput(GetDoubleValueFromElement(results.ElementAt(results.Length - 2)), GetDoubleValueFromElement(results.ElementAt(results.Length - 1))); - } - } - } + throw new ArgumentNullException(nameof(workingDirectory)); } - catch (Exception e) - { - throw new HydraRingFileParserException("", e); - } + + HydraRingDatabaseParseHelper.Parse(workingDirectory, + query, + sectionId, + Resources.ReliabilityIndexCalculationParser_Parse_No_reliability_found_in_output_file, + ReadResult); } - private static double GetDoubleValueFromElement(string element) + /// + /// Reads the result of the . + /// + /// The reader to get the result from. + /// Thrown when the the result + /// cannot be converted to the output format. + private void ReadResult(HydraRingDatabaseReader reader) { - return double.Parse(element, CultureInfo.InvariantCulture); + Output = new ReliabilityIndexCalculationOutput( + Convert.ToDouble(reader.ReadColumn("Value")), + Convert.ToDouble(reader.ReadColumn("BetaValue"))); } } } \ No newline at end of file Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.Designer.cs =================================================================== diff -u -rb253fd5ebc5d5800f5757be8b04820cb4ca05724 -r9a23940073476cb6293dd921afb5298d0aeaab7d --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision b253fd5ebc5d5800f5757be8b04820cb4ca05724) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 9a23940073476cb6293dd921afb5298d0aeaab7d) @@ -154,5 +154,14 @@ return ResourceManager.GetString("ParseFile_Cannot_read_result_in_output_file", resourceCulture); } } + + /// + /// Looks up a localized string similar to Er is geen resultaat voor de betrouwbaarheidsindex van de berekende kans van voorkomen gevonden in de Hydra-Ring uitvoerdatabase.. + /// + internal static string ReliabilityIndexCalculationParser_Parse_No_reliability_found_in_output_file { + get { + return ResourceManager.GetString("ReliabilityIndexCalculationParser_Parse_No_reliability_found_in_output_file", resourceCulture); + } + } } } Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.resx =================================================================== diff -u -rb253fd5ebc5d5800f5757be8b04820cb4ca05724 -r9a23940073476cb6293dd921afb5298d0aeaab7d --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.resx (.../Resources.resx) (revision b253fd5ebc5d5800f5757be8b04820cb4ca05724) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Properties/Resources.resx (.../Resources.resx) (revision 9a23940073476cb6293dd921afb5298d0aeaab7d) @@ -141,4 +141,7 @@ Er is geen resultaat voor de betrouwbaarheidsindex van de faalkans gevonden in de Hydra-Ring uitvoerdatabase. + + Er is geen resultaat voor de betrouwbaarheidsindex van de berekende kans van voorkomen gevonden in de Hydra-Ring uitvoerdatabase. + \ No newline at end of file Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/ReliabilityIndexCalculationParserTest.cs =================================================================== diff -u -r12fa48e392e145311f2f6fe5822a8692594aaf0f -r9a23940073476cb6293dd921afb5298d0aeaab7d --- Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/ReliabilityIndexCalculationParserTest.cs (.../ReliabilityIndexCalculationParserTest.cs) (revision 12fa48e392e145311f2f6fe5822a8692594aaf0f) +++ Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/ReliabilityIndexCalculationParserTest.cs (.../ReliabilityIndexCalculationParserTest.cs) (revision 9a23940073476cb6293dd921afb5298d0aeaab7d) @@ -19,20 +19,29 @@ // 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 Core.Common.TestUtil; using NUnit.Framework; using Ringtoets.HydraRing.Calculation.Exceptions; using Ringtoets.HydraRing.Calculation.Parsers; -using Ringtoets.HydraRing.IO; namespace Ringtoets.HydraRing.Calculation.Test.Parsers { [TestFixture] public class ReliabilityIndexCalculationParserTest { - private readonly string testDataPath = Path.Combine(TestHelper.GetTestDataPath(TestDataPath.Ringtoets.HydraRing.Calculation, "Parsers"), "ReliabilityIndexCalculationParser"); + private const string emptyWorkingDirectory = "EmptyWorkingDirectory"; + private const string invalidFileInDirectory = "InvalidFile"; + private const string emptyFileInDirectory = "EmptyDatabase"; + private const string validFile = "ValidFile"; + private const string betaNull = "BetaNull"; + private const string valueNull = "ValueNull"; + private readonly string testDirectory = Path.Combine(TestHelper.GetTestDataPath(TestDataPath.Ringtoets.HydraRing.Calculation, "Parsers"), + nameof(ReliabilityIndexCalculationParser)); + [Test] public void DefaultConstructor_SetDefaultValues() { @@ -45,85 +54,113 @@ } [Test] - public void Parse_NotExistingOutputFile_OutputNull() + public void Parse_WorkingDirectoryNull_ThrowsArgumentNullException() { // Setup - var reliabilityIndexCalculationExceptionParser = new ReliabilityIndexCalculationParser(); + var parser = new ReliabilityIndexCalculationParser(); // Call - TestDelegate test = () => reliabilityIndexCalculationExceptionParser.Parse(testDataPath, 1); + TestDelegate test = () => parser.Parse(null, 1); // Assert - Assert.Throws(test); - Assert.IsNull(reliabilityIndexCalculationExceptionParser.Output); + var exception = Assert.Throws(test); + Assert.AreEqual("workingDirectory", exception.ParamName); } [Test] - public void Parse_EmptyOutputFile_OutputNull() + public void Parse_WithWorkingDirectoryWithoutExpectedFile_ThrowsHydraRingFileParserException() { // Setup - var reliabilityIndexCalculationExceptionParser = new ReliabilityIndexCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "empty"); + string path = Path.Combine(testDirectory, emptyWorkingDirectory); + var parser = new ReliabilityIndexCalculationParser(); // Call - reliabilityIndexCalculationExceptionParser.Parse(workingDirectory, 1); + TestDelegate test = () => parser.Parse(path, 1); // Assert - Assert.IsNull(reliabilityIndexCalculationExceptionParser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, HydraRingFileConstants.DesignTablesFileName))); + var exception = Assert.Throws(test); + Assert.IsInstanceOf(exception.InnerException); } [Test] - [TestCase(1, 1.1, 11.11)] - [TestCase(3, 3.3, 33.33)] - public void Parse_ExampleHydraRingOutputFileContainingSectionIds_ReturnsExpectedReliabilityIndexCalculationResult(int sectionId, double result, double actual) + public void Parse_WithWorkingDirectoryWithInvalidOutputFile_ThrowsHydraRingFileParserException() { // Setup - var reliabilityIndexCalculationExceptionParser = new ReliabilityIndexCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "exampleOutputTable"); + string path = Path.Combine(testDirectory, invalidFileInDirectory); + var parser = new ReliabilityIndexCalculationParser(); // Call - reliabilityIndexCalculationExceptionParser.Parse(workingDirectory, sectionId); + TestDelegate test = () => parser.Parse(path, 1); // Assert - var reliabilityIndexCalculationOutput = reliabilityIndexCalculationExceptionParser.Output; - Assert.IsNotNull(reliabilityIndexCalculationOutput); - Assert.AreEqual(result, reliabilityIndexCalculationOutput.Result); - Assert.AreEqual(actual, reliabilityIndexCalculationOutput.CalculatedReliabilityIndex); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, HydraRingFileConstants.DesignTablesFileName))); + 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_ExampleHydraRingOutputFileContainingExtraWhiteLine_ReturnsExpectedReliabilityIndexCalculationResult() + public void Parse_WithWorkingDirectoryWithEmptyFile_ThrowsHydraRingFileParserException() { // Setup - var reliabilityIndexCalculationExceptionParser = new ReliabilityIndexCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "exampleOutputTableWithWhiteLine"); + string path = Path.Combine(testDirectory, emptyFileInDirectory); + var parser = new ReliabilityIndexCalculationParser(); // Call - reliabilityIndexCalculationExceptionParser.Parse(workingDirectory, 1); + TestDelegate test = () => parser.Parse(path, 1); // Assert - var reliabilityIndexCalculationOutput = reliabilityIndexCalculationExceptionParser.Output; - Assert.IsNotNull(reliabilityIndexCalculationOutput); - Assert.AreEqual(1.1, reliabilityIndexCalculationOutput.Result); - Assert.AreEqual(11.11, reliabilityIndexCalculationOutput.CalculatedReliabilityIndex); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, HydraRingFileConstants.DesignTablesFileName))); + var exception = Assert.Throws(test); + Assert.AreEqual("Er is geen resultaat voor de betrouwbaarheidsindex van de berekende kans van voorkomen gevonden in de Hydra-Ring uitvoerdatabase.", exception.Message); + Assert.IsInstanceOf(exception.InnerException); } [Test] - public void Parse_ExampleHydraRingOutputFileNotContainingSectionId_OutputNull() + public void Parse_WithBetaResultOnOtherSection_ThrowsHydraRingFileParserException() { // Setup - var reliabilityIndexCalculationExceptionParser = new ReliabilityIndexCalculationParser(); - var workingDirectory = Path.Combine(testDataPath, "exampleOutputTable"); + string path = Path.Combine(testDirectory, validFile); + var parser = new ReliabilityIndexCalculationParser(); // Call - reliabilityIndexCalculationExceptionParser.Parse(workingDirectory, 2); + TestDelegate test = () => parser.Parse(path, 0); // Assert - Assert.IsNull(reliabilityIndexCalculationExceptionParser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, HydraRingFileConstants.DesignTablesFileName))); + var exception = Assert.Throws(test); + Assert.AreEqual("Er is geen resultaat voor de betrouwbaarheidsindex van de berekende kans van voorkomen gevonden in de Hydra-Ring uitvoerdatabase.", exception.Message); + Assert.IsInstanceOf(exception.InnerException); } + + [Test] + public void Parse_ValidFileWithResults_OutputSet() + { + // Setup + string path = Path.Combine(testDirectory, validFile); + var parser = new ReliabilityIndexCalculationParser(); + + // Call + parser.Parse(path, 1); + + // Assert + Assert.AreEqual(1.24846, parser.Output.Result); + Assert.AreEqual(3.4037, parser.Output.CalculatedReliabilityIndex); + } + + [Test] + [TestCase(betaNull)] + [TestCase(valueNull)] + public void Parse_BetaOrValueNull_ThrowHydraRingFileParserException(string subFolder) + { + // Setup + string path = Path.Combine(testDirectory, subFolder); + var parser = new ReliabilityIndexCalculationParser(); + + // Call + TestDelegate test = () => parser.Parse(path, 1); + + // Assert + var exception = Assert.Throws(test); + Assert.AreEqual("Er is geen resultaat voor de betrouwbaarheidsindex van de berekende kans van voorkomen gevonden in de Hydra-Ring uitvoerdatabase.", exception.Message); + Assert.IsInstanceOf(exception.InnerException); + } } } \ No newline at end of file Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/ReliabilityIndexCalculationParser/BetaNull/output.sqlite =================================================================== diff -u Binary files differ Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/ReliabilityIndexCalculationParser/EmptyDatabase/output.sqlite =================================================================== diff -u Binary files differ Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/ReliabilityIndexCalculationParser/InvalidFile/output.sqlite =================================================================== diff -u Binary files differ Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/ReliabilityIndexCalculationParser/ValidFile/output.sqlite =================================================================== diff -u Binary files differ Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/ReliabilityIndexCalculationParser/ValueNull/output.sqlite =================================================================== diff -u Binary files differ Fisheye: Tag 9a23940073476cb6293dd921afb5298d0aeaab7d refers to a dead (removed) revision in file `Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/ReliabilityIndexCalculationParser/empty/designTable.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 9a23940073476cb6293dd921afb5298d0aeaab7d refers to a dead (removed) revision in file `Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/ReliabilityIndexCalculationParser/exampleOutputTable/designTable.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 9a23940073476cb6293dd921afb5298d0aeaab7d refers to a dead (removed) revision in file `Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/test-data/Parsers/ReliabilityIndexCalculationParser/exampleOutputTableWithWhiteLine/designTable.txt'. Fisheye: No comparison available. Pass `N' to diff?