Index: Ringtoets/Piping/src/Ringtoets.Piping.Calculation/PipingCalculator.cs =================================================================== diff -u -ra2675f58f4d57204df1b8378e9dc1134cd11186e -ree0616189b53da348c17a4cf75328425beaf360b --- Ringtoets/Piping/src/Ringtoets.Piping.Calculation/PipingCalculator.cs (.../PipingCalculator.cs) (revision a2675f58f4d57204df1b8378e9dc1134cd11186e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Calculation/PipingCalculator.cs (.../PipingCalculator.cs) (revision ee0616189b53da348c17a4cf75328425beaf360b) @@ -28,7 +28,6 @@ using EffectiveThicknessCalculator = Ringtoets.Piping.Calculation.SubCalculator.EffectiveThicknessCalculator; using HeaveCalculator = Ringtoets.Piping.Calculation.SubCalculator.HeaveCalculator; -using UpliftCalculator = Ringtoets.Piping.Calculation.SubCalculator.UpliftCalculator; namespace Ringtoets.Piping.Calculation { @@ -39,16 +38,28 @@ public class PipingCalculator { private readonly PipingCalculatorInput input; + private readonly PipingSubCalculatorFactory factory; /// /// Constructs a new . The is used to /// obtain the parameters used in the different sub calculations. /// /// The containing all the values required /// for performing a piping calculation. - public PipingCalculator(PipingCalculatorInput input) + /// + /// or is null. + public PipingCalculator(PipingCalculatorInput input, PipingSubCalculatorFactory factory) { + if (input == null) + { + throw new ArgumentNullException("input", "PipingCalculatorInput required for creating a PipingCalculator."); + } + if (factory == null) + { + throw new ArgumentNullException("factory", "PipingSubCalculatorFactory required for creating a PipingCalculator."); + } this.input = input; + this.factory = factory; } /// @@ -241,70 +252,62 @@ private IHeaveCalculator CreateHeaveCalculator() { - var calculator = new HeaveCalculator - { - Ich = input.CriticalHeaveGradient, - PhiExit = input.PiezometricHeadExit, - DTotal = input.ThicknessCoverageLayer, - PhiPolder = input.PiezometricHeadPolder, - RExit = input.DampingFactorExit, - HExit = input.PhreaticLevelExit - }; + var calculator = factory.CreateHeaveCalculator(); + calculator.Ich = input.CriticalHeaveGradient; + calculator.PhiExit = input.PiezometricHeadExit; + calculator.DTotal = input.ThicknessCoverageLayer; + calculator.PhiPolder = input.PiezometricHeadPolder; + calculator.RExit = input.DampingFactorExit; + calculator.HExit = input.PhreaticLevelExit; return calculator; } private IUpliftCalculator CreateUpliftCalculator(double effectiveStress) { - var calculator = new UpliftCalculator - { - VolumetricWeightOfWater = input.WaterVolumetricWeight, - ModelFactorUplift = input.UpliftModelFactor, - EffectiveStress = effectiveStress, - HRiver = input.AssessmentLevel, - PhiExit = input.PiezometricHeadExit, - RExit = input.DampingFactorExit, - HExit = input.PhreaticLevelExit, - PhiPolder = input.PiezometricHeadPolder - }; + var calculator = factory.CreateUpliftCalculator(); + calculator.VolumetricWeightOfWater = input.WaterVolumetricWeight; + calculator.ModelFactorUplift = input.UpliftModelFactor; + calculator.EffectiveStress = effectiveStress; + calculator.HRiver = input.AssessmentLevel; + calculator.PhiExit = input.PiezometricHeadExit; + calculator.RExit = input.DampingFactorExit; + calculator.HExit = input.PhreaticLevelExit; + calculator.PhiPolder = input.PiezometricHeadPolder; return calculator; } private ISellmeijerCalculator CreateSellmeijerCalculator() { - var calculator = new SellmeijerCalculator - { - ModelFactorPiping = input.SellmeijerModelFactor, - HRiver = input.AssessmentLevel, - HExit = input.PhreaticLevelExit, - Rc = input.SellmeijerReductionFactor, - DTotal = input.ThicknessCoverageLayer, - SeepageLength = input.SeepageLength, - GammaSubParticles = input.SandParticlesVolumicWeight, - WhitesDragCoefficient = input.WhitesDragCoefficient, - D70 = input.Diameter70, - VolumetricWeightOfWater = input.WaterVolumetricWeight, - DarcyPermeability = input.DarcyPermeability, - KinematicViscosityWater = input.WaterKinematicViscosity, - Gravity = input.Gravity, - DAquifer = input.ThicknessAquiferLayer, - D70Mean = input.MeanDiameter70, - BeddingAngle = input.BeddingAngle - }; + var calculator = factory.CreateSellmeijerCalculator(); + calculator.ModelFactorPiping = input.SellmeijerModelFactor; + calculator.HRiver = input.AssessmentLevel; + calculator.HExit = input.PhreaticLevelExit; + calculator.Rc = input.SellmeijerReductionFactor; + calculator.DTotal = input.ThicknessCoverageLayer; + calculator.SeepageLength = input.SeepageLength; + calculator.GammaSubParticles = input.SandParticlesVolumicWeight; + calculator.WhitesDragCoefficient = input.WhitesDragCoefficient; + calculator.D70 = input.Diameter70; + calculator.VolumetricWeightOfWater = input.WaterVolumetricWeight; + calculator.DarcyPermeability = input.DarcyPermeability; + calculator.KinematicViscosityWater = input.WaterKinematicViscosity; + calculator.Gravity = input.Gravity; + calculator.DAquifer = input.ThicknessAquiferLayer; + calculator.D70Mean = input.MeanDiameter70; + calculator.BeddingAngle = input.BeddingAngle; return calculator; } private IEffectiveThicknessCalculator CalculateEffectiveThickness() { try { - var calculator = new EffectiveThicknessCalculator - { - ExitPointXCoordinate = input.ExitPointXCoordinate, - PhreaticLevel = input.PhreaticLevelExit, - SoilProfile = PipingProfileCreator.Create(input.SoilProfile), - SurfaceLine = PipingSurfaceLineCreator.Create(input.SurfaceLine), - VolumicWeightOfWater = input.WaterVolumetricWeight - }; + var calculator = factory.CreateEffectiveThicknessCalculator(); + calculator.ExitPointXCoordinate = input.ExitPointXCoordinate; + calculator.PhreaticLevel = input.PhreaticLevelExit; + calculator.SoilProfile = PipingProfileCreator.Create(input.SoilProfile); + calculator.SurfaceLine = PipingSurfaceLineCreator.Create(input.SurfaceLine); + calculator.VolumicWeightOfWater = input.WaterVolumetricWeight; calculator.Calculate(); return calculator; } Index: Ringtoets/Piping/src/Ringtoets.Piping.Calculation/Ringtoets.Piping.Calculation.csproj =================================================================== diff -u -ra2675f58f4d57204df1b8378e9dc1134cd11186e -ree0616189b53da348c17a4cf75328425beaf360b --- Ringtoets/Piping/src/Ringtoets.Piping.Calculation/Ringtoets.Piping.Calculation.csproj (.../Ringtoets.Piping.Calculation.csproj) (revision a2675f58f4d57204df1b8378e9dc1134cd11186e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Calculation/Ringtoets.Piping.Calculation.csproj (.../Ringtoets.Piping.Calculation.csproj) (revision ee0616189b53da348c17a4cf75328425beaf360b) @@ -70,6 +70,7 @@ + Index: Ringtoets/Piping/src/Ringtoets.Piping.Calculation/SubCalculator/IPipingSubCalculatorFactory.cs =================================================================== diff -u -ra2675f58f4d57204df1b8378e9dc1134cd11186e -ree0616189b53da348c17a4cf75328425beaf360b --- Ringtoets/Piping/src/Ringtoets.Piping.Calculation/SubCalculator/IPipingSubCalculatorFactory.cs (.../IPipingSubCalculatorFactory.cs) (revision a2675f58f4d57204df1b8378e9dc1134cd11186e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Calculation/SubCalculator/IPipingSubCalculatorFactory.cs (.../IPipingSubCalculatorFactory.cs) (revision ee0616189b53da348c17a4cf75328425beaf360b) @@ -1,9 +1,32 @@ namespace Ringtoets.Piping.Calculation.SubCalculator { + /// + /// Factory responsible for creating the sub calculators required for a piping calculation. + /// public interface IPipingSubCalculatorFactory { + /// + /// Creates the uplift calculator. + /// + /// A new . IUpliftCalculator CreateUpliftCalculator(); + + /// + /// Creates the heave calculator. + /// + /// A new . IHeaveCalculator CreateHeaveCalculator(); + + /// + /// Creates the Sellmeijer calculator. + /// + /// A new . ISellmeijerCalculator CreateSellmeijerCalculator(); + + /// + /// Creates the effective thickness calculator. + /// + /// A new . + IEffectiveThicknessCalculator CreateEffectiveThicknessCalculator(); } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Calculation/SubCalculator/PipingSubCalculatorFactory.cs =================================================================== diff -u --- Ringtoets/Piping/src/Ringtoets.Piping.Calculation/SubCalculator/PipingSubCalculatorFactory.cs (revision 0) +++ Ringtoets/Piping/src/Ringtoets.Piping.Calculation/SubCalculator/PipingSubCalculatorFactory.cs (revision ee0616189b53da348c17a4cf75328425beaf360b) @@ -0,0 +1,28 @@ +namespace Ringtoets.Piping.Calculation.SubCalculator +{ + /// + /// Factory which creates the sub calculators from the piping kernel. + /// + public class PipingSubCalculatorFactory : IPipingSubCalculatorFactory + { + public IUpliftCalculator CreateUpliftCalculator() + { + return new UpliftCalculator(); + } + + public IHeaveCalculator CreateHeaveCalculator() + { + return new HeaveCalculator(); + } + + public ISellmeijerCalculator CreateSellmeijerCalculator() + { + return new SellmeijerCalculator(); + } + + public IEffectiveThicknessCalculator CreateEffectiveThicknessCalculator() + { + return new EffectiveThicknessCalculator(); + } + } +} \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs =================================================================== diff -u -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f -ree0616189b53da348c17a4cf75328425beaf360b --- Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision ee0616189b53da348c17a4cf75328425beaf360b) @@ -24,6 +24,7 @@ using log4net; using Ringtoets.Piping.Calculation; +using Ringtoets.Piping.Calculation.SubCalculator; using Ringtoets.Piping.Data; using Ringtoets.Piping.Service.Properties; @@ -37,6 +38,7 @@ public static class PipingCalculationService { private static readonly ILog pipingCalculationLogger = LogManager.GetLogger(typeof(PipingCalculation)); + private static readonly PipingSubCalculatorFactory subCalculatorFactory = new PipingSubCalculatorFactory(); /// /// Performs validation over the values on the given . Error and status information is logged during @@ -49,7 +51,7 @@ pipingCalculationLogger.Info(String.Format(Resources.Validation_Subject_0_started_Time_1_, calculation.Name, DateTimeService.CurrentTimeAsString)); - var validationResults = new PipingCalculator(CreateInputFromData(calculation.InputParameters)).Validate(); + var validationResults = new PipingCalculator(CreateInputFromData(calculation.InputParameters), subCalculatorFactory).Validate(); LogMessagesAsError(Resources.Error_in_piping_validation_0, validationResults.ToArray()); pipingCalculationLogger.Info(String.Format(Resources.Validation_Subject_0_ended_Time_1_, @@ -72,7 +74,7 @@ try { - var pipingResult = new PipingCalculator(CreateInputFromData(calculation.InputParameters)).Calculate(); + var pipingResult = new PipingCalculator(CreateInputFromData(calculation.InputParameters), subCalculatorFactory).Calculate(); calculation.Output = new PipingOutput(pipingResult.UpliftZValue, pipingResult.UpliftFactorOfSafety, @@ -113,7 +115,7 @@ /// public static double CalculateThicknessCoverageLayer(PipingInput input) { - return new PipingCalculator(CreateInputFromData(input)).CalculateThicknessCoverageLayer(); + return new PipingCalculator(CreateInputFromData(input), subCalculatorFactory).CalculateThicknessCoverageLayer(); } private static PipingCalculatorInput CreateInputFromData(PipingInput inputParameters) Index: Ringtoets/Piping/test/Ringtoets.Piping.Calculation.Test/PipingCalculatorTest.cs =================================================================== diff -u -ra887863a3992744a394591e17072811eb9478ebc -ree0616189b53da348c17a4cf75328425beaf360b --- Ringtoets/Piping/test/Ringtoets.Piping.Calculation.Test/PipingCalculatorTest.cs (.../PipingCalculatorTest.cs) (revision a887863a3992744a394591e17072811eb9478ebc) +++ Ringtoets/Piping/test/Ringtoets.Piping.Calculation.Test/PipingCalculatorTest.cs (.../PipingCalculatorTest.cs) (revision ee0616189b53da348c17a4cf75328425beaf360b) @@ -3,9 +3,9 @@ using System.Linq; using Core.Common.Base.Data; - +using Core.Common.TestUtil; using NUnit.Framework; - +using Ringtoets.Piping.Calculation.SubCalculator; using Ringtoets.Piping.Calculation.TestUtil; using Ringtoets.Piping.Data; @@ -15,12 +15,35 @@ public class PipingCalculatorTest { [Test] + public void Constructor_WithoutInput_ArgumentNullException() + { + // Call + TestDelegate call = () => new PipingCalculator(null, null); + + // Assert + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, "PipingCalculatorInput required for creating a PipingCalculator."); + } + + [Test] + public void Constructor_FactoryNull_ArgumentNullException() + { + // Call + TestDelegate call = () => new PipingCalculator(new TestPipingInput().AsRealInput(), null); + + // Assert + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, "PipingSubCalculatorFactory required for creating a PipingCalculator."); + } + + [Test] public void Calculate_CompleteValidInput_ReturnsResultWithNoNaN() { + // Setup PipingCalculatorInput input = new TestPipingInput().AsRealInput(); - PipingCalculatorResult actual = new PipingCalculator(input).Calculate(); + // Call + PipingCalculatorResult actual = new PipingCalculator(input, new PipingSubCalculatorFactory()).Calculate(); + // Assert Assert.IsNotNull(actual); Assert.IsFalse(double.IsNaN(actual.UpliftZValue)); Assert.IsFalse(double.IsNaN(actual.UpliftFactorOfSafety)); @@ -35,7 +58,7 @@ { // Setup PipingCalculatorInput input = new TestPipingInput().AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -56,7 +79,7 @@ SeepageLength = seepageLength }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -78,7 +101,7 @@ ThicknessAquiferLayer = aquiferThickness }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -99,7 +122,7 @@ BeddingAngle = beddingAngle }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -121,7 +144,7 @@ PhreaticLevelExit = level }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -141,7 +164,7 @@ DampingFactorExit = 0 }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -160,7 +183,7 @@ ThicknessCoverageLayer = 0 }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -179,7 +202,7 @@ ThicknessAquiferLayer = 0 }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -198,7 +221,7 @@ WaterVolumetricWeight = 0 }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -224,7 +247,7 @@ ThicknessCoverageLayer = thicknessCoverageLayer }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -243,7 +266,7 @@ SurfaceLine = null, }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -262,7 +285,7 @@ SoilProfile = null, }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -284,7 +307,7 @@ }) }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -310,7 +333,7 @@ }) }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); @@ -333,7 +356,7 @@ ThicknessCoverageLayer = 0 }.AsRealInput(); - var calculation = new PipingCalculator(input); + var calculation = new PipingCalculator(input, new PipingSubCalculatorFactory()); // Call List validationMessages = calculation.Validate(); Index: Ringtoets/Piping/test/Ringtoets.Piping.Calculation.Test/SubCalculator/PipingSubCalculatorFactoryTest.cs =================================================================== diff -u -ra2675f58f4d57204df1b8378e9dc1134cd11186e -ree0616189b53da348c17a4cf75328425beaf360b --- Ringtoets/Piping/test/Ringtoets.Piping.Calculation.Test/SubCalculator/PipingSubCalculatorFactoryTest.cs (.../PipingSubCalculatorFactoryTest.cs) (revision a2675f58f4d57204df1b8378e9dc1134cd11186e) +++ Ringtoets/Piping/test/Ringtoets.Piping.Calculation.Test/SubCalculator/PipingSubCalculatorFactoryTest.cs (.../PipingSubCalculatorFactoryTest.cs) (revision ee0616189b53da348c17a4cf75328425beaf360b) @@ -1,19 +1,71 @@ using NUnit.Framework; +using Ringtoets.Piping.Calculation.SubCalculator; namespace Ringtoets.Piping.Calculation.Test.SubCalculator { [TestFixture] public class PipingSubCalculatorFactoryTest { [Test] - public void CreateHeaveCalculator_WithInput_CreatesHeaveCalculatorInstance() + public void Constructor_ReturnsNewInstance() { + // Call + var factory = new PipingSubCalculatorFactory(); + + // Assert + Assert.IsInstanceOf(factory); + } + + [Test] + public void CreateHeaveCalculator_WithInput_NewHeaveCalculator() + { // Setup + var factory = new PipingSubCalculatorFactory(); // Call + var calculator = factory.CreateHeaveCalculator(); // Assert + Assert.IsInstanceOf(calculator); + } + [Test] + public void CreateUpliftCalculator_WithInput_NewUpliftCalculator() + { + // Setup + var factory = new PipingSubCalculatorFactory(); + + // Call + var calculator = factory.CreateUpliftCalculator(); + + // Assert + Assert.IsInstanceOf(calculator); } + + [Test] + public void CreateSellmeijerCalculator_WithInput_NewSellmeijerCalculator() + { + // Setup + var factory = new PipingSubCalculatorFactory(); + + // Call + var calculator = factory.CreateSellmeijerCalculator(); + + // Assert + Assert.IsInstanceOf(calculator); + } + + [Test] + public void CreateEffectiveThicknessCalculator_WithInput_NewSellmeijerCalculator() + { + // Setup + var factory = new PipingSubCalculatorFactory(); + + // Call + var calculator = factory.CreateEffectiveThicknessCalculator(); + + // Assert + Assert.IsInstanceOf(calculator); + } } } \ No newline at end of file