Index: Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/ClosingStructuresCalculationService.cs =================================================================== diff -u -rbd73023d5f8926a411da214fb5ce522056a0e30a -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/ClosingStructuresCalculationService.cs (.../ClosingStructuresCalculationService.cs) (revision bd73023d5f8926a411da214fb5ce522056a0e30a) +++ Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/ClosingStructuresCalculationService.cs (.../ClosingStructuresCalculationService.cs) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -85,6 +85,8 @@ CalculationServiceHelper.LogCalculationBeginTime(calculationName); + var exceptionThrown = false; + try { calculator.Calculate(input); @@ -101,14 +103,41 @@ { if (!canceled) { - log.ErrorFormat(Resources.ClosingStructuresCalculationService_Calculate_Error_in_closing_structures_0_calculation, calculationName); + var lastErrorContent = calculator.LastErrorContent; + if (string.IsNullOrEmpty(lastErrorContent)) + { + log.ErrorFormat(Resources.ClosingStructuresCalculationService_Calculate_Unexplained_error_in_closing_structures_0_calculation, + calculationName); + } + else + { + log.ErrorFormat(Resources.ClosingStructuresCalculationService_Calculate_Error_in_closing_structures_0_calculation_click_details_for_last_error_1, + calculationName, lastErrorContent); + } + + exceptionThrown = true; throw; } } finally { - log.InfoFormat(Resources.ClosingStructuresCalculationService_Calculate_Calculation_temporary_directory_can_be_found_on_location_0, calculator.OutputDirectory); - CalculationServiceHelper.LogCalculationEndTime(calculationName); + try + { + var lastErrorContent = calculator.LastErrorContent; + if (!exceptionThrown && !string.IsNullOrEmpty(lastErrorContent)) + { + log.ErrorFormat(Resources.ClosingStructuresCalculationService_Calculate_Error_in_closing_structures_0_calculation_click_details_for_last_error_1, + calculationName, lastErrorContent); + + throw new HydraRingFileParserException(lastErrorContent); + } + } + finally + { + log.InfoFormat(Resources.ClosingStructuresCalculationService_Calculate_Calculation_temporary_directory_can_be_found_on_location_0, + calculator.OutputDirectory); + CalculationServiceHelper.LogCalculationEndTime(calculationName); + } } } Index: Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/Properties/Resources.Designer.cs =================================================================== diff -u -rbd73023d5f8926a411da214fb5ce522056a0e30a -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision bd73023d5f8926a411da214fb5ce522056a0e30a) +++ Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -92,13 +92,24 @@ } /// - /// Looks up a localized string similar to De berekening voor kunstwerk sluiten '{0}' is niet gelukt.. + /// Looks up a localized string similar to De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Bekijk het foutrapport door op details te klikken. + ///{1}. /// - internal static string ClosingStructuresCalculationService_Calculate_Error_in_closing_structures_0_calculation { + internal static string ClosingStructuresCalculationService_Calculate_Error_in_closing_structures_0_calculation_click_details_for_last_error_1 { get { return ResourceManager.GetString("ClosingStructuresCalculationService_Calculate_Error_in_closing_structures_0_calcu" + - "lation", resourceCulture); + "lation_click_details_for_last_error_1", resourceCulture); } } + + /// + /// Looks up a localized string similar to De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Er is geen foutrapport beschikbaar.. + /// + internal static string ClosingStructuresCalculationService_Calculate_Unexplained_error_in_closing_structures_0_calculation { + get { + return ResourceManager.GetString("ClosingStructuresCalculationService_Calculate_Unexplained_error_in_closing_struct" + + "ures_0_calculation", resourceCulture); + } + } } } Index: Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/Properties/Resources.resx =================================================================== diff -u -rbd73023d5f8926a411da214fb5ce522056a0e30a -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/Properties/Resources.resx (.../Resources.resx) (revision bd73023d5f8926a411da214fb5ce522056a0e30a) +++ Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/Properties/Resources.resx (.../Resources.resx) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -117,10 +117,14 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - De berekening voor kunstwerk sluiten '{0}' is niet gelukt. + + De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Er is geen foutrapport beschikbaar. Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie: {0}. Gedetailleerde invoer en uitvoer kan in de bestanden op deze locatie worden gevonden. + + De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Bekijk het foutrapport door op details te klikken. +{1} + \ No newline at end of file Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/TreeNodeInfos/ClosingStructureFailureMechanismContextTreeNodeInfoTest.cs =================================================================== diff -u -r379d603ad7570ee56a65fecc920e56ca24279065 -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/TreeNodeInfos/ClosingStructureFailureMechanismContextTreeNodeInfoTest.cs (.../ClosingStructureFailureMechanismContextTreeNodeInfoTest.cs) (revision 379d603ad7570ee56a65fecc920e56ca24279065) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/TreeNodeInfos/ClosingStructureFailureMechanismContextTreeNodeInfoTest.cs (.../ClosingStructureFailureMechanismContextTreeNodeInfoTest.cs) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -580,9 +580,9 @@ RingtoetsCommonFormsResources.CalculateAllIcon); TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuValidateAllIndex, - "Alles &valideren", - "Valideer alle berekeningen binnen dit toetsspoor.", - RingtoetsCommonFormsResources.ValidateAllIcon); + "Alles &valideren", + "Valideer alle berekeningen binnen dit toetsspoor.", + RingtoetsCommonFormsResources.ValidateAllIcon); } } } @@ -659,13 +659,15 @@ StringAssert.StartsWith("Validatie van 'A' gestart om: ", messageList[0]); StringAssert.StartsWith("Validatie van 'A' beëindigd om: ", messageList[1]); StringAssert.StartsWith("Berekening van 'A' gestart om: ", messageList[2]); - Assert.AreEqual("De berekening voor kunstwerk sluiten 'A' is niet gelukt.", messageList[3]); + StringAssert.StartsWith("De berekening voor kunstwerk sluiten 'A' is niet gelukt. Bekijk het foutrapport door op details te klikken.", + messageList[3]); StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", messageList[4]); StringAssert.StartsWith("Berekening van 'A' beëindigd om: ", messageList[5]); StringAssert.StartsWith("Validatie van 'B' gestart om: ", messageList[6]); StringAssert.StartsWith("Validatie van 'B' beëindigd om: ", messageList[7]); StringAssert.StartsWith("Berekening van 'B' gestart om: ", messageList[8]); - Assert.AreEqual("De berekening voor kunstwerk sluiten 'B' is niet gelukt.", messageList[9]); + StringAssert.StartsWith("De berekening voor kunstwerk sluiten 'B' is niet gelukt. Bekijk het foutrapport door op details te klikken.", + messageList[9]); StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", messageList[10]); StringAssert.StartsWith("Berekening van 'B' beëindigd om: ", messageList[11]); Assert.AreEqual("Uitvoeren van 'A' is mislukt.", messageList[12]); Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/TreeNodeInfos/ClosingStructuresCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -rbd73023d5f8926a411da214fb5ce522056a0e30a -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/TreeNodeInfos/ClosingStructuresCalculationGroupContextTreeNodeInfoTest.cs (.../ClosingStructuresCalculationGroupContextTreeNodeInfoTest.cs) (revision bd73023d5f8926a411da214fb5ce522056a0e30a) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/TreeNodeInfos/ClosingStructuresCalculationGroupContextTreeNodeInfoTest.cs (.../ClosingStructuresCalculationGroupContextTreeNodeInfoTest.cs) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -698,13 +698,15 @@ StringAssert.StartsWith("Validatie van 'A' gestart om: ", messageList[0]); StringAssert.StartsWith("Validatie van 'A' beëindigd om: ", messageList[1]); StringAssert.StartsWith("Berekening van 'A' gestart om: ", messageList[2]); - Assert.AreEqual("De berekening voor kunstwerk sluiten 'A' is niet gelukt.", messageList[3]); + StringAssert.StartsWith("De berekening voor kunstwerk sluiten 'A' is niet gelukt. Bekijk het foutrapport door op details te klikken.", + messageList[3]); StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", messageList[4]); StringAssert.StartsWith("Berekening van 'A' beëindigd om: ", messageList[5]); StringAssert.StartsWith("Validatie van 'B' gestart om: ", messageList[6]); StringAssert.StartsWith("Validatie van 'B' beëindigd om: ", messageList[7]); StringAssert.StartsWith("Berekening van 'B' gestart om: ", messageList[8]); - Assert.AreEqual("De berekening voor kunstwerk sluiten 'B' is niet gelukt.", messageList[9]); + StringAssert.StartsWith("De berekening voor kunstwerk sluiten 'B' is niet gelukt. Bekijk het foutrapport door op details te klikken.", + messageList[9]); StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", messageList[10]); StringAssert.StartsWith("Berekening van 'B' beëindigd om: ", messageList[11]); Assert.AreEqual("Uitvoeren van 'A' is mislukt.", messageList[12]); Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Integration.Test/ClosingStructuresCalculationActivityIntegrationTest.cs =================================================================== diff -u -rbd73023d5f8926a411da214fb5ce522056a0e30a -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Integration.Test/ClosingStructuresCalculationActivityIntegrationTest.cs (.../ClosingStructuresCalculationActivityIntegrationTest.cs) (revision bd73023d5f8926a411da214fb5ce522056a0e30a) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Integration.Test/ClosingStructuresCalculationActivityIntegrationTest.cs (.../ClosingStructuresCalculationActivityIntegrationTest.cs) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -35,6 +35,7 @@ using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.IO.FileImporters; +using Ringtoets.HydraRing.Calculation.Calculator.Factory; using Ringtoets.HydraRing.Calculation.TestUtil.Calculator; using Ringtoets.HydraRing.Data; using Ringtoets.Integration.Data; @@ -47,7 +48,7 @@ private readonly string testDataPath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Integration.Service, "HydraRingCalculation"); [Test] - public void Run_ClosingStructuresCalculationInvalidInput_LogValidationStartAndEndWithError() + public void Run_CalculationInvalidInput_LogValidationStartAndEndWithError() { // Setup var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) @@ -85,7 +86,7 @@ } [Test] - public void Run_ValidClosingStructuresCalculation_PerformClosingStructuresValidationAndCalculationAndLogStartAndEnd() + public void Run_ValidCalculation_PerformValidationAndCalculationAndLogStartAndEnd() { // Setup var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); @@ -126,15 +127,15 @@ StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", calculation.Name), msgs[0]); StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", calculation.Name), msgs[1]); StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[2]); - StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[4]); StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", msgs[3]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[4]); }); Assert.AreEqual(ActivityState.Executed, activity.State); } } [Test] - public void Run_InvalidClosingStructuresCalculationAndRan_PerformClosingStructuresValidationAndCalculationAndLogStartAndEndAndError() + public void Run_InvalidCalculationAndRan_PerformValidationAndCalculationAndLogStartAndEndAndError() { // Setup var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); @@ -174,17 +175,127 @@ StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", calculation.Name), msgs[0]); StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", calculation.Name), msgs[1]); StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[2]); - StringAssert.StartsWith(string.Format("De berekening voor kunstwerk sluiten '{0}' is niet gelukt.", calculation.Name), msgs[3]); + StringAssert.StartsWith(string.Format("De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Bekijk het foutrapport door op details te klikken.", + calculation.Name), msgs[3]); StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", msgs[4]); StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[5]); }); Assert.AreEqual(ActivityState.Failed, activity.State); } [Test] - public void Finish_ValidClosingStructuresCalculationAndRan_SetsOutputAndNotifyObserversOfClosingStructuresCalculation() + public void Run_UnexplainedErrorInCalculation_PerformValidationAndCalculationAndLogStartAndEndAndError() { // Setup + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + + string validFilePath = Path.Combine(testDataPath, "HRD dutch coast south.sqlite"); + + using (var importer = new HydraulicBoundaryDatabaseImporter()) + { + importer.Import(assessmentSection, validFilePath); + } + + var failureMechanism = new ClosingStructuresFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new TestClosingStructuresCalculation() + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), + } + }; + + var activity = new ClosingStructuresCalculationActivity(calculation, testDataPath, failureMechanism, assessmentSection); + using (new HydraRingCalculatorFactoryConfig()) + { + var calculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).StructuresClosureCalculator; + calculator.EndInFailure = true; + + // Call + Action call = () => activity.Run(); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(6, msgs.Length); + StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", calculation.Name), msgs[0]); + StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", calculation.Name), msgs[1]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[2]); + StringAssert.StartsWith(string.Format("De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Er is geen foutrapport beschikbaar.", + calculation.Name), msgs[3]); + StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", msgs[4]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[5]); + }); + Assert.AreEqual(ActivityState.Failed, activity.State); + } + } + + [Test] + public void Run_ErrorInCalculation_PerformValidationAndCalculationAndLogStartAndEndAndError() + { + // Setup + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + + string validFilePath = Path.Combine(testDataPath, "HRD dutch coast south.sqlite"); + + using (var importer = new HydraulicBoundaryDatabaseImporter()) + { + importer.Import(assessmentSection, validFilePath); + } + + var failureMechanism = new ClosingStructuresFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new TestClosingStructuresCalculation() + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), + } + }; + + var activity = new ClosingStructuresCalculationActivity(calculation, testDataPath, failureMechanism, assessmentSection); + using (new HydraRingCalculatorFactoryConfig()) + { + var calculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).StructuresClosureCalculator; + calculator.EndInFailure = false; + calculator.LastErrorContent = "An error occured"; + + // Call + Action call = () => activity.Run(); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(6, msgs.Length); + StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", calculation.Name), msgs[0]); + StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", calculation.Name), msgs[1]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[2]); + StringAssert.StartsWith(string.Format("De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Bekijk het foutrapport door op details te klikken.", + calculation.Name), msgs[3]); + StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", msgs[4]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[5]); + }); + Assert.AreEqual(ActivityState.Failed, activity.State); + } + } + + [Test] + public void Finish_ValidCalculationAndRan_SetsOutputAndNotifyObserversOfCalculation() + { + // Setup var mocks = new MockRepository(); var observerMock = mocks.StrictMock(); observerMock.Expect(o => o.UpdateObserver()); @@ -231,7 +342,7 @@ } [Test] - public void Finish_InvalidClosingStructuresCalculationAndRan_DoesNotSetOutputAndNotifyObserversOfClosingStructuresCalculation() + public void Finish_InvalidCalculationAndRan_DoesNotSetOutputAndNotifyObserversOfCalculation() { // Setup var mocks = new MockRepository(); Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Service.Test/ClosingStructuresCalculationServiceTest.cs =================================================================== diff -u -rbd73023d5f8926a411da214fb5ce522056a0e30a -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Service.Test/ClosingStructuresCalculationServiceTest.cs (.../ClosingStructuresCalculationServiceTest.cs) (revision bd73023d5f8926a411da214fb5ce522056a0e30a) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Service.Test/ClosingStructuresCalculationServiceTest.cs (.../ClosingStructuresCalculationServiceTest.cs) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -940,6 +940,195 @@ } } + [Test] + public void Calculate_CalculationFailedWithExceptionAndLastErrorPresent_LogErrorAndThrowException() + { + // Setup + var closingStructuresFailureMechanism = new ClosingStructuresFailureMechanism(); + + var mockRepository = new MockRepository(); + IAssessmentSection assessmentSectionStub = AssessmentSectionHelper.CreateAssessmentSectionStub(closingStructuresFailureMechanism, + mockRepository); + mockRepository.ReplayAll(); + + closingStructuresFailureMechanism.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new TestClosingStructuresCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSectionStub.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001) + } + }; + + using (new HydraRingCalculatorFactoryConfig()) + { + var calculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).StructuresClosureCalculator; + calculator.LastErrorContent = "An error occured"; + calculator.EndInFailure = true; + + var exceptionThrown = false; + + // Call + Action call = () => + { + try + { + new ClosingStructuresCalculationService().Calculate(calculation, + assessmentSectionStub, + closingStructuresFailureMechanism, + testDataPath); + } + catch (HydraRingFileParserException) + { + exceptionThrown = true; + } + }; + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(4, msgs.Length); + StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[0]); + StringAssert.StartsWith(string.Format("De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Bekijk het foutrapport door op details te klikken.", calculation.Name), msgs[1]); + StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", msgs[2]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[3]); + }); + Assert.IsTrue(exceptionThrown); + } + } + + [Test] + public void Calculate_CalculationFailedWithExceptionAndNoLastErrorPresent_LogErrorAndThrowException() + { + // Setup + var closingStructuresFailureMechanism = new ClosingStructuresFailureMechanism(); + + var mockRepository = new MockRepository(); + IAssessmentSection assessmentSectionStub = AssessmentSectionHelper.CreateAssessmentSectionStub(closingStructuresFailureMechanism, + mockRepository); + mockRepository.ReplayAll(); + + closingStructuresFailureMechanism.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new TestClosingStructuresCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSectionStub.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001) + } + }; + + using (new HydraRingCalculatorFactoryConfig()) + { + var calculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).StructuresClosureCalculator; + calculator.EndInFailure = true; + + var exceptionThrown = false; + + // Call + Action call = () => + { + try + { + new ClosingStructuresCalculationService().Calculate(calculation, + assessmentSectionStub, + closingStructuresFailureMechanism, + testDataPath); + } + catch (HydraRingFileParserException) + { + exceptionThrown = true; + } + }; + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(4, msgs.Length); + StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[0]); + StringAssert.StartsWith(string.Format("De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Er is geen foutrapport beschikbaar.", calculation.Name), msgs[1]); + StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", msgs[2]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[3]); + }); + Assert.IsTrue(exceptionThrown); + } + } + + [Test] + public void Calculate_CalculationFailedWithoutExceptionAndWithLastErrorPresent_LogErrorAndThrowException() + { + // Setup + var closingStructuresFailureMechanism = new ClosingStructuresFailureMechanism(); + + var mockRepository = new MockRepository(); + IAssessmentSection assessmentSectionStub = AssessmentSectionHelper.CreateAssessmentSectionStub(closingStructuresFailureMechanism, + mockRepository); + mockRepository.ReplayAll(); + + closingStructuresFailureMechanism.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new TestClosingStructuresCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSectionStub.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001) + } + }; + + using (new HydraRingCalculatorFactoryConfig()) + { + var calculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).StructuresClosureCalculator; + calculator.EndInFailure = false; + calculator.LastErrorContent = "An error occured"; + + var exceptionThrown = false; + var exceptionMessage = string.Empty; + + // Call + Action call = () => + { + try + { + new ClosingStructuresCalculationService().Calculate(calculation, + assessmentSectionStub, + closingStructuresFailureMechanism, + testDataPath); + } + catch (HydraRingFileParserException e) + { + exceptionThrown = true; + exceptionMessage = e.Message; + } + }; + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(4, msgs.Length); + StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[0]); + StringAssert.StartsWith(string.Format("De berekening voor kunstwerk sluiten '{0}' is niet gelukt. Bekijk het foutrapport door op details te klikken.", + calculation.Name), msgs[1]); + StringAssert.StartsWith("Betrouwbaarheid sluiting kunstwerk berekening is uitgevoerd op de tijdelijke locatie:", msgs[2]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[3]); + }); + Assert.IsTrue(exceptionThrown); + Assert.AreEqual(calculator.LastErrorContent, exceptionMessage); + } + } + /// /// Sets all input parameters of to invalid values. /// Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Calculator/HydraRingCalculatorBase.cs =================================================================== diff -u -re9ed7ace8ecabdee49a6635bf43b1fbb3613a090 -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Calculator/HydraRingCalculatorBase.cs (.../HydraRingCalculatorBase.cs) (revision e9ed7ace8ecabdee49a6635bf43b1fbb3613a090) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Calculator/HydraRingCalculatorBase.cs (.../HydraRingCalculatorBase.cs) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -66,7 +66,7 @@ public string OutputDirectory { get; private set; } /// - /// Gets the content of the last error file when it is generated during the calculation. + /// Gets the content of the last error file generated during the Hydra-Ring calculation. /// public string LastErrorContent { get; private set; } Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Calculator/IStructuresClosureCalculator.cs =================================================================== diff -u -rbd73023d5f8926a411da214fb5ce522056a0e30a -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Calculator/IStructuresClosureCalculator.cs (.../IStructuresClosureCalculator.cs) (revision bd73023d5f8926a411da214fb5ce522056a0e30a) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Calculator/IStructuresClosureCalculator.cs (.../IStructuresClosureCalculator.cs) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -40,6 +40,11 @@ string OutputDirectory { get; } /// + /// Gets the content of the last error file generated during the Hydra-Ring calculation. + /// + string LastErrorContent { get; } + + /// /// Performs the actual calculation by running the Hydra-Ring executable. /// /// The which contains all the necessary input Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.TestUtil/Calculator/TestHydraRingCalculatorFactory.cs =================================================================== diff -u -rbd73023d5f8926a411da214fb5ce522056a0e30a -rce5d60b8a5c520faec45cce64de6957dce747449 --- Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.TestUtil/Calculator/TestHydraRingCalculatorFactory.cs (.../TestHydraRingCalculatorFactory.cs) (revision bd73023d5f8926a411da214fb5ce522056a0e30a) +++ Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.TestUtil/Calculator/TestHydraRingCalculatorFactory.cs (.../TestHydraRingCalculatorFactory.cs) (revision ce5d60b8a5c520faec45cce64de6957dce747449) @@ -145,6 +145,7 @@ { public double ExceedanceProbabilityBeta { get; set; } public string OutputDirectory { get; set; } + public string LastErrorContent { get; set; } } public class TestStructuresStabilityPointCalculator : TestHydraRingCalculator, IStructuresStabilityPointCalculator