Index: Ringtoets/Common/test/Ringtoets.Common.Service.Test/DesignWaterLevelCalculationServiceTest.cs =================================================================== diff -u -r02670d8c9fceeaea5f829937a2eb269f3488c6b1 -re90324ad44fdf6e7af3a755239246727123a1591 --- Ringtoets/Common/test/Ringtoets.Common.Service.Test/DesignWaterLevelCalculationServiceTest.cs (.../DesignWaterLevelCalculationServiceTest.cs) (revision 02670d8c9fceeaea5f829937a2eb269f3488c6b1) +++ Ringtoets/Common/test/Ringtoets.Common.Service.Test/DesignWaterLevelCalculationServiceTest.cs (.../DesignWaterLevelCalculationServiceTest.cs) (revision e90324ad44fdf6e7af3a755239246727123a1591) @@ -124,27 +124,76 @@ using (new HydraRingCalculatorFactoryConfig()) { - var testFactory = (TestHydraRingCalculatorFactory)HydraRingCalculatorFactory.Instance; + var testFactory = (TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance; var testCalculator = testFactory.DesignWaterLevelCalculator; // Call new DesignWaterLevelCalculationService().Calculate(hydraulicBoundaryLocation, - validFilePath, - ringId, - norm, - calculationMessageProviderMock); + validFilePath, + ringId, + norm, + calculationMessageProviderMock); // Assert Assert.AreEqual(testDataPath, testCalculator.HydraulicBoundaryDatabaseDirectory); Assert.AreEqual(ringId, testCalculator.RingId); var expectedInput = CreateInput(hydraulicBoundaryLocation, norm); AssertInput(expectedInput, testCalculator.ReceivedInputs.First()); + Assert.IsFalse(testCalculator.IsCanceled); } mockRepository.VerifyAll(); } [Test] + public void Calculate_CancelCalculationWithValidInput_CancelsCalculation() + { + // Setup + string validFilePath = Path.Combine(testDataPath, validFile); + + const string locationName = "punt_flw_ 1"; + const string calculationName = "locationName"; + const string calculationNotConvergedMessage = "calculationNotConvergedMessage"; + const string ringId = "ringId"; + const double norm = 30; + + var mockRepository = new MockRepository(); + var calculationMessageProviderMock = mockRepository.Stub(); + calculationMessageProviderMock.Stub(calc => calc.GetCalculationName(locationName)).Return(calculationName); + calculationMessageProviderMock.Stub(calc => calc.GetCalculatedNotConvergedMessage(locationName)).Return(calculationNotConvergedMessage); + mockRepository.ReplayAll(); + + var hydraulicBoundaryLocation = new HydraulicBoundaryLocation(1300001, locationName, 0, 0) + { + DesignWaterLevel = new RoundedDouble(2, double.NaN) + }; + + using (new HydraRingCalculatorFactoryConfig()) + { + var testFactory = (TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance; + var testCalculator = testFactory.DesignWaterLevelCalculator; + + // Call + var service = new DesignWaterLevelCalculationService(); + service.Calculate(hydraulicBoundaryLocation, + validFilePath, + ringId, + norm, + calculationMessageProviderMock); + service.Cancel(); + + // Assert + Assert.AreEqual(testDataPath, testCalculator.HydraulicBoundaryDatabaseDirectory); + Assert.AreEqual(ringId, testCalculator.RingId); + + var expectedInput = CreateInput(hydraulicBoundaryLocation, norm); + AssertInput(expectedInput, testCalculator.ReceivedInputs.First()); + Assert.IsTrue(testCalculator.IsCanceled); + } + mockRepository.VerifyAll(); + } + + [Test] public void Calculate_CalculationFails_LogError() { // Setup @@ -190,7 +239,6 @@ exceptionThrown = true; } }; - // Assert TestHelper.AssertLogMessages(call, messages => Index: Ringtoets/Common/test/Ringtoets.Common.Service.Test/WaveHeightCalculationServiceTest.cs =================================================================== diff -u -r02670d8c9fceeaea5f829937a2eb269f3488c6b1 -re90324ad44fdf6e7af3a755239246727123a1591 --- Ringtoets/Common/test/Ringtoets.Common.Service.Test/WaveHeightCalculationServiceTest.cs (.../WaveHeightCalculationServiceTest.cs) (revision 02670d8c9fceeaea5f829937a2eb269f3488c6b1) +++ Ringtoets/Common/test/Ringtoets.Common.Service.Test/WaveHeightCalculationServiceTest.cs (.../WaveHeightCalculationServiceTest.cs) (revision e90324ad44fdf6e7af3a755239246727123a1591) @@ -78,7 +78,7 @@ const string calculationName = "calculationName"; string notValidFilePath = Path.Combine(testDataPath, "notexisting.sqlite"); bool valid = false; - + var mockRepository = new MockRepository(); ICalculationMessageProvider messageProviderStub = mockRepository.Stub(); messageProviderStub.Stub(mp => mp.GetCalculationName(calculationName)).Return(calculationName); @@ -125,26 +125,74 @@ using (new HydraRingCalculatorFactoryConfig()) { - var testFactory = (TestHydraRingCalculatorFactory)HydraRingCalculatorFactory.Instance; + var testFactory = (TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance; var testCalculator = testFactory.WaveHeightCalculator; new WaveHeightCalculationService().Calculate(hydraulicBoundaryLocation, - validFilePath, - ringId, - norm, - calculationMessageProviderMock); + validFilePath, + ringId, + norm, + calculationMessageProviderMock); // Assert Assert.AreEqual(testDataPath, testCalculator.HydraulicBoundaryDatabaseDirectory); Assert.AreEqual(ringId, testCalculator.RingId); var expectedInput = CreateInput(hydraulicBoundaryLocation, norm); AssertInput(expectedInput, testCalculator.ReceivedInputs.First()); + Assert.IsFalse(testCalculator.IsCanceled); } mockRepository.VerifyAll(); } [Test] + public void Calculate_CancelCalculationWithValidInput_CancelsCalculation() + { + // Setup + string validFilePath = Path.Combine(testDataPath, validFile); + + const string locationName = "punt_flw_ 1"; + const string calculationName = "locationName"; + const string calculationNotConvergedMessage = "calculationNotConvergedMessage"; + const string ringId = "ringId"; + const double norm = 30; + + var mockRepository = new MockRepository(); + var calculationMessageProviderMock = mockRepository.StrictMock(); + calculationMessageProviderMock.Stub(calc => calc.GetCalculationName(locationName)).Return(calculationName); + calculationMessageProviderMock.Stub(calc => calc.GetCalculatedNotConvergedMessage(locationName)).Return(calculationNotConvergedMessage); + mockRepository.ReplayAll(); + + var hydraulicBoundaryLocation = new HydraulicBoundaryLocation(1300001, locationName, 0, 0) + { + DesignWaterLevel = new RoundedDouble(2, double.NaN), + }; + + using (new HydraRingCalculatorFactoryConfig()) + { + var testFactory = (TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance; + var testCalculator = testFactory.WaveHeightCalculator; + + var service = new WaveHeightCalculationService(); + service.Calculate(hydraulicBoundaryLocation, + validFilePath, + ringId, + norm, + calculationMessageProviderMock); + service.Cancel(); + + // Assert + Assert.AreEqual(testDataPath, testCalculator.HydraulicBoundaryDatabaseDirectory); + Assert.AreEqual(ringId, testCalculator.RingId); + + var expectedInput = CreateInput(hydraulicBoundaryLocation, norm); + AssertInput(expectedInput, testCalculator.ReceivedInputs.First()); + Assert.IsTrue(testCalculator.IsCanceled); + } + mockRepository.VerifyAll(); + } + + [Test] public void Calculate_CalculationFails_LogError() { // Setup @@ -169,19 +217,20 @@ ReliabilityIndexCalculationOutput output = null; using (new HydraRingCalculatorFactoryConfig()) { - var testFactory = (TestHydraRingCalculatorFactory)HydraRingCalculatorFactory.Instance; + var testFactory = (TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance; var testCalculator = testFactory.WaveHeightCalculator; testCalculator.EndInFailure = true; bool exceptionThrown = false; // Call - Action call = () => + Action call = () => { try - {new WaveHeightCalculationService().Calculate(hydraulicBoundaryLocation, - validFilePath, - ringId, - norm, - calculationMessageProviderMock); + { + new WaveHeightCalculationService().Calculate(hydraulicBoundaryLocation, + validFilePath, + ringId, + norm, + calculationMessageProviderMock); } catch (HydraRingFileParserException) { Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Service.Test/GrassCoverErosionInwardsCalculationServiceTest.cs =================================================================== diff -u -rd50c59f03bb0dda390a20e79b402fd91f884234a -re90324ad44fdf6e7af3a755239246727123a1591 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Service.Test/GrassCoverErosionInwardsCalculationServiceTest.cs (.../GrassCoverErosionInwardsCalculationServiceTest.cs) (revision d50c59f03bb0dda390a20e79b402fd91f884234a) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Service.Test/GrassCoverErosionInwardsCalculationServiceTest.cs (.../GrassCoverErosionInwardsCalculationServiceTest.cs) (revision e90324ad44fdf6e7af3a755239246727123a1591) @@ -441,6 +441,160 @@ mockRepository.VerifyAll(); } + [Test] + public void CalculateOvertoppingOnly_OvertoppingCalculationFails_OutputNull() + { + // Setup + var grassCoverErosionInwardsFailureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + AddSectionToFailureMechanism(grassCoverErosionInwardsFailureMechanism); + + var mockRepository = new MockRepository(); + var assessmentSectionStub = CreateAssessmentSectionStub(grassCoverErosionInwardsFailureMechanism, mockRepository); + mockRepository.ReplayAll(); + + var dikeProfile = GetDikeProfile(); + + var calculation = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSectionStub.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), + DikeProfile = dikeProfile, + } + }; + + var failureMechanismSection = grassCoverErosionInwardsFailureMechanism.Sections.First(); + bool expectedExceptionThrown = false; + + // Call + Action call = () => + { + try + { + using (new HydraRingCalculatorFactoryConfig()) + { + var calculator = ((TestHydraRingCalculatorFactory)HydraRingCalculatorFactory.Instance).OvertoppingCalculator; + calculator.EndInFailure = true; + + new GrassCoverErosionInwardsCalculationService().CalculateDikeHeight(calculation, + assessmentSectionStub, + failureMechanismSection, + grassCoverErosionInwardsFailureMechanism.GeneralInput, + grassCoverErosionInwardsFailureMechanism.Contribution, + testDataPath); + } + } + catch (HydraRingFileParserException) + { + expectedExceptionThrown = 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 grasbekleding erosie kruin en binnentalud '{0}' is niet gelukt.", calculation.Name), msgs[1]); + StringAssert.StartsWith("Overloop berekeningsverslag. Klik op details voor meer informatie.\r\n", msgs[2]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' beƫindigd om: ", calculation.Name), msgs[3]); + }); + Assert.IsTrue(expectedExceptionThrown); + Assert.IsNull(calculation.Output); + + mockRepository.VerifyAll(); + } + + [Test] + public void Calculate_CancelWithValidOvertoppingCalculationInput_CancelsCalculator() + { + // Setup + var grassCoverErosionInwardsFailureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + AddSectionToFailureMechanism(grassCoverErosionInwardsFailureMechanism); + + var mockRepository = new MockRepository(); + var assessmentSectionStub = CreateAssessmentSectionStub(grassCoverErosionInwardsFailureMechanism, mockRepository); + mockRepository.ReplayAll(); + + const string name = ""; + + GrassCoverErosionInwardsCalculation calculation = new GrassCoverErosionInwardsCalculation + { + Name = name, + InputParameters = + { + HydraulicBoundaryLocation = new HydraulicBoundaryLocation(1, "name", 2, 2), + DikeProfile = new DikeProfile(new Point2D(0, 0), new RoughnessPoint[0], new Point2D[0], + null, new DikeProfile.ConstructionProperties()), + } + }; + + var failureMechanismSection = grassCoverErosionInwardsFailureMechanism.Sections.First(); + var service = new GrassCoverErosionInwardsCalculationService(); + + // Call + using (new HydraRingCalculatorFactoryConfig()) + { + var calculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).OvertoppingCalculator; + service.CalculateDikeHeight(calculation, + assessmentSectionStub, + failureMechanismSection, + grassCoverErosionInwardsFailureMechanism.GeneralInput, + grassCoverErosionInwardsFailureMechanism.Contribution, + testDataPath); + service.Cancel(); + + // Assert + Assert.IsTrue(calculator.IsCanceled); + } + } + + [Test] + public void Calculate_CancelWithValidDikeCalculationInput_CancelsCalculator() + { + // Setup + var grassCoverErosionInwardsFailureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + AddSectionToFailureMechanism(grassCoverErosionInwardsFailureMechanism); + + var mockRepository = new MockRepository(); + var assessmentSectionStub = CreateAssessmentSectionStub(grassCoverErosionInwardsFailureMechanism, mockRepository); + mockRepository.ReplayAll(); + + const string name = ""; + + GrassCoverErosionInwardsCalculation calculation = new GrassCoverErosionInwardsCalculation + { + Name = name, + InputParameters = + { + HydraulicBoundaryLocation = new HydraulicBoundaryLocation(1, "name", 2, 2), + DikeProfile = new DikeProfile(new Point2D(0, 0), new RoughnessPoint[0], new Point2D[0], + null, new DikeProfile.ConstructionProperties()), + CalculateDikeHeight = true + } + }; + + var failureMechanismSection = grassCoverErosionInwardsFailureMechanism.Sections.First(); + var service = new GrassCoverErosionInwardsCalculationService(); + + // Call + using (new HydraRingCalculatorFactoryConfig()) + { + var calculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).DikeHeightCalculator; + service.CalculateDikeHeight(calculation, + assessmentSectionStub, + failureMechanismSection, + grassCoverErosionInwardsFailureMechanism.GeneralInput, + grassCoverErosionInwardsFailureMechanism.Contribution, + testDataPath); + service.Cancel(); + + // Assert + Assert.IsTrue(calculator.IsCanceled); + } + } + private static void AddSectionToFailureMechanism(GrassCoverErosionInwardsFailureMechanism failureMechanism) { failureMechanism.AddSection(new FailureMechanismSection("test section", new[] Index: Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Service.Test/HeightStructuresCalculationServiceTest.cs =================================================================== diff -u -rb2f617ad0d8d6457422a569685763b9718740560 -re90324ad44fdf6e7af3a755239246727123a1591 --- Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Service.Test/HeightStructuresCalculationServiceTest.cs (.../HeightStructuresCalculationServiceTest.cs) (revision b2f617ad0d8d6457422a569685763b9718740560) +++ Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Service.Test/HeightStructuresCalculationServiceTest.cs (.../HeightStructuresCalculationServiceTest.cs) (revision e90324ad44fdf6e7af3a755239246727123a1591) @@ -351,12 +351,59 @@ StructuresOvertoppingCalculationInput actualInput = overtoppingCalculationInputs[0]; HydraRingDataEqualityHelper.AreEqual(expectedInput, actualInput); + Assert.IsFalse(testStructuresOvertoppingCalculator.IsCanceled); } mockRepository.VerifyAll(); } - private static IAssessmentSection CreateAssessmentSectionStub(IFailureMechanism failureMechanism, MockRepository mockRepository) + [Test] + public void Calculate_CancelCalculationWithValidInput_CancelsCalculator() { + // Setup + var heightStructuresFailureMechanism = new HeightStructuresFailureMechanism(); + + var mockRepository = new MockRepository(); + var assessmentSectionStub = CreateAssessmentSectionStub(heightStructuresFailureMechanism, mockRepository); + mockRepository.ReplayAll(); + + heightStructuresFailureMechanism.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + HeightStructuresCalculation calculation = new TestHeightStructuresCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSectionStub.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001) + } + }; + + FailureMechanismSection failureMechanismSection = heightStructuresFailureMechanism.Sections.First(); + + using (new HydraRingCalculatorFactoryConfig()) + { + var testStructuresOvertoppingCalculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).StructuresOvertoppingCalculator; + var service = new HeightStructuresCalculationService(); + + // Call + service.Calculate(calculation, + assessmentSectionStub, + failureMechanismSection, + heightStructuresFailureMechanism.GeneralInput, + heightStructuresFailureMechanism.Contribution, + testDataPath); + service.Cancel(); + + // Assert + Assert.IsTrue(testStructuresOvertoppingCalculator.IsCanceled); + } + } + + private static + IAssessmentSection CreateAssessmentSectionStub(IFailureMechanism failureMechanism, MockRepository mockRepository) + { var assessmentSectionStub = mockRepository.Stub(); assessmentSectionStub.Stub(a => a.Id).Return("21"); assessmentSectionStub.Stub(a => a.FailureMechanismContribution).Return(new FailureMechanismContribution(new[]