// Copyright (C) Stichting Deltares 2017. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using System.Linq; using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Core.Common.TestUtil; using log4net.Core; using NUnit.Framework; using Ringtoets.Common.Data.TestUtil; using Ringtoets.Common.Service.TestUtil; using Ringtoets.MacroStabilityInwards.CalculatedInput.TestUtil; using Ringtoets.MacroStabilityInwards.Data; using Ringtoets.MacroStabilityInwards.Data.SoilProfile; using Ringtoets.MacroStabilityInwards.Data.TestUtil; using Ringtoets.MacroStabilityInwards.KernelWrapper.Calculators; using Ringtoets.MacroStabilityInwards.KernelWrapper.Calculators.Input; using Ringtoets.MacroStabilityInwards.KernelWrapper.Calculators.UpliftVan; using Ringtoets.MacroStabilityInwards.KernelWrapper.Calculators.UpliftVan.Input; using Ringtoets.MacroStabilityInwards.KernelWrapper.Calculators.UpliftVan.Output; using Ringtoets.MacroStabilityInwards.KernelWrapper.TestUtil.Calculators; using Ringtoets.MacroStabilityInwards.Primitives; namespace Ringtoets.MacroStabilityInwards.Service.Test { [TestFixture] public class MacroStabilityInwardsCalculationServiceTest { private MacroStabilityInwardsCalculationScenario testCalculation; [SetUp] public void Setup() { testCalculation = MacroStabilityInwardsCalculationScenarioFactory.CreateMacroStabilityInwardsCalculationScenarioWithValidInput(); testCalculation.Name = ""; } [Test] public void Validate_CalculationNull_ThrowArgumentNullException() { // Call TestDelegate test = () => MacroStabilityInwardsCalculationService.Validate(null); // Assert var exception = Assert.Throws(test); Assert.AreEqual("calculation", exception.ParamName); } [Test] public void Validate_Always_LogStartAndEndOfValidatingInputs() { // Setup using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Call Action call = () => MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[1]); }); } } [Test] public void Validate_InvalidCalculationWithOutput_ReturnsFalseNoOutputChange() { // Setup MacroStabilityInwardsOutput output = MacroStabilityInwardsOutputTestFactory.CreateOutput(); MacroStabilityInwardsCalculation invalidMacroStabilityInwardsCalculation = MacroStabilityInwardsCalculationScenarioFactory.CreateMacroStabilityInwardsCalculationScenarioWithInvalidInput(); invalidMacroStabilityInwardsCalculation.Output = output; // Call bool isValid = MacroStabilityInwardsCalculationService.Validate(invalidMacroStabilityInwardsCalculation); // Assert Assert.IsFalse(isValid); Assert.AreSame(output, invalidMacroStabilityInwardsCalculation.Output); } [Test] public void Validate_InvalidCalculationInput_LogsErrorAndReturnsFalse() { // Setup var calculation = new MacroStabilityInwardsCalculation { Name = "" }; var isValid = false; // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(calculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(5, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("Er is geen hydraulische randvoorwaardenlocatie geselecteerd.", msgs[1]); Assert.AreEqual("Er is geen profielschematisatie geselecteerd.", msgs[2]); Assert.AreEqual("Er is geen ondergrondschematisatie geselecteerd.", msgs[3]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[4]); }); Assert.IsFalse(isValid); } [Test] public void Validate_HydraulicBoundaryLocationNotCalculated_LogsErrorAndReturnsFalse() { // Setup testCalculation.InputParameters.HydraulicBoundaryLocation = new TestHydraulicBoundaryLocation(); testCalculation.InputParameters.UseAssessmentLevelManualInput = false; var isValid = false; // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("Kan het toetspeil niet afleiden op basis van de invoer.", msgs[1]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[2]); }); Assert.IsFalse(isValid); } [Test] [TestCase(double.NaN)] [TestCase(double.NegativeInfinity)] [TestCase(double.PositiveInfinity)] public void Validate_InvalidManualAssessmentLevel_LogsErrorAndReturnsFalse(double assessmentLevel) { // Setup testCalculation.InputParameters.UseAssessmentLevelManualInput = true; testCalculation.InputParameters.AssessmentLevel = (RoundedDouble) assessmentLevel; var isValid = false; // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("De waarde voor 'toetspeil' moet een concreet getal zijn.", msgs[1]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[2]); }); Assert.IsFalse(isValid); } [Test] public void Validate_WithoutSurfaceLine_LogsErrorAndReturnsFalse() { // Setup testCalculation.InputParameters.SurfaceLine = null; var isValid = false; // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("Er is geen profielschematisatie geselecteerd.", msgs[1]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[2]); }); Assert.IsFalse(isValid); } [Test] public void Validate_WithoutStochasticSoilProfile_LogsErrorAndReturnsFalse() { // Setup testCalculation.InputParameters.StochasticSoilProfile = null; var isValid = false; // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("Er is geen ondergrondschematisatie geselecteerd.", msgs[1]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[2]); }); Assert.IsFalse(isValid); } [Test] [TestCase(0.06)] [TestCase(1)] public void Validate_SoilProfile1DTopDoesNotExceedSurfaceLineTop_LogsErrorAndReturnsFalse(double differenceFromTop) { // Setup const double surfaceLineTop = 5.0; testCalculation.Name = "Top of soil layer does not exceed top of surface line"; var stochasticSoilProfile = new MacroStabilityInwardsStochasticSoilProfile(1, new MacroStabilityInwardsSoilProfile1D("profile", 0.0, new[] { new MacroStabilityInwardsSoilLayer1D(surfaceLineTop - differenceFromTop) })); var surfaceLine = new MacroStabilityInwardsSurfaceLine("Test"); var firstCharacteristicPointLocation = new Point3D(0.1, 0.0, 0.0); var secondCharacteristicPointLocation = new Point3D(0.2, 0.0, 1.0); var thirdCharacteristicPointLocation = new Point3D(0.3, 0.0, 2.0); var fourthCharacteristicPointLocation = new Point3D(0.4, 0.0, 3.0); var fifthCharacteristicPointLocation = new Point3D(0.5, 0.0, 4.0); var sixthCharacteristicPointLocation = new Point3D(0.6, 0.0, surfaceLineTop); surfaceLine.SetGeometry(new[] { firstCharacteristicPointLocation, secondCharacteristicPointLocation, thirdCharacteristicPointLocation, fourthCharacteristicPointLocation, fifthCharacteristicPointLocation, sixthCharacteristicPointLocation }); surfaceLine.SetSurfaceLevelOutsideAt(firstCharacteristicPointLocation); surfaceLine.SetDikeToeAtRiverAt(secondCharacteristicPointLocation); surfaceLine.SetDikeTopAtRiverAt(thirdCharacteristicPointLocation); surfaceLine.SetDikeTopAtPolderAt(fourthCharacteristicPointLocation); surfaceLine.SetDikeToeAtPolderAt(fifthCharacteristicPointLocation); surfaceLine.SetSurfaceLevelInsideAt(sixthCharacteristicPointLocation); testCalculation.InputParameters.StochasticSoilProfile = stochasticSoilProfile; testCalculation.InputParameters.SurfaceLine = surfaceLine; var isValid = true; using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("De ondergrondschematisatie moet boven de profielschematisatie liggen.", msgs[1]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[2]); }); Assert.IsFalse(isValid); } } [Test] [TestCase(0.05)] [TestCase(0)] [TestCase(-1)] public void Validate_SoilProfile1DTopExceedsSurfaceLineTop_ReturnsTrue(double differenceFromTop) { // Setup const double surfaceLineTop = 5.0; testCalculation.Name = "Top of soil layer < top of surface line"; var stochasticSoilProfile = new MacroStabilityInwardsStochasticSoilProfile(1, new MacroStabilityInwardsSoilProfile1D("profile", 0.0, new[] { new MacroStabilityInwardsSoilLayer1D(surfaceLineTop - differenceFromTop) })); var surfaceLine = new MacroStabilityInwardsSurfaceLine("Test"); var firstCharacteristicPointLocation = new Point3D(0.1, 0.0, 0.0); var secondCharacteristicPointLocation = new Point3D(0.2, 0.0, 1.0); var thirdCharacteristicPointLocation = new Point3D(0.3, 0.0, 2.0); var fourthCharacteristicPointLocation = new Point3D(0.4, 0.0, 3.0); var fifthCharacteristicPointLocation = new Point3D(0.5, 0.0, 4.0); var sixthCharacteristicPointLocation = new Point3D(0.6, 0.0, surfaceLineTop); surfaceLine.SetGeometry(new[] { firstCharacteristicPointLocation, secondCharacteristicPointLocation, thirdCharacteristicPointLocation, fourthCharacteristicPointLocation, fifthCharacteristicPointLocation, sixthCharacteristicPointLocation }); surfaceLine.SetSurfaceLevelOutsideAt(firstCharacteristicPointLocation); surfaceLine.SetDikeToeAtRiverAt(secondCharacteristicPointLocation); surfaceLine.SetDikeTopAtRiverAt(thirdCharacteristicPointLocation); surfaceLine.SetDikeTopAtPolderAt(fourthCharacteristicPointLocation); surfaceLine.SetDikeToeAtPolderAt(fifthCharacteristicPointLocation); surfaceLine.SetSurfaceLevelInsideAt(sixthCharacteristicPointLocation); testCalculation.InputParameters.StochasticSoilProfile = stochasticSoilProfile; testCalculation.InputParameters.SurfaceLine = surfaceLine; var isValid = false; using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(2, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[1]); }); Assert.IsTrue(isValid); } } [Test] [TestCaseSource(nameof(SurfacelineNotOnMacroStabilityInwardsSoilProfile2D))] public void Validate_SurfaceLineNotNear2DProfile_LogsErrorAndReturnsFalse(MacroStabilityInwardsSoilProfile2D soilProfile) { // Setup testCalculation.Name = "calculation name"; var surfaceLine = new MacroStabilityInwardsSurfaceLine("Test"); surfaceLine.SetGeometry(new[] { new Point3D(0, 0.0, 10), new Point3D(1, 0.0, 20), new Point3D(2, 0.0, 10) }); testCalculation.InputParameters.StochasticSoilProfile = new MacroStabilityInwardsStochasticSoilProfile(0.0, soilProfile); testCalculation.InputParameters.SurfaceLine = surfaceLine; var isValid = true; using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("De profielschematisatie moet op de ondergrondschematisatie liggen.", msgs[1]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[2]); }); Assert.IsFalse(isValid); } } [Test] [TestCaseSource(nameof(SurfaceLineOnMacroStabilityInwardsSoilProfile2D))] public void Validate_SurfaceLineNear2DProfile_ReturnsTrue(MacroStabilityInwardsSoilProfile2D soilProfile) { // Setup testCalculation.Name = "calculation name"; var surfaceLine = new MacroStabilityInwardsSurfaceLine("Test"); surfaceLine.SetGeometry(new[] { new Point3D(0.0, 0.0, 10), new Point3D(0.1, 0.0, 20), new Point3D(0.2, 0.0, 10) }); testCalculation.InputParameters.StochasticSoilProfile = new MacroStabilityInwardsStochasticSoilProfile(0.0, soilProfile); testCalculation.InputParameters.SurfaceLine = surfaceLine; var isValid = false; using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(2, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[1]); }); Assert.IsTrue(isValid); } } [Test] public void Validate_KernelReturnsValidationError_LogsErrorAndReturnsFalse() { // Setup var isValid = false; using (new MacroStabilityInwardsCalculatorFactoryConfig()) { var calculator = (TestMacroStabilityInwardsCalculatorFactory)MacroStabilityInwardsCalculatorFactory.Instance; calculator.LastCreatedUpliftVanCalculator.ReturnValidationError = true; // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("Validation Error", msgs[1]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[2]); }); Assert.IsFalse(isValid); } } [Test] public void Validate_KernelReturnsValidationWarning_LogsWarningAndReturnsTrue() { // Setup var isValid = false; using (new MacroStabilityInwardsCalculatorFactoryConfig()) { var calculator = (TestMacroStabilityInwardsCalculatorFactory)MacroStabilityInwardsCalculatorFactory.Instance; calculator.LastCreatedUpliftVanCalculator.ReturnValidationWarning = true; // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("Validation Warning", msgs[1]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[2]); }); Assert.IsTrue(isValid); } } [Test] public void Validate_KernelReturnsValidationErrorAndWarning_LogsErrorAndWarningAndReturnsFalse() { // Setup var isValid = false; using (new MacroStabilityInwardsCalculatorFactoryConfig()) { var calculator = (TestMacroStabilityInwardsCalculatorFactory)MacroStabilityInwardsCalculatorFactory.Instance; calculator.LastCreatedUpliftVanCalculator.ReturnValidationWarning = true; calculator.LastCreatedUpliftVanCalculator.ReturnValidationError = true; // Call Action call = () => isValid = MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(4, msgs.Length); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); Assert.AreEqual("Validation Error", msgs[1]); Assert.AreEqual("Validation Warning", msgs[2]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[3]); }); Assert.IsFalse(isValid); } } [Test] public void Validate_ErrorWhileValidating_LogErrorMessage() { // Setup using (new MacroStabilityInwardsCalculatorFactoryConfig()) { var calculatorFactory = (TestMacroStabilityInwardsCalculatorFactory) MacroStabilityInwardsCalculatorFactory.Instance; calculatorFactory.LastCreatedUpliftVanCalculator.ThrowExceptionOnValidate = true; // Call Action call = () => MacroStabilityInwardsCalculationService.Validate(testCalculation); // Assert TestHelper.AssertLogMessagesWithLevelAndLoggedExceptions(call, tuples => { Tuple tuple = tuples.ElementAt(1); Assert.AreEqual("Macrostabiliteit binnenwaarts validatie mislukt.", tuple.Item1); Assert.AreEqual(Level.Error, tuple.Item2); Assert.IsInstanceOf(tuple.Item3); }); } } [Test] public void Calculate_CalculationNull_ThrowArgumentNullException() { // Call TestDelegate test = () => MacroStabilityInwardsCalculationService.Calculate(null); // Assert var exception = Assert.Throws(test); Assert.AreEqual("calculation", exception.ParamName); } [Test] public void Calculate_ValidCalculation_LogStartAndEndOfValidatingInputsAndCalculation() { // Setup using (new MacroStabilityInwardsCalculatorFactoryConfig()) { Action call = () => { // Precondition Assert.IsTrue(MacroStabilityInwardsCalculationService.Validate(testCalculation)); // Call MacroStabilityInwardsCalculationService.Calculate(testCalculation); }; // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); CalculationServiceTestHelper.AssertValidationStartMessage(msgs[0]); CalculationServiceTestHelper.AssertValidationEndMessage(msgs[1]); CalculationServiceTestHelper.AssertCalculationStartMessage(msgs[2]); CalculationServiceTestHelper.AssertCalculationEndMessage(msgs[3]); }); } } [Test] public void Calculate_ValidCalculationWithOutput_ShouldChangeOutput() { // Setup MacroStabilityInwardsOutput output = MacroStabilityInwardsOutputTestFactory.CreateOutput(); testCalculation.Output = output; using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Precondition Assert.IsTrue(MacroStabilityInwardsCalculationService.Validate(testCalculation)); // Call MacroStabilityInwardsCalculationService.Calculate(testCalculation); // Assert Assert.AreNotSame(output, testCalculation.Output); } } [Test] public void Calculate_CompleteInput_SetsInputOnCalculator() { // Setup using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Call MacroStabilityInwardsCalculationService.Calculate(testCalculation); // Assert AssertInput(testCalculation.InputParameters, (TestMacroStabilityInwardsCalculatorFactory) MacroStabilityInwardsCalculatorFactory.Instance); } } [Test] public void Calculate_DrainageConstructionPresentFalse_SetsInputOnCalculator() { // Setup var random = new Random(11); MacroStabilityInwardsInput inputParameters = testCalculation.InputParameters; inputParameters.DrainageConstructionPresent = false; inputParameters.XCoordinateDrainageConstruction = random.NextRoundedDouble(); inputParameters.ZCoordinateDrainageConstruction = random.NextRoundedDouble(); using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Call MacroStabilityInwardsCalculationService.Calculate(testCalculation); // Assert UpliftVanCalculatorInput actualInput = ((TestMacroStabilityInwardsCalculatorFactory) MacroStabilityInwardsCalculatorFactory.Instance) .LastCreatedUpliftVanCalculator.Input; Assert.IsFalse(actualInput.DrainageConstruction.IsPresent); Assert.IsNaN(actualInput.DrainageConstruction.XCoordinate); Assert.IsNaN(actualInput.DrainageConstruction.ZCoordinate); } } [Test] public void Calculate_UseDefaultOffsetsTrue_SetsInputOnCalculator() { // Setup var random = new Random(11); MacroStabilityInwardsInput inputParameters = testCalculation.InputParameters; inputParameters.LocationInputExtreme.UseDefaultOffsets = true; inputParameters.LocationInputExtreme.PhreaticLineOffsetBelowDikeToeAtPolder = random.NextRoundedDouble(); inputParameters.LocationInputExtreme.PhreaticLineOffsetBelowDikeTopAtPolder = random.NextRoundedDouble(); inputParameters.LocationInputExtreme.PhreaticLineOffsetBelowDikeTopAtRiver = random.NextRoundedDouble(); inputParameters.LocationInputExtreme.PhreaticLineOffsetBelowShoulderBaseInside = random.NextRoundedDouble(); inputParameters.LocationInputDaily.UseDefaultOffsets = true; inputParameters.LocationInputDaily.PhreaticLineOffsetBelowDikeToeAtPolder = random.NextRoundedDouble(); inputParameters.LocationInputDaily.PhreaticLineOffsetBelowDikeTopAtPolder = random.NextRoundedDouble(); inputParameters.LocationInputDaily.PhreaticLineOffsetBelowDikeTopAtRiver = random.NextRoundedDouble(); inputParameters.LocationInputDaily.PhreaticLineOffsetBelowShoulderBaseInside = random.NextRoundedDouble(); using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Call MacroStabilityInwardsCalculationService.Calculate(testCalculation); // Assert UpliftVanCalculatorInput actualInput = ((TestMacroStabilityInwardsCalculatorFactory) MacroStabilityInwardsCalculatorFactory.Instance) .LastCreatedUpliftVanCalculator.Input; Assert.IsTrue(actualInput.PhreaticLineOffsetsExtreme.UseDefaults); Assert.IsNaN(actualInput.PhreaticLineOffsetsExtreme.BelowDikeToeAtPolder); Assert.IsNaN(actualInput.PhreaticLineOffsetsExtreme.BelowDikeTopAtPolder); Assert.IsNaN(actualInput.PhreaticLineOffsetsExtreme.BelowDikeTopAtRiver); Assert.IsNaN(actualInput.PhreaticLineOffsetsExtreme.BelowShoulderBaseInside); Assert.IsTrue(actualInput.PhreaticLineOffsetsDaily.UseDefaults); Assert.IsNaN(actualInput.PhreaticLineOffsetsDaily.BelowDikeToeAtPolder); Assert.IsNaN(actualInput.PhreaticLineOffsetsDaily.BelowDikeTopAtPolder); Assert.IsNaN(actualInput.PhreaticLineOffsetsDaily.BelowDikeTopAtRiver); Assert.IsNaN(actualInput.PhreaticLineOffsetsDaily.BelowShoulderBaseInside); } } [Test] public void Calculate_GridDeterminationTypeAutomatic_SetsInputOnCalculator() { // Setup var random = new Random(11); MacroStabilityInwardsInput inputParameters = testCalculation.InputParameters; inputParameters.GridDeterminationType = MacroStabilityInwardsGridDeterminationType.Automatic; inputParameters.TangentLineZTop = random.NextRoundedDouble(2.0, 3.0); inputParameters.TangentLineZBottom = random.NextRoundedDouble(0.0, 1.0); inputParameters.TangentLineNumber = random.Next(1, 51); inputParameters.LeftGrid.XLeft = random.NextRoundedDouble(0.0, 1.0); inputParameters.LeftGrid.XRight = random.NextRoundedDouble(2.0, 3.0); inputParameters.LeftGrid.ZTop = random.NextRoundedDouble(2.0, 3.0); inputParameters.LeftGrid.ZBottom = random.NextRoundedDouble(0.0, 1.0); inputParameters.LeftGrid.NumberOfHorizontalPoints = random.Next(1, 100); inputParameters.LeftGrid.NumberOfVerticalPoints = random.Next(1, 100); inputParameters.RightGrid.XLeft = random.NextRoundedDouble(0.0, 1.0); inputParameters.RightGrid.XRight = random.NextRoundedDouble(2.0, 3.0); inputParameters.RightGrid.ZTop = random.NextRoundedDouble(2.0, 3.0); inputParameters.RightGrid.ZBottom = random.NextRoundedDouble(0.0, 1.0); inputParameters.RightGrid.NumberOfHorizontalPoints = random.Next(1, 100); inputParameters.RightGrid.NumberOfVerticalPoints = random.Next(1, 100); using (new MacroStabilityInwardsCalculatorFactoryConfig()) { // Call MacroStabilityInwardsCalculationService.Calculate(testCalculation); // Assert UpliftVanCalculatorInput actualInput = ((TestMacroStabilityInwardsCalculatorFactory) MacroStabilityInwardsCalculatorFactory.Instance) .LastCreatedUpliftVanCalculator.Input; Assert.IsTrue(actualInput.SlipPlane.GridAutomaticDetermined); Assert.IsNull(actualInput.SlipPlane.LeftGrid); Assert.IsNull(actualInput.SlipPlane.RightGrid); Assert.IsTrue(actualInput.SlipPlane.TangentLinesAutomaticAtBoundaries); Assert.IsNaN(actualInput.SlipPlane.TangentZTop); Assert.IsNaN(actualInput.SlipPlane.TangentZBottom); Assert.AreEqual(0, actualInput.SlipPlane.TangentLineNumber); } } [Test] public void Calculate_CalculationRan_SetOutput() { // Setup using (new MacroStabilityInwardsCalculatorFactoryConfig()) { var calculatorFactory = (TestMacroStabilityInwardsCalculatorFactory) MacroStabilityInwardsCalculatorFactory.Instance; // Precondition Assert.IsTrue(MacroStabilityInwardsCalculationService.Validate(testCalculation)); // Call MacroStabilityInwardsCalculationService.Calculate(testCalculation); // Assert AssertOutput(calculatorFactory.LastCreatedUpliftVanCalculator.Output, testCalculation.Output); } } [Test] public void Calculate_ErrorWhileCalculating_LogErrorMessageAndThrowException() { // Setup using (new MacroStabilityInwardsCalculatorFactoryConfig()) { var calculatorFactory = (TestMacroStabilityInwardsCalculatorFactory) MacroStabilityInwardsCalculatorFactory.Instance; calculatorFactory.LastCreatedUpliftVanCalculator.ThrowExceptionOnCalculate = true; // Precondition Assert.IsTrue(MacroStabilityInwardsCalculationService.Validate(testCalculation)); var exceptionThrown = false; // Call Action call = () => { try { MacroStabilityInwardsCalculationService.Calculate(testCalculation); } catch (UpliftVanCalculatorException) { exceptionThrown = true; } }; // Assert TestHelper.AssertLogMessagesWithLevelAndLoggedExceptions(call, tuples => { Tuple[] messages = tuples as Tuple[] ?? tuples.ToArray(); Assert.AreEqual(3, messages.Length); CalculationServiceTestHelper.AssertCalculationStartMessage(messages[0].Item1); Tuple tuple1 = messages[1]; Assert.AreEqual("Macrostabiliteit binnenwaarts berekening mislukt.", tuple1.Item1); Assert.AreEqual(Level.Error, tuple1.Item2); Assert.IsInstanceOf(tuple1.Item3); CalculationServiceTestHelper.AssertCalculationEndMessage(messages[2].Item1); }); Assert.IsTrue(exceptionThrown); Assert.IsNull(testCalculation.Output); } } [Test] public void Calculate_KernelReturnsCalculationError_LogsErrorAndReturnsFalse() { // Setup using (new MacroStabilityInwardsCalculatorFactoryConfig()) { var calculator = (TestMacroStabilityInwardsCalculatorFactory)MacroStabilityInwardsCalculatorFactory.Instance; calculator.LastCreatedUpliftVanCalculator.ReturnCalculationError = true; // Call Action call = () => MacroStabilityInwardsCalculationService.Calculate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertCalculationStartMessage(msgs[0]); Assert.AreEqual("Calculation Error", msgs[1]); CalculationServiceTestHelper.AssertCalculationEndMessage(msgs[2]); }); } } [Test] public void Calculate_KernelReturnsCalculationWarning_LogsWarningAndReturnsTrue() { // Setup using (new MacroStabilityInwardsCalculatorFactoryConfig()) { var calculator = (TestMacroStabilityInwardsCalculatorFactory)MacroStabilityInwardsCalculatorFactory.Instance; calculator.LastCreatedUpliftVanCalculator.ReturnCalculationWarning = true; // Call Action call = () => MacroStabilityInwardsCalculationService.Calculate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(3, msgs.Length); CalculationServiceTestHelper.AssertCalculationStartMessage(msgs[0]); Assert.AreEqual("Er zijn waarschuwingsberichten naar aanleiding van de berekening. Klik op details voor meer informatie." + $"{Environment.NewLine}" + "* Calculation Warning 1" + $"{Environment.NewLine}" + "* Calculation Warning 2", msgs[1]); CalculationServiceTestHelper.AssertCalculationEndMessage(msgs[2]); }); } } [Test] public void Calculate_KernelReturnsCalculationErrorAndWarning_LogsErrorAndWarningAndReturnsFalse() { // Setup using (new MacroStabilityInwardsCalculatorFactoryConfig()) { var calculator = (TestMacroStabilityInwardsCalculatorFactory)MacroStabilityInwardsCalculatorFactory.Instance; calculator.LastCreatedUpliftVanCalculator.ReturnCalculationWarning = true; calculator.LastCreatedUpliftVanCalculator.ReturnCalculationError = true; // Call Action call = () => MacroStabilityInwardsCalculationService.Calculate(testCalculation); // Assert TestHelper.AssertLogMessages(call, messages => { string[] msgs = messages.ToArray(); Assert.AreEqual(4, msgs.Length); CalculationServiceTestHelper.AssertCalculationStartMessage(msgs[0]); Assert.AreEqual("Calculation Error", msgs[1]); Assert.AreEqual("Er zijn waarschuwingsberichten naar aanleiding van de berekening. Klik op details voor meer informatie." + $"{Environment.NewLine}" + "* Calculation Warning 1" + $"{Environment.NewLine}" + "* Calculation Warning 2", msgs[2]); CalculationServiceTestHelper.AssertCalculationEndMessage(msgs[3]); }); } } private static IEnumerable SurfacelineNotOnMacroStabilityInwardsSoilProfile2D() { yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(1, -20), new Point2D(2, 10), new Point2D(1, -20) }), new Ring[0]), new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0, -10.0), new Point2D(1, -20) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("First surface line point way too high"); yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(1, 20), new Point2D(2, 10), new Point2D(1, 20) }), new Ring[0]), new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0, 100.0), new Point2D(1, 20) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("First surface line point way too low"); yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(1, 200), new Point2D(2, 100), new Point2D(1, 200) }), new Ring[0]), new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0, 10.0 - 0.05), new Point2D(1, 20) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("First surface line point too high"); yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(1, 200), new Point2D(2, 100), new Point2D(1, 200) }), new Ring[0]), new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0, 10.0 + 0.05), new Point2D(1, 20) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("First surface line point too low"); yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(1, 20), new Point2D(3, -1), new Point2D(1, 20) }), new Ring[0]), new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0, 10.0), new Point2D(1, 20) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("X further than x of surfaceLine, Y not within limit"); yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0, 10), new Point2D(1, 21), new Point2D(1, 19), new Point2D(2, 10), new Point2D(0, 10) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("Second segment is vertical and exceeds surfaceLine"); } private static IEnumerable SurfaceLineOnMacroStabilityInwardsSoilProfile2D() { yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0.1, 20), new Point2D(0.2, 10), new Point2D(0.15, -10), new Point2D(0.1, 20) }), new Ring[0]), new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0.0, 10), new Point2D(0.1, 20) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("Irrelevant surface line point"); yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0.1, 20), new Point2D(0.2, 10), new Point2D(0.1, 20) }), new Ring[0]), new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0.0, 10.0049), new Point2D(0.1, 20) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("First surface line point within upper limit"); yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0.1, 20), new Point2D(0.2, 10), new Point2D(0.1, 20) }), new Ring[0]), new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0.0, 10.0 - 0.0049), new Point2D(0.1, 20) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("First surface line point within lower limit"); yield return new TestCaseData( new MacroStabilityInwardsSoilProfile2D( "profile", new[] { new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0.1, 20), new Point2D(0.3, 0), new Point2D(0.1, 20) }), new Ring[0]), new MacroStabilityInwardsSoilLayer2D(new Ring(new[] { new Point2D(0.0, 10.0), new Point2D(0.1, 20) }), new Ring[0]) }, new MacroStabilityInwardsPreconsolidationStress[0])) .SetName("X further than x of surfaceLine"); } private static void AssertInput(MacroStabilityInwardsInput originalInput, TestMacroStabilityInwardsCalculatorFactory factory) { UpliftVanCalculatorInput actualInput = factory.LastCreatedUpliftVanCalculator.Input; CalculatorInputAssert.AssertSoilProfile(originalInput.SoilProfileUnderSurfaceLine, actualInput.SoilProfile); CalculatorInputAssert.AssertDrainageConstruction(originalInput, actualInput.DrainageConstruction); CalculatorInputAssert.AssertPhreaticLineOffsets(originalInput.LocationInputExtreme, actualInput.PhreaticLineOffsetsExtreme); CalculatorInputAssert.AssertPhreaticLineOffsets(originalInput.LocationInputDaily, actualInput.PhreaticLineOffsetsDaily); AssertSlipPlaneInput(originalInput, actualInput.SlipPlane); Assert.AreEqual(WaternetCreationMode.CreateWaternet, actualInput.WaternetCreationMode); Assert.AreEqual(PlLineCreationMethod.RingtoetsWti2017, actualInput.PlLineCreationMethod); Assert.AreEqual(LandwardDirection.PositiveX, actualInput.LandwardDirection); Assert.AreSame(originalInput.SurfaceLine, actualInput.SurfaceLine); Assert.AreEqual(originalInput.AssessmentLevel, actualInput.AssessmentLevel); Assert.AreEqual(originalInput.DikeSoilScenario, actualInput.DikeSoilScenario); Assert.AreEqual(originalInput.WaterLevelRiverAverage, actualInput.WaterLevelRiverAverage); Assert.AreEqual(originalInput.LocationInputExtreme.WaterLevelPolder, actualInput.WaterLevelPolderExtreme); Assert.AreEqual(originalInput.LocationInputDaily.WaterLevelPolder, actualInput.WaterLevelPolderDaily); Assert.AreEqual(originalInput.DrainageConstructionPresent, actualInput.DrainageConstruction.IsPresent); Assert.AreEqual(originalInput.XCoordinateDrainageConstruction, actualInput.DrainageConstruction.XCoordinate); Assert.AreEqual(originalInput.ZCoordinateDrainageConstruction, actualInput.DrainageConstruction.ZCoordinate); Assert.AreEqual(originalInput.MinimumLevelPhreaticLineAtDikeTopRiver, actualInput.MinimumLevelPhreaticLineAtDikeTopRiver); Assert.AreEqual(originalInput.MinimumLevelPhreaticLineAtDikeTopPolder, actualInput.MinimumLevelPhreaticLineAtDikeTopPolder); Assert.AreEqual(originalInput.LeakageLengthOutwardsPhreaticLine3, actualInput.LeakageLengthOutwardsPhreaticLine3); Assert.AreEqual(originalInput.LeakageLengthInwardsPhreaticLine3, actualInput.LeakageLengthInwardsPhreaticLine3); Assert.AreEqual(originalInput.LeakageLengthOutwardsPhreaticLine4, actualInput.LeakageLengthOutwardsPhreaticLine4); Assert.AreEqual(originalInput.LeakageLengthInwardsPhreaticLine4, actualInput.LeakageLengthInwardsPhreaticLine4); Assert.AreEqual(originalInput.PiezometricHeadPhreaticLine2Outwards, actualInput.PiezometricHeadPhreaticLine2Outwards); Assert.AreEqual(originalInput.PiezometricHeadPhreaticLine2Inwards, actualInput.PiezometricHeadPhreaticLine2Inwards); Assert.AreEqual(originalInput.LocationInputExtreme.PenetrationLength, actualInput.PenetrationLengthExtreme); Assert.AreEqual(originalInput.LocationInputDaily.PenetrationLength, actualInput.PenetrationLengthDaily); Assert.AreEqual(originalInput.AdjustPhreaticLine3And4ForUplift, actualInput.AdjustPhreaticLine3And4ForUplift); Assert.AreEqual(originalInput.MoveGrid, actualInput.MoveGrid); Assert.AreEqual(originalInput.MaximumSliceWidth, actualInput.MaximumSliceWidth); Assert.AreEqual(originalInput.CreateZones, actualInput.CreateZones); Assert.AreEqual(originalInput.ZoningBoundariesDeterminationType == MacroStabilityInwardsZoningBoundariesDeterminationType.Automatic, actualInput.AutomaticForbiddenZones); Assert.AreEqual(originalInput.SlipPlaneMinimumDepth, actualInput.SlipPlaneMinimumDepth); Assert.AreEqual(originalInput.SlipPlaneMinimumLength, actualInput.SlipPlaneMinimumLength); } private static void AssertSlipPlaneInput(MacroStabilityInwardsInput originalInput, UpliftVanSlipPlane actualInput) { Assert.IsFalse(actualInput.GridAutomaticDetermined); Assert.AreEqual(originalInput.LeftGrid.XLeft, actualInput.LeftGrid.XLeft); Assert.AreEqual(originalInput.LeftGrid.XRight, actualInput.LeftGrid.XRight); Assert.AreEqual(originalInput.LeftGrid.ZTop, actualInput.LeftGrid.ZTop); Assert.AreEqual(originalInput.LeftGrid.ZBottom, actualInput.LeftGrid.ZBottom); Assert.AreEqual(originalInput.LeftGrid.NumberOfHorizontalPoints, actualInput.LeftGrid.NumberOfHorizontalPoints); Assert.AreEqual(originalInput.LeftGrid.NumberOfVerticalPoints, actualInput.LeftGrid.NumberOfVerticalPoints); Assert.AreEqual(originalInput.RightGrid.XLeft, actualInput.RightGrid.XLeft); Assert.AreEqual(originalInput.RightGrid.XRight, actualInput.RightGrid.XRight); Assert.AreEqual(originalInput.RightGrid.ZTop, actualInput.RightGrid.ZTop); Assert.AreEqual(originalInput.RightGrid.ZBottom, actualInput.RightGrid.ZBottom); Assert.AreEqual(originalInput.RightGrid.NumberOfHorizontalPoints, actualInput.RightGrid.NumberOfHorizontalPoints); Assert.AreEqual(originalInput.RightGrid.NumberOfVerticalPoints, actualInput.RightGrid.NumberOfVerticalPoints); Assert.IsFalse(actualInput.TangentLinesAutomaticAtBoundaries); Assert.AreEqual(originalInput.TangentLineZTop, actualInput.TangentZTop); Assert.AreEqual(originalInput.TangentLineZBottom, actualInput.TangentZBottom); Assert.AreEqual(originalInput.TangentLineNumber, actualInput.TangentLineNumber); } private static void AssertOutput(UpliftVanCalculatorResult expectedOutput, MacroStabilityInwardsOutput actualOutput) { Assert.AreEqual(expectedOutput.FactorOfStability, actualOutput.FactorOfStability); Assert.AreEqual(expectedOutput.ZValue, actualOutput.ZValue); Assert.AreEqual(expectedOutput.ForbiddenZonesXEntryMin, actualOutput.ForbiddenZonesXEntryMin); Assert.AreEqual(expectedOutput.ForbiddenZonesXEntryMax, actualOutput.ForbiddenZonesXEntryMax); AssertSlidingCurve(expectedOutput.SlidingCurveResult, actualOutput.SlidingCurve); AssertSlipPlaneOutput(expectedOutput.CalculationGridResult, actualOutput.SlipPlane); } private static void AssertSlidingCurve(UpliftVanSlidingCurveResult expected, MacroStabilityInwardsSlidingCurve actual) { Assert.AreEqual(expected.IteratedHorizontalForce, actual.IteratedHorizontalForce); Assert.AreEqual(expected.NonIteratedHorizontalForce, actual.NonIteratedHorizontalForce); AssertCircle(expected.LeftCircle, actual.LeftCircle); AssertCircle(expected.RightCircle, actual.RightCircle); AssertSlices(expected.Slices, actual.Slices); } private static void AssertCircle(UpliftVanSlidingCircleResult circleResult, MacroStabilityInwardsSlidingCircle circleOutput) { Assert.AreEqual(circleResult.Center, circleOutput.Center); Assert.AreEqual(circleResult.IsActive, circleOutput.IsActive); Assert.AreEqual(circleResult.Radius, circleOutput.Radius); Assert.AreEqual(circleResult.DrivingMoment, circleOutput.DrivingMoment); Assert.AreEqual(circleResult.ResistingMoment, circleOutput.ResistingMoment); Assert.AreEqual(circleResult.IteratedForce, circleOutput.IteratedForce); Assert.AreEqual(circleResult.NonIteratedForce, circleOutput.NonIteratedForce); } private static void AssertSlices(IEnumerable resultSlices, IEnumerable outputSlices) { UpliftVanSliceResult[] expectedSlices = resultSlices.ToArray(); MacroStabilityInwardsSlice[] actualSlices = outputSlices.ToArray(); Assert.AreEqual(expectedSlices.Length, actualSlices.Length); for (var i = 0; i < expectedSlices.Length; i++) { Assert.AreSame(expectedSlices[i].TopLeftPoint, actualSlices[i].TopLeftPoint); Assert.AreSame(expectedSlices[i].TopRightPoint, actualSlices[i].TopRightPoint); Assert.AreSame(expectedSlices[i].BottomLeftPoint, actualSlices[i].BottomLeftPoint); Assert.AreSame(expectedSlices[i].BottomRightPoint, actualSlices[i].BottomRightPoint); Assert.AreEqual(expectedSlices[i].Cohesion, actualSlices[i].Cohesion); Assert.AreEqual(expectedSlices[i].FrictionAngle, actualSlices[i].FrictionAngle); Assert.AreEqual(expectedSlices[i].CriticalPressure, actualSlices[i].CriticalPressure); Assert.AreEqual(expectedSlices[i].OverConsolidationRatio, actualSlices[i].OverConsolidationRatio); Assert.AreEqual(expectedSlices[i].Pop, actualSlices[i].Pop); Assert.AreEqual(expectedSlices[i].DegreeOfConsolidationPorePressureSoil, actualSlices[i].DegreeOfConsolidationPorePressureSoil); Assert.AreEqual(expectedSlices[i].DegreeOfConsolidationPorePressureLoad, actualSlices[i].DegreeOfConsolidationPorePressureLoad); Assert.AreEqual(expectedSlices[i].Dilatancy, actualSlices[i].Dilatancy); Assert.AreEqual(expectedSlices[i].ExternalLoad, actualSlices[i].ExternalLoad); Assert.AreEqual(expectedSlices[i].HydrostaticPorePressure, actualSlices[i].HydrostaticPorePressure); Assert.AreEqual(expectedSlices[i].LeftForce, actualSlices[i].LeftForce); Assert.AreEqual(expectedSlices[i].LeftForceAngle, actualSlices[i].LeftForceAngle); Assert.AreEqual(expectedSlices[i].LeftForceY, actualSlices[i].LeftForceY); Assert.AreEqual(expectedSlices[i].RightForce, actualSlices[i].RightForce); Assert.AreEqual(expectedSlices[i].RightForceAngle, actualSlices[i].RightForceAngle); Assert.AreEqual(expectedSlices[i].RightForceY, actualSlices[i].RightForceY); Assert.AreEqual(expectedSlices[i].LoadStress, actualSlices[i].LoadStress); Assert.AreEqual(expectedSlices[i].NormalStress, actualSlices[i].NormalStress); Assert.AreEqual(expectedSlices[i].PorePressure, actualSlices[i].PorePressure); Assert.AreEqual(expectedSlices[i].HorizontalPorePressure, actualSlices[i].HorizontalPorePressure); Assert.AreEqual(expectedSlices[i].VerticalPorePressure, actualSlices[i].VerticalPorePressure); Assert.AreEqual(expectedSlices[i].PiezometricPorePressure, actualSlices[i].PiezometricPorePressure); Assert.AreEqual(expectedSlices[i].EffectiveStress, actualSlices[i].EffectiveStress); Assert.AreEqual(expectedSlices[i].EffectiveStressDaily, actualSlices[i].EffectiveStressDaily); Assert.AreEqual(expectedSlices[i].ExcessPorePressure, actualSlices[i].ExcessPorePressure); Assert.AreEqual(expectedSlices[i].ShearStress, actualSlices[i].ShearStress); Assert.AreEqual(expectedSlices[i].SoilStress, actualSlices[i].SoilStress); Assert.AreEqual(expectedSlices[i].TotalPorePressure, actualSlices[i].TotalPorePressure); Assert.AreEqual(expectedSlices[i].TotalStress, actualSlices[i].TotalStress); Assert.AreEqual(expectedSlices[i].Weight, actualSlices[i].Weight); } } private static void AssertSlipPlaneOutput(UpliftVanCalculationGridResult expected, MacroStabilityInwardsSlipPlaneUpliftVan actual) { CollectionAssert.AreEqual(expected.TangentLines, actual.TangentLines); AssertGrid(expected.LeftGrid, actual.LeftGrid); AssertGrid(expected.RightGrid, actual.RightGrid); } private static void AssertGrid(UpliftVanGrid expectedGrid, MacroStabilityInwardsGrid actualGrid) { Assert.AreEqual(expectedGrid.XLeft, actualGrid.XLeft); Assert.AreEqual(expectedGrid.XRight, actualGrid.XRight); Assert.AreEqual(expectedGrid.ZTop, actualGrid.ZTop); Assert.AreEqual(expectedGrid.ZBottom, actualGrid.ZBottom); Assert.AreEqual(expectedGrid.NumberOfHorizontalPoints, actualGrid.NumberOfHorizontalPoints); Assert.AreEqual(expectedGrid.NumberOfVerticalPoints, actualGrid.NumberOfVerticalPoints); } } }