Index: Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Plugin/WaveImpactAsphaltCoverPlugin.cs =================================================================== diff -u -ra781a13dd85064216928827c3aefb35d9829e073 -r9a62e7ebcbf96a0455143740fc883704b2cc6eea --- Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Plugin/WaveImpactAsphaltCoverPlugin.cs (.../WaveImpactAsphaltCoverPlugin.cs) (revision a781a13dd85064216928827c3aefb35d9829e073) +++ Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Plugin/WaveImpactAsphaltCoverPlugin.cs (.../WaveImpactAsphaltCoverPlugin.cs) (revision 9a62e7ebcbf96a0455143740fc883704b2cc6eea) @@ -549,23 +549,11 @@ private void CalculateAll(CalculationGroup group, WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext context) { - WaveImpactAsphaltCoverWaveConditionsCalculation[] calculations = group.GetCalculations().OfType().ToArray(); - - CalculateAll(calculations, context.FailureMechanism, context.AssessmentSection); - } - - private void CalculateAll(WaveImpactAsphaltCoverWaveConditionsCalculation[] calculations, - WaveImpactAsphaltCoverFailureMechanism failureMechanism, - IAssessmentSection assessmentSection) - { ActivityProgressDialogRunner.Run( Gui.MainWindow, - calculations - .Select(calculation => new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - assessmentSection.HydraulicBoundaryDatabase.FilePath, - failureMechanism, - assessmentSection)) - .ToList()); + WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivities(group, + context.FailureMechanism, + context.AssessmentSection)); } private static void WaveConditionsCalculationGroupContextOnNodeRemoved(WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext nodeData, object parentNodeData) @@ -655,10 +643,9 @@ WaveImpactAsphaltCoverWaveConditionsCalculationContext context) { ActivityProgressDialogRunner.Run(Gui.MainWindow, - new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - context.AssessmentSection.HydraulicBoundaryDatabase.FilePath, - context.FailureMechanism, - context.AssessmentSection)); + WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity(calculation, + context.FailureMechanism, + context.AssessmentSection)); } private static void WaveConditionsCalculationContextOnNodeRemoved(WaveImpactAsphaltCoverWaveConditionsCalculationContext nodeData, object parentNodeData) Index: Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Service/Properties/AssemblyInfo.cs =================================================================== diff -u -r0819cf01b494097b764677be8dd47853e38fc223 -r9a62e7ebcbf96a0455143740fc883704b2cc6eea --- Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Service/Properties/AssemblyInfo.cs (.../AssemblyInfo.cs) (revision 0819cf01b494097b764677be8dd47853e38fc223) +++ Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Service/Properties/AssemblyInfo.cs (.../AssemblyInfo.cs) (revision 9a62e7ebcbf96a0455143740fc883704b2cc6eea) @@ -20,6 +20,8 @@ // All rights reserved. using System.Reflection; +using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Ringtoets.WaveImpactAsphaltCover.Service")] -[assembly: AssemblyProduct("Ringtoets.WaveImpactAsphaltCover.Service")] \ No newline at end of file +[assembly: AssemblyProduct("Ringtoets.WaveImpactAsphaltCover.Service")] +[assembly: InternalsVisibleTo("Ringtoets.WaveImpactAsphaltCover.Service.Test")] \ No newline at end of file Index: Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Service/WaveImpactAsphaltCoverWaveConditionsCalculationActivity.cs =================================================================== diff -u -ra781a13dd85064216928827c3aefb35d9829e073 -r9a62e7ebcbf96a0455143740fc883704b2cc6eea --- Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Service/WaveImpactAsphaltCoverWaveConditionsCalculationActivity.cs (.../WaveImpactAsphaltCoverWaveConditionsCalculationActivity.cs) (revision a781a13dd85064216928827c3aefb35d9829e073) +++ Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Service/WaveImpactAsphaltCoverWaveConditionsCalculationActivity.cs (.../WaveImpactAsphaltCoverWaveConditionsCalculationActivity.cs) (revision 9a62e7ebcbf96a0455143740fc883704b2cc6eea) @@ -31,7 +31,7 @@ /// /// for running a wave impact asphalt cover wave conditions calculation. /// - public class WaveImpactAsphaltCoverWaveConditionsCalculationActivity : CalculatableActivity + internal class WaveImpactAsphaltCoverWaveConditionsCalculationActivity : CalculatableActivity { private readonly WaveImpactAsphaltCoverWaveConditionsCalculation calculation; private readonly string hlcdFilePath; Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Integration.Test/WaveImpactAsphaltCoverWaveConditionsCalculationActivityIntegrationTest.cs =================================================================== diff -u -ra781a13dd85064216928827c3aefb35d9829e073 -r9a62e7ebcbf96a0455143740fc883704b2cc6eea --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Integration.Test/WaveImpactAsphaltCoverWaveConditionsCalculationActivityIntegrationTest.cs (.../WaveImpactAsphaltCoverWaveConditionsCalculationActivityIntegrationTest.cs) (revision a781a13dd85064216928827c3aefb35d9829e073) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Integration.Test/WaveImpactAsphaltCoverWaveConditionsCalculationActivityIntegrationTest.cs (.../WaveImpactAsphaltCoverWaveConditionsCalculationActivityIntegrationTest.cs) (revision 9a62e7ebcbf96a0455143740fc883704b2cc6eea) @@ -57,18 +57,24 @@ public void Run_CalculationWithInvalidHydraulicBoundaryDatabaseFilePath_DoesNotPerformCalculationAndLogsError() { // Setup - IAssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(); - WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - string invalidFilePath = Path.Combine(testDataPath, "NonExisting.sqlite"); - var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + var assessmentSection = new AssessmentSectionStub(); + assessmentSection.HydraulicBoundaryDatabase.FilePath = invalidFilePath; - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - invalidFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); + var hydraulicBoundaryLocation = new TestHydraulicBoundaryLocation(); + assessmentSection.SetHydraulicBoundaryLocationCalculations(new[] + { + hydraulicBoundaryLocation + }); + WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(hydraulicBoundaryLocation); + + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); + var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); mockRepository.ReplayAll(); @@ -105,13 +111,11 @@ assessmentSection.HydraulicBoundaryDatabase.UsePreprocessor = true; assessmentSection.HydraulicBoundaryDatabase.PreprocessorDirectory = "InvalidPreprocessorDirectory"; - var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - validFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); - var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); mockRepository.ReplayAll(); @@ -146,13 +150,11 @@ assessmentSection.FailureMechanismContribution.LowerLimitNorm = 0.1; - var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - validFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); - var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); mockRepository.ReplayAll(); @@ -185,13 +187,11 @@ IAssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(); WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - validFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); - RoundedDouble[] waterLevels = GetWaterLevels(calculation, assessmentSection).ToArray(); int nrOfCalculators = waterLevels.Length; @@ -231,15 +231,13 @@ // Setup IAssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(); WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - calculation.InputParameters.BreakWater.Type = breakWaterType; var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - validFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity(calculation, + waveImpactAsphaltCoverFailureMechanism, + assessmentSection); var calculator = new TestWaveConditionsCosineCalculator(); RoundedDouble[] waterLevels = GetWaterLevels(calculation, assessmentSection).ToArray(); @@ -293,13 +291,11 @@ IAssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(); WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - validFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); - var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); calculatorFactory.Expect(cf => cf.CreateWaveConditionsCosineCalculator(testDataPath, string.Empty)).Return(new TestWaveConditionsCosineCalculator()); @@ -340,36 +336,63 @@ } [Test] - [TestCaseSource(typeof(HydraRingCalculatorTestCaseProvider), nameof(HydraRingCalculatorTestCaseProvider.GetCalculatorFailingConditions), new object[] + public void Run_WhenCanceled_OutputNull() { - nameof(Run_CalculationFailed_OutputNull) - })] - public void Run_CalculationFailed_OutputNull(bool endInFailure, string lastErrorFileContent) - { // Setup IAssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(); WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - validFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); + var mockRepository = new MockRepository(); + var calculatorFactory = mockRepository.StrictMock(); + calculatorFactory.Expect(cf => cf.CreateWaveConditionsCosineCalculator(testDataPath, string.Empty)).Return(new TestWaveConditionsCosineCalculator()); + mockRepository.ReplayAll(); - var calculator = new TestWaveConditionsCosineCalculator + using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) { - EndInFailure = endInFailure, - LastErrorFileContent = lastErrorFileContent - }; - int nrOfCalculators = GetWaterLevels(calculation, assessmentSection).Count(); + activity.ProgressChanged += (sender, args) => + { + if (activity.State != ActivityState.Canceled) + { + activity.Cancel(); + } + }; + activity.Run(); + + // Call + activity.Finish(); + + // Assert + Assert.AreEqual(ActivityState.Canceled, activity.State); + Assert.IsNull(calculation.Output); + } + + mockRepository.VerifyAll(); + } + + [Test] + public void Run_CalculationPerformed_SetsOutput() + { + // Setup + IAssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(); + WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); + + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); + var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); calculatorFactory.Expect(cf => cf.CreateWaveConditionsCosineCalculator(testDataPath, string.Empty)) - .Return(calculator) + .Return(new TestWaveConditionsCosineCalculator()) .Repeat - .Times(nrOfCalculators); + .Times(GetWaterLevels(calculation, assessmentSection).Count()); mockRepository.ReplayAll(); using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) @@ -378,7 +401,8 @@ activity.Run(); // Assert - Assert.IsNull(calculation.Output); + Assert.IsNotNull(calculation.Output); + Assert.AreEqual(3, calculation.Output.Items.Count()); } mockRepository.VerifyAll(); @@ -395,12 +419,11 @@ IAssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(); WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - var failureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, validFilePath, failureMechanism, assessmentSection); - - int nrOfCalculators = GetWaterLevels(calculation, assessmentSection).Count(); - var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); var calculator = new TestWaveConditionsCosineCalculator @@ -411,7 +434,7 @@ calculatorFactory.Expect(cf => cf.CreateWaveConditionsCosineCalculator(testDataPath, string.Empty)) .Return(calculator) .Repeat - .Times(nrOfCalculators); + .Times(GetWaterLevels(calculation, assessmentSection).Count()); mockRepository.ReplayAll(); using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) @@ -427,19 +450,54 @@ } [Test] - public void Run_HydraulicBoundaryDatabaseWithCanUsePreprocessorFalse_CreateWaveConditionsCosineCalculatorAsExpected() + [TestCaseSource(typeof(HydraRingCalculatorTestCaseProvider), nameof(HydraRingCalculatorTestCaseProvider.GetCalculatorFailingConditions), new object[] { + nameof(Run_CalculationFailed_OutputNull) + })] + public void Run_CalculationFailed_OutputNull(bool endInFailure, string lastErrorFileContent) + { // Setup IAssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(); WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - validFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); + var mockRepository = new MockRepository(); + var calculatorFactory = mockRepository.StrictMock(); + calculatorFactory.Expect(cf => cf.CreateWaveConditionsCosineCalculator(testDataPath, string.Empty)).Return(new TestWaveConditionsCosineCalculator + { + EndInFailure = endInFailure, + LastErrorFileContent = lastErrorFileContent + }).Repeat.Times(GetWaterLevels(calculation, assessmentSection).Count()); + mockRepository.ReplayAll(); + using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) + { + // Call + activity.Run(); + + // Assert + Assert.IsNull(calculation.Output); + } + + mockRepository.VerifyAll(); + } + + [Test] + public void Run_HydraulicBoundaryDatabaseWithCanUsePreprocessorFalse_CreateWaveConditionsCosineCalculatorAsExpected() + { + // Setup + IAssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(); + WaveImpactAsphaltCoverWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); + + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); + int nrOfCalculators = GetWaterLevels(calculation, assessmentSection).Count(); var mockRepository = new MockRepository(); @@ -471,20 +529,17 @@ assessmentSection.HydraulicBoundaryDatabase.UsePreprocessor = true; assessmentSection.HydraulicBoundaryDatabase.PreprocessorDirectory = validPreprocessorDirectory; - var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity( + calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - validFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); - int nrOfCalculators = GetWaterLevels(calculation, assessmentSection).Count(); - var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); calculatorFactory.Expect(cf => cf.CreateWaveConditionsCosineCalculator(testDataPath, validPreprocessorDirectory)) .Return(new TestWaveConditionsCosineCalculator()) .Repeat - .Times(nrOfCalculators); + .Times(GetWaterLevels(calculation, assessmentSection).Count()); mockRepository.ReplayAll(); using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) @@ -506,22 +561,18 @@ assessmentSection.HydraulicBoundaryDatabase.CanUsePreprocessor = true; assessmentSection.HydraulicBoundaryDatabase.UsePreprocessor = false; - assessmentSection.HydraulicBoundaryDatabase.PreprocessorDirectory = "NonExistingPreprocessorDirectory"; + assessmentSection.HydraulicBoundaryDatabase.PreprocessorDirectory = "InvalidPreprocessorDirectory"; - var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + CalculatableActivity activity = WaveImpactAsphaltCoverWaveConditionsCalculationActivityFactory.CreateCalculationActivity(calculation, + new WaveImpactAsphaltCoverFailureMechanism(), + assessmentSection); - var activity = new WaveImpactAsphaltCoverWaveConditionsCalculationActivity(calculation, - validFilePath, - waveImpactAsphaltCoverFailureMechanism, - assessmentSection); - int nrOfCalculators = GetWaterLevels(calculation, assessmentSection).Count(); - var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); calculatorFactory.Expect(cf => cf.CreateWaveConditionsCosineCalculator(testDataPath, string.Empty)) .Return(new TestWaveConditionsCosineCalculator()) .Repeat - .Times(nrOfCalculators); + .Times(GetWaterLevels(calculation, assessmentSection).Count()); mockRepository.ReplayAll(); using (new HydraRingCalculatorFactoryConfig(calculatorFactory))