// Copyright (C) Stichting Deltares 2016. 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.ComponentModel; using System.Linq; using Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Core.Common.Gui.PropertyBag; using Core.Common.TestUtil; using NUnit.Framework; using Rhino.Mocks; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Common.Data.Probabilistics; using Ringtoets.Common.Data.TestUtil; using Ringtoets.Common.Forms.PresentationObjects; using Ringtoets.Common.Forms.UITypeEditors; using Ringtoets.Piping.Data; using Ringtoets.Piping.Forms.PresentationObjects; using Ringtoets.Piping.Forms.PropertyClasses; using Ringtoets.Piping.Forms.TypeConverters; using Ringtoets.Piping.KernelWrapper.TestUtil; using Ringtoets.Piping.Primitives; using RingtoetsPipingDataResources = Ringtoets.Piping.Data.Properties.Resources; namespace Ringtoets.Piping.Forms.Test.PropertyClasses { [TestFixture] public class PipingInputContextPropertiesTest { private const int expectedSelectedHydraulicBoundaryLocationPropertyIndex = 0; private const int expectedAssessmentLevelPropertyIndex = 1; private const int expectedUseHydraulicBoundaryLocationPropertyIndex = 2; private const int expectedDampingFactorExitPropertyIndex = 3; private const int expectedPhreaticLevelExitPropertyIndex = 4; private const int expectedPiezometricHeadExitPropertyIndex = 5; private const int expectedSurfaceLinePropertyIndex = 6; private const int expectedStochasticSoilModelPropertyIndex = 7; private const int expectedStochasticSoilProfilePropertyIndex = 8; private const int expectedEntryPointLPropertyIndex = 9; private const int expectedExitPointLPropertyIndex = 10; private const int expectedSeepageLengthPropertyIndex = 11; private const int expectedThicknessCoverageLayerPropertyIndex = 12; private const int expectedEffectiveThicknessCoverageLayerPropertyIndex = 13; private const int expectedThicknessAquiferLayerPropertyIndex = 14; private const int expectedDarcyPermeabilityPropertyIndex = 15; private const int expectedDiameter70PropertyIndex = 16; private const int expectedSaturatedVolumicWeightOfCoverageLayerPropertyIndex = 17; [Test] public void DefaultConstructor_ExpectedValues() { // Call PipingInputContextProperties properties = new PipingInputContextProperties(); // Assert Assert.IsInstanceOf>(properties); Assert.IsInstanceOf(properties); Assert.IsNull(properties.Data); } [Test] public void Constructor_Always_PropertiesHaveExpectedAttributesValues() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()); // Call PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), UseAssessmentLevelManualInput = false }; // Assert var dynamicPropertyBag = new DynamicPropertyBag(properties); PropertyDescriptorCollection dynamicProperties = dynamicPropertyBag.GetProperties(new Attribute[] { BrowsableAttribute.Yes }); Assert.AreEqual(18, dynamicProperties.Count); var hydraulicDataCategory = "Hydraulische gegevens"; var schematizationCategory = "Schematisatie"; PropertyDescriptor hydraulicBoundaryLocationProperty = dynamicProperties[expectedSelectedHydraulicBoundaryLocationPropertyIndex]; Assert.IsNotNull(hydraulicBoundaryLocationProperty); Assert.IsFalse(hydraulicBoundaryLocationProperty.IsReadOnly); Assert.AreEqual(hydraulicDataCategory, hydraulicBoundaryLocationProperty.Category); Assert.AreEqual("Locatie met hydraulische randvoorwaarden", hydraulicBoundaryLocationProperty.DisplayName); Assert.AreEqual("De locatie met hydraulische randvoorwaarden waarvan het berekende toetspeil wordt gebruikt.", hydraulicBoundaryLocationProperty.Description); PropertyDescriptor assessmentLevelProperty = dynamicProperties[expectedAssessmentLevelPropertyIndex]; Assert.IsNotNull(assessmentLevelProperty); Assert.IsTrue(assessmentLevelProperty.IsReadOnly); Assert.AreEqual(hydraulicDataCategory, assessmentLevelProperty.Category); Assert.AreEqual("Toetspeil [m+NAP]", assessmentLevelProperty.DisplayName); Assert.AreEqual("Waterstand met een overschrijdingsfrequentie gelijk aan de trajectnorm.", assessmentLevelProperty.Description); PropertyDescriptor useHydraulicBoundaryLocationProperty = dynamicProperties[expectedUseHydraulicBoundaryLocationPropertyIndex]; Assert.IsNotNull(useHydraulicBoundaryLocationProperty); Assert.AreEqual(hydraulicDataCategory, useHydraulicBoundaryLocationProperty.Category); Assert.AreEqual("Handmatig toetspeil invoeren", useHydraulicBoundaryLocationProperty.DisplayName); Assert.AreEqual("Sta toe om het toetspeil handmatig te specificeren?", useHydraulicBoundaryLocationProperty.Description); PropertyDescriptor dampingsFactorExitProperty = dynamicProperties[expectedDampingFactorExitPropertyIndex]; Assert.IsNotNull(dampingsFactorExitProperty); Assert.IsInstanceOf(dampingsFactorExitProperty.Converter); Assert.IsFalse(dampingsFactorExitProperty.IsReadOnly); Assert.AreEqual(hydraulicDataCategory, dampingsFactorExitProperty.Category); Assert.AreEqual("Dempingsfactor bij uittredepunt [-]", dampingsFactorExitProperty.DisplayName); Assert.AreEqual("Dempingsfactor relateert respons van stijghoogte bij binnenteen aan buitenwaterstand.", dampingsFactorExitProperty.Description); PropertyDescriptor phreaticLevelExitProperty = dynamicProperties[expectedPhreaticLevelExitPropertyIndex]; Assert.IsNotNull(phreaticLevelExitProperty); Assert.IsInstanceOf(phreaticLevelExitProperty.Converter); Assert.IsFalse(phreaticLevelExitProperty.IsReadOnly); Assert.AreEqual(hydraulicDataCategory, phreaticLevelExitProperty.Category); Assert.AreEqual("Polderpeil [m+NAP]", phreaticLevelExitProperty.DisplayName); Assert.AreEqual("Polderpeil.", phreaticLevelExitProperty.Description); PropertyDescriptor piezometricHeadExitProperty = dynamicProperties[expectedPiezometricHeadExitPropertyIndex]; Assert.IsNotNull(piezometricHeadExitProperty); Assert.IsTrue(piezometricHeadExitProperty.IsReadOnly); Assert.AreEqual(hydraulicDataCategory, piezometricHeadExitProperty.Category); Assert.AreEqual("Stijghoogte bij uittredepunt [m+NAP]", piezometricHeadExitProperty.DisplayName); Assert.AreEqual("Stijghoogte bij uittredepunt.", piezometricHeadExitProperty.Description); PropertyDescriptor surfaceLineProperty = dynamicProperties[expectedSurfaceLinePropertyIndex]; Assert.IsNotNull(surfaceLineProperty); Assert.IsFalse(surfaceLineProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, surfaceLineProperty.Category); Assert.AreEqual("Profielschematisatie", surfaceLineProperty.DisplayName); Assert.AreEqual("De schematisatie van de hoogte van het dwarsprofiel.", surfaceLineProperty.Description); PropertyDescriptor stochasticSoilModelProperty = dynamicProperties[expectedStochasticSoilModelPropertyIndex]; Assert.IsNotNull(stochasticSoilModelProperty); Assert.IsFalse(stochasticSoilModelProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, stochasticSoilModelProperty.Category); Assert.AreEqual("Stochastisch ondergrondmodel", stochasticSoilModelProperty.DisplayName); Assert.AreEqual("De verschillende opbouwen van de ondergrond en hun respectieve kansen van voorkomen.", stochasticSoilModelProperty.Description); PropertyDescriptor stochasticSoilProfileProperty = dynamicProperties[expectedStochasticSoilProfilePropertyIndex]; Assert.IsNotNull(stochasticSoilProfileProperty); Assert.IsFalse(stochasticSoilProfileProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, stochasticSoilProfileProperty.Category); Assert.AreEqual("Ondergrondschematisatie", stochasticSoilProfileProperty.DisplayName); Assert.AreEqual("De opbouw van de ondergrond.", stochasticSoilProfileProperty.Description); PropertyDescriptor entryPointLProperty = dynamicProperties[expectedEntryPointLPropertyIndex]; Assert.IsNotNull(entryPointLProperty); Assert.IsFalse(entryPointLProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, entryPointLProperty.Category); Assert.AreEqual("Intredepunt", entryPointLProperty.DisplayName); Assert.AreEqual("De positie in het dwarsprofiel van het intredepunt.", entryPointLProperty.Description); PropertyDescriptor exitPointLProperty = dynamicProperties[expectedExitPointLPropertyIndex]; Assert.IsNotNull(exitPointLProperty); Assert.IsFalse(exitPointLProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, exitPointLProperty.Category); Assert.AreEqual("Uittredepunt", exitPointLProperty.DisplayName); Assert.AreEqual("De positie in het dwarsprofiel van het uittredepunt.", exitPointLProperty.Description); PropertyDescriptor seepageLengthProperty = dynamicProperties[expectedSeepageLengthPropertyIndex]; Assert.IsNotNull(seepageLengthProperty); Assert.IsInstanceOf(seepageLengthProperty.Converter); Assert.IsTrue(seepageLengthProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, seepageLengthProperty.Category); Assert.AreEqual("Kwelweglengte [m]", seepageLengthProperty.DisplayName); Assert.AreEqual("De horizontale afstand tussen intrede- en uittredepunt die het kwelwater ondergronds aflegt voordat het weer aan de oppervlakte komt.", seepageLengthProperty.Description); PropertyDescriptor thicknessCoverageLayerProperty = dynamicProperties[expectedThicknessCoverageLayerPropertyIndex]; Assert.IsNotNull(thicknessCoverageLayerProperty); Assert.IsInstanceOf(thicknessCoverageLayerProperty.Converter); Assert.IsTrue(thicknessCoverageLayerProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, thicknessCoverageLayerProperty.Category); Assert.AreEqual("Totale deklaagdikte bij uittredepunt [m]", thicknessCoverageLayerProperty.DisplayName); Assert.AreEqual("Totale deklaagdikte bij uittredepunt.", thicknessCoverageLayerProperty.Description); PropertyDescriptor effectiveThicknessCoverageLayerProperty = dynamicProperties[expectedEffectiveThicknessCoverageLayerPropertyIndex]; Assert.IsNotNull(effectiveThicknessCoverageLayerProperty); Assert.IsInstanceOf(effectiveThicknessCoverageLayerProperty.Converter); Assert.IsTrue(effectiveThicknessCoverageLayerProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, effectiveThicknessCoverageLayerProperty.Category); Assert.AreEqual("Effectieve deklaagdikte bij uittredepunt [m]", effectiveThicknessCoverageLayerProperty.DisplayName); Assert.AreEqual("Effectieve deklaagdikte bij uittredepunt.", effectiveThicknessCoverageLayerProperty.Description); PropertyDescriptor thicknessAquiferLayerProperty = dynamicProperties[expectedThicknessAquiferLayerPropertyIndex]; Assert.IsNotNull(thicknessAquiferLayerProperty); Assert.IsInstanceOf(thicknessAquiferLayerProperty.Converter); Assert.IsTrue(thicknessAquiferLayerProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, thicknessAquiferLayerProperty.Category); Assert.AreEqual("Dikte watervoerend pakket [m]", thicknessAquiferLayerProperty.DisplayName); Assert.AreEqual("De dikte van de bovenste voor doorlatendheid te onderscheiden zandlaag of combinatie van zandlagen.", thicknessAquiferLayerProperty.Description); PropertyDescriptor darcyPermeabilityProperty = dynamicProperties[expectedDarcyPermeabilityPropertyIndex]; Assert.IsNotNull(darcyPermeabilityProperty); Assert.IsInstanceOf(darcyPermeabilityProperty.Converter); Assert.IsTrue(darcyPermeabilityProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, darcyPermeabilityProperty.Category); Assert.AreEqual("Doorlatendheid aquifer [m/s]", darcyPermeabilityProperty.DisplayName); Assert.AreEqual("Darcy-snelheid waarmee water door de eerste voor doorlatendheid te onderscheiden zandlaag loopt.", darcyPermeabilityProperty.Description); PropertyDescriptor diameter70Property = dynamicProperties[expectedDiameter70PropertyIndex]; Assert.IsNotNull(diameter70Property); Assert.IsInstanceOf(diameter70Property.Converter); Assert.IsTrue(diameter70Property.IsReadOnly); Assert.AreEqual(schematizationCategory, diameter70Property.Category); Assert.AreEqual("De d70 in de bovenste zandlaag [m]", diameter70Property.DisplayName); Assert.AreEqual("Zeefmaat waar 70 gewichtsprocent van de korrels uit een zandlaag doorheen gaat. Hier de korreldiameter van het bovenste gedeelte van de voor doorlatendheid te onderscheiden zandlaag, bepaald zonder fijne fractie (< 63µm).", diameter70Property.Description); PropertyDescriptor saturatedVolumicWeightOfCoverageLayerProperty = dynamicProperties[expectedSaturatedVolumicWeightOfCoverageLayerPropertyIndex]; Assert.IsNotNull(saturatedVolumicWeightOfCoverageLayerProperty); Assert.IsInstanceOf(saturatedVolumicWeightOfCoverageLayerProperty.Converter); Assert.IsTrue(saturatedVolumicWeightOfCoverageLayerProperty.IsReadOnly); Assert.AreEqual(schematizationCategory, saturatedVolumicWeightOfCoverageLayerProperty.Category); Assert.AreEqual("Verzadigd gewicht deklaag [kN/m³]", saturatedVolumicWeightOfCoverageLayerProperty.DisplayName); Assert.AreEqual("Verzadigd gewicht deklaag.", saturatedVolumicWeightOfCoverageLayerProperty.Description); mocks.VerifyAll(); } [Test] [TestCase(true)] [TestCase(false)] public void GetProperties_UseAssessmentLevelManualInput_ReturnsExpectedAttributeValues(bool useManualAssessmentLevelInput) { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()); // Call PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), UseAssessmentLevelManualInput = useManualAssessmentLevelInput }; // Assert var dynamicPropertyBag = new DynamicPropertyBag(properties); PropertyDescriptorCollection dynamicProperties = dynamicPropertyBag.GetProperties(new Attribute[] { BrowsableAttribute.Yes }); var hydraulicDataCategory = "Hydraulische gegevens"; if (!useManualAssessmentLevelInput) { Assert.AreEqual(18, dynamicProperties.Count); PropertyDescriptor hydraulicBoundaryLocationProperty = dynamicProperties[expectedSelectedHydraulicBoundaryLocationPropertyIndex]; Assert.IsNotNull(hydraulicBoundaryLocationProperty); Assert.IsFalse(hydraulicBoundaryLocationProperty.IsReadOnly); Assert.AreEqual(hydraulicDataCategory, hydraulicBoundaryLocationProperty.Category); Assert.AreEqual("Locatie met hydraulische randvoorwaarden", hydraulicBoundaryLocationProperty.DisplayName); Assert.AreEqual("De locatie met hydraulische randvoorwaarden waarvan het berekende toetspeil wordt gebruikt.", hydraulicBoundaryLocationProperty.Description); PropertyDescriptor assessmentLevelProperty = dynamicProperties[expectedAssessmentLevelPropertyIndex]; Assert.IsNotNull(assessmentLevelProperty); Assert.IsTrue(assessmentLevelProperty.IsReadOnly); Assert.AreEqual(hydraulicDataCategory, assessmentLevelProperty.Category); Assert.AreEqual("Toetspeil [m+NAP]", assessmentLevelProperty.DisplayName); Assert.AreEqual("Waterstand met een overschrijdingsfrequentie gelijk aan de trajectnorm.", assessmentLevelProperty.Description); } else { Assert.AreEqual(17, dynamicProperties.Count); PropertyDescriptor assessmentLevelProperty = dynamicProperties[0]; Assert.IsNotNull(assessmentLevelProperty); Assert.IsFalse(assessmentLevelProperty.IsReadOnly); Assert.AreEqual(hydraulicDataCategory, assessmentLevelProperty.Category); Assert.AreEqual("Toetspeil [m+NAP]", assessmentLevelProperty.DisplayName); Assert.AreEqual("Waterstand met een overschrijdingsfrequentie gelijk aan de trajectnorm.", assessmentLevelProperty.Description); } } [Test] public void GetProperties_WithData_ReturnExpectedValues() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); var random = new Random(22); RingtoetsPipingSurfaceLine surfaceLine = ValidSurfaceLine(0.0, 4.0); StochasticSoilProfile stochasticSoilProfile = new StochasticSoilProfile(0.0, SoilProfileType.SoilProfile1D, 0) { SoilProfile = new PipingSoilProfile(string.Empty, random.NextDouble(), new[] { new PipingSoilLayer(random.NextDouble()) { IsAquifer = true } }, SoilProfileType.SoilProfile1D, 0) }; StochasticSoilModel stochasticSoilModel = new StochasticSoilModel(0, "StochasticSoilModelName", "StochasticSoilModelSegmentName"); stochasticSoilModel.StochasticSoilProfiles.Add(stochasticSoilProfile); HydraulicBoundaryLocation testHydraulicBoundaryLocation = TestHydraulicBoundaryLocation.CreateDesignWaterLevelCalculated(0.0); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { HydraulicBoundaryLocation = testHydraulicBoundaryLocation, SurfaceLine = surfaceLine, StochasticSoilModel = stochasticSoilModel, StochasticSoilProfile = (stochasticSoilProfile), UseAssessmentLevelManualInput = false }; PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection) }; // Call & Assert Assert.AreSame(inputParameters.PhreaticLevelExit, properties.PhreaticLevelExit.Distribution); Assert.AreSame(inputParameters.DampingFactorExit, properties.DampingFactorExit.Distribution); Assert.AreEqual(inputParameters.ThicknessCoverageLayer.Mean, properties.ThicknessCoverageLayer.Distribution.Mean); Assert.AreEqual(inputParameters.ThicknessCoverageLayer.StandardDeviation, properties.ThicknessCoverageLayer.Distribution.StandardDeviation); Assert.AreEqual(inputParameters.EffectiveThicknessCoverageLayer.Mean, properties.EffectiveThicknessCoverageLayer.Distribution.Mean); Assert.AreEqual(inputParameters.EffectiveThicknessCoverageLayer.StandardDeviation, properties.EffectiveThicknessCoverageLayer.Distribution.StandardDeviation); Assert.AreEqual(inputParameters.Diameter70.Mean, properties.Diameter70.Distribution.Mean); Assert.AreEqual(inputParameters.Diameter70.StandardDeviation, properties.Diameter70.Distribution.StandardDeviation); Assert.AreEqual(inputParameters.DarcyPermeability.Mean, properties.DarcyPermeability.Distribution.Mean); Assert.AreEqual(inputParameters.DarcyPermeability.StandardDeviation, properties.DarcyPermeability.Distribution.StandardDeviation); Assert.AreEqual(inputParameters.ThicknessAquiferLayer.Mean, properties.ThicknessAquiferLayer.Distribution.Mean); Assert.AreEqual(inputParameters.ThicknessAquiferLayer.StandardDeviation, properties.ThicknessAquiferLayer.Distribution.StandardDeviation); Assert.AreEqual( inputParameters.SaturatedVolumicWeightOfCoverageLayer.Mean, properties.SaturatedVolumicWeightOfCoverageLayer.Distribution.Mean); Assert.AreEqual( inputParameters.SaturatedVolumicWeightOfCoverageLayer.StandardDeviation, properties.SaturatedVolumicWeightOfCoverageLayer.Distribution.StandardDeviation); Assert.AreEqual( inputParameters.SaturatedVolumicWeightOfCoverageLayer.Shift, properties.SaturatedVolumicWeightOfCoverageLayer.Distribution.Shift); Assert.AreEqual(inputParameters.AssessmentLevel, properties.AssessmentLevel); Assert.AreEqual(inputParameters.PiezometricHeadExit, properties.PiezometricHeadExit); Assert.AreEqual(inputParameters.SeepageLength.Mean, properties.SeepageLength.Distribution.Mean); Assert.AreEqual(inputParameters.SeepageLength.StandardDeviation, properties.SeepageLength.Distribution.StandardDeviation); Assert.AreEqual(inputParameters.SeepageLength.Mean, properties.ExitPointL - properties.EntryPointL); Assert.AreEqual(inputParameters.ExitPointL, properties.ExitPointL); Assert.AreSame(surfaceLine, properties.SurfaceLine); Assert.AreSame(stochasticSoilProfile, properties.StochasticSoilProfile); Assert.AreSame(stochasticSoilModel, properties.StochasticSoilModel); Assert.AreSame(testHydraulicBoundaryLocation, properties.SelectedHydraulicBoundaryLocation.HydraulicBoundaryLocation); Assert.AreEqual(inputParameters.UseAssessmentLevelManualInput, properties.UseAssessmentLevelManualInput); mocks.VerifyAll(); } [Test] public void SetProperties_WithData_PropertiesOnInputSet() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()); PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection) }; const double assessmentLevel = 0.36; const double entryPointL = 0.12; const double exitPointL = 0.44; RingtoetsPipingSurfaceLine surfaceLine = ValidSurfaceLine(0.0, 4.0); StochasticSoilModel soilModel = ValidStochasticSoilModel(0.0, 4.0); StochasticSoilProfile soilProfile = soilModel.StochasticSoilProfiles.First(); var dampingFactorExit = new LogNormalDistributionDesignVariable( new LogNormalDistribution(3) { Mean = (RoundedDouble) 1.55, StandardDeviation = (RoundedDouble) 0.22 }); var phreaticLevelExit = new NormalDistributionDesignVariable( new NormalDistribution(3) { Mean = (RoundedDouble) 1.55, StandardDeviation = (RoundedDouble) 0.22 }); // Call properties.UseAssessmentLevelManualInput = true; properties.AssessmentLevel = (RoundedDouble) assessmentLevel; properties.SurfaceLine = surfaceLine; properties.EntryPointL = (RoundedDouble) entryPointL; properties.ExitPointL = (RoundedDouble) exitPointL; properties.StochasticSoilModel = soilModel; properties.StochasticSoilProfile = soilProfile; properties.DampingFactorExit = dampingFactorExit; properties.PhreaticLevelExit = phreaticLevelExit; // Assert Assert.AreEqual(assessmentLevel, inputParameters.AssessmentLevel.Value); Assert.AreEqual(entryPointL, inputParameters.EntryPointL.Value); Assert.AreEqual(exitPointL, inputParameters.ExitPointL.Value); Assert.AreSame(surfaceLine, inputParameters.SurfaceLine); Assert.AreSame(soilModel, inputParameters.StochasticSoilModel); Assert.AreSame(soilProfile, inputParameters.StochasticSoilProfile); DistributionAssert.AreEqual(dampingFactorExit.Distribution, inputParameters.DampingFactorExit); DistributionAssert.AreEqual(phreaticLevelExit.Distribution, inputParameters.PhreaticLevelExit); mocks.VerifyAll(); } [Test] [TestCase(true)] [TestCase(false)] public void SurfaceLine_WithOrWithoutOutput_HasOutputFalseInputNotifiedAndCalculationNotifiedWhenHadOutput(bool hasOutput) { SetPropertyAndVerifyNotifcationsAndOutput(hasOutput, properties => properties.SurfaceLine = ValidSurfaceLine(0.0, 4.0)); } [Test] [TestCase(true)] [TestCase(false)] public void StochasticSoilModel_WithOrWithoutOutput_HasOutputFalseInputNotifiedAndCalculationNotifiedWhenHadOutput(bool hasOutput) { SetPropertyAndVerifyNotifcationsAndOutput(hasOutput, properties => properties.StochasticSoilModel = ValidStochasticSoilModel(0.0, 4.0)); } [Test] [TestCase(true)] [TestCase(false)] public void StochasticSoilProfile_WithOrWithoutOutput_HasOutputFalseInputNotifiedAndCalculationNotifiedWhenHadOutput(bool hasOutput) { SetPropertyAndVerifyNotifcationsAndOutput(hasOutput, properties => properties.StochasticSoilProfile = ValidStochasticSoilModel(0.0, 4.0).StochasticSoilProfiles.First()); } [Test] [TestCase(true)] [TestCase(false)] public void AssessmentLevel_WithOrWithoutOutput_HasOutputFalseInputNotifiedAndCalculationNotifiedWhenHadOutput(bool hasOutput) { SetPropertyAndVerifyNotifcationsAndOutputForCalculation( hasOutput, properties => properties.AssessmentLevel = new Random(21).NextRoundedDouble(), new PipingCalculationScenario(new GeneralPipingInput()) { InputParameters = { UseAssessmentLevelManualInput = true } }); } [Test] [TestCase(true)] [TestCase(false)] public void DampingFactorExit_WithOrWithoutOutput_HasOutputFalseInputNotifiedAndCalculationNotifiedWhenHadOutput(bool hasOutput) { SetPropertyAndVerifyNotifcationsAndOutput( hasOutput, properties => properties.DampingFactorExit = new LogNormalDistributionDesignVariable(new LogNormalDistribution(3))); } [Test] [TestCase(true)] [TestCase(false)] public void PhreaticLevelExit_WithOrWithoutOutput_HasOutputFalseInputNotifiedAndCalculationNotifiedWhenHadOutput(bool hasOutput) { SetPropertyAndVerifyNotifcationsAndOutput( hasOutput, properties => properties.PhreaticLevelExit = new NormalDistributionDesignVariable(new NormalDistribution(3))); } [Test] [TestCase(true)] [TestCase(false)] public void EntryPoinL_WithOrWithoutOutput_HasOutputFalseInputNotifiedAndCalculationNotifiedWhenHadOutput(bool hasOutput) { SetPropertyAndVerifyNotifcationsAndOutput(hasOutput, properties => properties.EntryPointL = new Random(21).NextRoundedDouble()); } [Test] [TestCase(true)] [TestCase(false)] public void ExitPointL_WithOrWithoutOutput_HasOutputFalseInputNotifiedAndCalculationNotifiedWhenHadOutput(bool hasOutput) { SetPropertyAndVerifyNotifcationsAndOutput(hasOutput, properties => properties.ExitPointL = new Random(21).NextRoundedDouble()); } [Test] [TestCase(true)] [TestCase(false)] public void UseCustomAssessmentLevel_WithOrWithoutOutput_HasOutputFalseInputNotifiedAndCalculationNotifiedWhenHadOutput(bool hasOutput) { SetPropertyAndVerifyNotifcationsAndOutput(hasOutput, properties => properties.UseAssessmentLevelManualInput = true); } [Test] [TestCase(0, 3, 3)] [TestCase(2, 4, 2)] [TestCase(1e-2, 4, 4 - 1e-2)] [TestCase(1e-2, 3, 3 - 1e-2)] [TestCase(1, 1 + 1e-2, 1e-2)] public void SeepageLength_ExitPointAndEntryPointSet_ExpectedValue(double entryPoint, double exitPoint, double seepageLength) { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); var inputObserver = mocks.StrictMock(); int numberOfChangedProperties = 2; inputObserver.Expect(o => o.UpdateObserver()).Repeat.Times(numberOfChangedProperties); mocks.ReplayAll(); RingtoetsPipingSurfaceLine surfaceLine = ValidSurfaceLine(0.0, 4.0); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { SurfaceLine = surfaceLine }; inputParameters.Attach(inputObserver); PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), ExitPointL = (RoundedDouble) exitPoint, EntryPointL = (RoundedDouble) entryPoint }; // Call & Assert Assert.AreEqual(seepageLength, properties.SeepageLength.Distribution.Mean, 1e-6); Assert.AreEqual(properties.ExitPointL, inputParameters.ExitPointL); Assert.AreEqual(properties.SeepageLength.Distribution.Mean, inputParameters.SeepageLength.Mean); mocks.VerifyAll(); } [Test] public void SeepageLength_EntryPointAndThenExitPointSet_ExpectedValue() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); var inputObserver = mocks.StrictMock(); int numberOfChangedProperties = 2; inputObserver.Expect(o => o.UpdateObserver()).Repeat.Times(numberOfChangedProperties); mocks.ReplayAll(); RingtoetsPipingSurfaceLine surfaceLine = ValidSurfaceLine(0.0, 4.0); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { SurfaceLine = surfaceLine }; inputParameters.Attach(inputObserver); PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), EntryPointL = (RoundedDouble) 0.5, ExitPointL = (RoundedDouble) 2 }; // Call & Assert Assert.AreEqual(1.5, properties.SeepageLength.Distribution.Mean.Value); Assert.AreEqual(properties.ExitPointL, inputParameters.ExitPointL); Assert.AreEqual(properties.SeepageLength.Distribution.Mean, inputParameters.SeepageLength.Mean); mocks.VerifyAll(); } [Test] [TestCase(2.0)] [TestCase(-5.0)] public void ExitPointL_InvalidValue_ThrowsArgumentOutOfRangeException(double newExitPoint) { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); var inputObserver = mocks.StrictMock(); mocks.ReplayAll(); RingtoetsPipingSurfaceLine surfaceLine = ValidSurfaceLine(0.0, 4.0); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { SurfaceLine = surfaceLine }; PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), EntryPointL = (RoundedDouble) 2.0 }; inputParameters.Attach(inputObserver); // Call TestDelegate call = () => properties.ExitPointL = (RoundedDouble) newExitPoint; // Assert var expectedMessage = RingtoetsPipingDataResources.PipingInput_EntryPointL_greater_or_equal_to_ExitPointL; TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, expectedMessage); mocks.VerifyAll(); // No observer notified } [Test] [TestCase(2.0)] [TestCase(5.0)] public void EntryPointL_InvalidValue_ThrowsArgumentOutOfRangeException(double newEntryPoint) { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); var inputObserver = mocks.StrictMock(); mocks.ReplayAll(); RingtoetsPipingSurfaceLine surfaceLine = ValidSurfaceLine(0.0, 4.0); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { SurfaceLine = surfaceLine }; PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), ExitPointL = (RoundedDouble) 2.0 }; inputParameters.Attach(inputObserver); // Call TestDelegate call = () => properties.EntryPointL = (RoundedDouble) newEntryPoint; // Assert var expectedMessage = RingtoetsPipingDataResources.PipingInput_EntryPointL_greater_or_equal_to_ExitPointL; TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, expectedMessage); mocks.VerifyAll(); // No observer notified } [Test] public void EntryPointL_NotOnSurfaceline_ThrowsArgumentOutOfRangeException() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); var inputObserver = mocks.StrictMock(); mocks.ReplayAll(); RingtoetsPipingSurfaceLine surfaceLine = ValidSurfaceLine(0.0, 4.0); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { SurfaceLine = surfaceLine }; PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), ExitPointL = (RoundedDouble) 2.0 }; inputParameters.Attach(inputObserver); // Call TestDelegate call = () => properties.EntryPointL = (RoundedDouble) (-15.0); // Assert const string expectedMessage = "Het gespecificeerde punt moet op het profiel liggen (bereik [0, 4])."; TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, expectedMessage); mocks.VerifyAll(); // No observer notified } [Test] public void ExitPointL_NotOnSurfaceline_ThrowsArgumentOutOfRangeException() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); var inputObserver = mocks.StrictMock(); mocks.ReplayAll(); RingtoetsPipingSurfaceLine surfaceLine = ValidSurfaceLine(0.0, 4.0); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { SurfaceLine = surfaceLine }; var properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), EntryPointL = (RoundedDouble) 2.0 }; inputParameters.Attach(inputObserver); // Call TestDelegate call = () => properties.ExitPointL = (RoundedDouble) 10.0; // Assert const string expectedMessage = "Het gespecificeerde punt moet op het profiel liggen (bereik [0, 4])."; TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, expectedMessage); mocks.VerifyAll(); // No observer notified } [Test] public void HydraulicBoundaryLocation_DesignWaterLevelIsNaN_AssessmentLevelSetToNaN() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); var projectObserver = mocks.StrictMock(); projectObserver.Expect(o => o.UpdateObserver()); mocks.ReplayAll(); RoundedDouble assessmentLevel = (RoundedDouble) new Random(21).NextDouble(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { HydraulicBoundaryLocation = TestHydraulicBoundaryLocation.CreateDesignWaterLevelCalculated( assessmentLevel) }; inputParameters.Attach(projectObserver); PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection) }; var hydraulicBoundaryLocation = new TestHydraulicBoundaryLocation(); var selectableHydraulicBoundaryLocation = new SelectableHydraulicBoundaryLocation(hydraulicBoundaryLocation, null); // Call properties.SelectedHydraulicBoundaryLocation = selectableHydraulicBoundaryLocation; // Assert Assert.IsNaN(properties.AssessmentLevel.Value); mocks.VerifyAll(); } [Test] public void HydraulicBoundaryLocation_DesignWaterLevelSet_SetsAssessmentLevelToDesignWaterLevelAndNotifiesOnce() { // Setup var mocks = new MockRepository(); var assessmentSectionMock = mocks.Stub(); var projectObserver = mocks.StrictMock(); projectObserver.Expect(o => o.UpdateObserver()).Repeat.Times(1); mocks.ReplayAll(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()); inputParameters.Attach(projectObserver); PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSectionMock) }; RoundedDouble testLevel = (RoundedDouble) new Random(21).NextDouble(); HydraulicBoundaryLocation hydraulicBoundaryLocation = TestHydraulicBoundaryLocation.CreateDesignWaterLevelCalculated( testLevel); var selectableHydraulicBoundaryLocation = new SelectableHydraulicBoundaryLocation(hydraulicBoundaryLocation, null); // Call properties.SelectedHydraulicBoundaryLocation = selectableHydraulicBoundaryLocation; // Assert Assert.AreEqual(testLevel, properties.AssessmentLevel, properties.AssessmentLevel.GetAccuracy()); mocks.VerifyAll(); } [Test] public void GivenHydraulicBoundaryLocationAndUseHydraulicBoundaryLocation_WhenUnuseLocationAndSetNewAssessmentLevel_UpdateAssessmentLevelAndRemovesLocation() { // Given var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); var random = new Random(21); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { HydraulicBoundaryLocation = TestHydraulicBoundaryLocation.CreateDesignWaterLevelCalculated(50) }; PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), UseAssessmentLevelManualInput = false }; RoundedDouble testLevel = (RoundedDouble) random.NextDouble(); // When properties.UseAssessmentLevelManualInput = true; properties.AssessmentLevel = testLevel; // Then Assert.AreEqual(2, properties.AssessmentLevel.NumberOfDecimalPlaces); Assert.AreEqual(testLevel, properties.AssessmentLevel, properties.AssessmentLevel.GetAccuracy()); Assert.IsNull(properties.SelectedHydraulicBoundaryLocation); mocks.VerifyAll(); } [Test] [TestCase(double.NegativeInfinity)] [TestCase(double.PositiveInfinity)] [TestCase(double.NaN)] [TestCase(1234)] public void AssessmentLevel_SetNewValue_UpdateDataAndNotifyObservers(double testLevel) { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); var projectObserver = mocks.StrictMock(); projectObserver.Expect(o => o.UpdateObserver()).Repeat.Times(1); mocks.ReplayAll(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { UseAssessmentLevelManualInput = true }; inputParameters.Attach(projectObserver); PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection) }; // Call properties.AssessmentLevel = (RoundedDouble) testLevel; // Assert Assert.AreEqual(2, properties.AssessmentLevel.NumberOfDecimalPlaces); Assert.AreEqual(testLevel, properties.AssessmentLevel, properties.AssessmentLevel.GetAccuracy()); mocks.VerifyAll(); } [Test] public void GivenAssessmentLevelSetWithoutHydraulicBoundaryLocation_WhenUseAndSetNewLocation_UpdateAssessmentLevelWithLocationValues() { // Given var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); var random = new Random(21); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { UseAssessmentLevelManualInput = true, AssessmentLevel = (RoundedDouble) random.NextDouble() }; PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection), }; RoundedDouble testLevel = (RoundedDouble) random.NextDouble(); HydraulicBoundaryLocation hydraulicBoundaryLocation = TestHydraulicBoundaryLocation.CreateDesignWaterLevelCalculated( testLevel); var selectableHydraulicBoundaryLocation = new SelectableHydraulicBoundaryLocation(hydraulicBoundaryLocation, null); // When properties.UseAssessmentLevelManualInput = false; properties.SelectedHydraulicBoundaryLocation = selectableHydraulicBoundaryLocation; // Then Assert.AreEqual(2, properties.AssessmentLevel.NumberOfDecimalPlaces); Assert.AreSame(hydraulicBoundaryLocation, properties.SelectedHydraulicBoundaryLocation.HydraulicBoundaryLocation); Assert.AreEqual(testLevel, properties.AssessmentLevel, properties.AssessmentLevel.GetAccuracy()); mocks.VerifyAll(); } [Test] public void SurfaceLine_NewSurfaceLine_StochasticSoilModelAndSoilProfileSetToNull() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()) { InputParameters = { SurfaceLine = ValidSurfaceLine(0.0, 4.0) } }; PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = calculationItem.InputParameters; PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection) }; inputParameters.StochasticSoilProfile = new StochasticSoilProfile(0.0, SoilProfileType.SoilProfile1D, 0) { SoilProfile = new TestPipingSoilProfile() }; // Call properties.SurfaceLine = ValidSurfaceLine(0, 2); // Assert Assert.IsNull(inputParameters.StochasticSoilModel); Assert.IsNull(inputParameters.StochasticSoilProfile); mocks.VerifyAll(); } [Test] public void SurfaceLine_SameSurfaceLine_SoilProfileUnchanged() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); RingtoetsPipingSurfaceLine testSurfaceLine = ValidSurfaceLine(0, 2); StochasticSoilProfile stochasticSoilProfile = new StochasticSoilProfile(0.0, SoilProfileType.SoilProfile1D, 0) { SoilProfile = new TestPipingSoilProfile() }; StochasticSoilModel stochasticSoilModel = new StochasticSoilModel(0, "StochasticSoilModelName", "StochasticSoilModelSegmentName"); stochasticSoilModel.StochasticSoilProfiles.Add(stochasticSoilProfile); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { SurfaceLine = testSurfaceLine, StochasticSoilModel = stochasticSoilModel, StochasticSoilProfile = stochasticSoilProfile }; PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), new[] { stochasticSoilModel }, failureMechanism, assessmentSection) }; // Call properties.SurfaceLine = testSurfaceLine; // Assert Assert.AreSame(stochasticSoilModel, inputParameters.StochasticSoilModel); Assert.AreSame(stochasticSoilProfile, inputParameters.StochasticSoilProfile); mocks.VerifyAll(); } [Test] public void SurfaceLine_DifferentSurfaceLine_StochasticSoilModelAndSoilProfileSetToNull() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); StochasticSoilProfile testPipingSoilProfile = new StochasticSoilProfile(0.0, SoilProfileType.SoilProfile1D, 0) { SoilProfile = new TestPipingSoilProfile() }; StochasticSoilModel stochasticSoilModel = new StochasticSoilModel(0, "StochasticSoilModelName", "StochasticSoilModelSegmentName"); stochasticSoilModel.StochasticSoilProfiles.Add(testPipingSoilProfile); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()) { InputParameters = { SurfaceLine = ValidSurfaceLine(0, 4), StochasticSoilModel = stochasticSoilModel, StochasticSoilProfile = testPipingSoilProfile } }; PipingInput inputParameters = calculationItem.InputParameters; PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), new[] { stochasticSoilModel }, failureMechanism, assessmentSection) }; // Call properties.SurfaceLine = ValidSurfaceLine(0, 2); // Assert Assert.IsNull(inputParameters.StochasticSoilModel); Assert.IsNull(inputParameters.StochasticSoilProfile); mocks.VerifyAll(); } [Test] public void StochasticSoilProfile_DifferentStochasticSoilModel_SoilProfileSetToNull() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); RingtoetsPipingSurfaceLine testSurfaceLine = ValidSurfaceLine(0, 2); StochasticSoilProfile stochasticSoilProfile1 = new StochasticSoilProfile(0.0, SoilProfileType.SoilProfile1D, 0) { SoilProfile = new TestPipingSoilProfile() }; StochasticSoilModel stochasticSoilModel1 = new StochasticSoilModel(0, "StochasticSoilModel1Name", "StochasticSoilModelSegment1Name"); stochasticSoilModel1.StochasticSoilProfiles.Add(stochasticSoilProfile1); StochasticSoilProfile stochasticSoilProfile2 = new StochasticSoilProfile(0.0, SoilProfileType.SoilProfile1D, 0) { SoilProfile = new TestPipingSoilProfile() }; StochasticSoilModel stochasticSoilModel2 = new StochasticSoilModel(0, "StochasticSoilModel2Name", "StochasticSoilModelSegment2Name"); stochasticSoilModel1.StochasticSoilProfiles.Add(stochasticSoilProfile2); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()) { SurfaceLine = testSurfaceLine, StochasticSoilModel = stochasticSoilModel1, StochasticSoilProfile = stochasticSoilProfile1 }; PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInputContextProperties properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection) }; // Call properties.StochasticSoilModel = stochasticSoilModel2; // Assert Assert.IsNull(inputParameters.StochasticSoilProfile); mocks.VerifyAll(); } [Test] [TestCase(1)] [TestCase(2)] public void GivenCompletePipingInputContextProperties_WhenPhreaticLevelExitPropertiesSetThroughProperties_ThenPiezometricHeadExitUpdated(int propertyIndexToChange) { // Given var mocks = new MockRepository(); var typeDescriptorContext = mocks.StrictMock(); var assessmentSection = mocks.Stub(); PipingCalculationScenario calculationItem = new PipingCalculationScenario(new GeneralPipingInput()); PipingFailureMechanism failureMechanism = new PipingFailureMechanism(); PipingInput inputParameters = new PipingInput(new GeneralPipingInput()); PipingInputContextProperties contextProperties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculationItem, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection) }; inputParameters.HydraulicBoundaryLocation = TestHydraulicBoundaryLocation.CreateDesignWaterLevelCalculated(1.0); DesignVariable phreaticLevelExitProperty = contextProperties.PhreaticLevelExit; DynamicPropertyBag dynamicPropertyBag = new DynamicPropertyBag(contextProperties); typeDescriptorContext.Expect(tdc => tdc.Instance).Return(dynamicPropertyBag).Repeat.Twice(); typeDescriptorContext.Stub(tdc => tdc.PropertyDescriptor).Return(dynamicPropertyBag.GetProperties()["PhreaticLevelExit"]); mocks.ReplayAll(); PropertyDescriptorCollection properties = new NormalDistributionDesignVariableTypeConverter().GetProperties(typeDescriptorContext, phreaticLevelExitProperty); Assert.NotNull(properties); // When properties[propertyIndexToChange].SetValue(phreaticLevelExitProperty, (RoundedDouble) 2.3); // Then Assert.IsFalse(double.IsNaN(inputParameters.PiezometricHeadExit)); mocks.VerifyAll(); } [Test] public void GetAvailableSurfaceLines_Always_ReturnAllRingtoetsPipingSurfaceLines() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput); var context = new PipingInputContext(calculation.InputParameters, calculation, failureMechanism.SurfaceLines, failureMechanism.StochasticSoilModels, failureMechanism, assessmentSection); var properties = new PipingInputContextProperties { Data = context }; // Call IEnumerable surfaceLines = properties.GetAvailableSurfaceLines(); // Assert Assert.AreSame(context.AvailablePipingSurfaceLines, surfaceLines); mocks.VerifyAll(); } [Test] public void GetAvailableStochasticSoilModels_NoSurfaceLineAssigned_ReturnAllStochasticSoilModels() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput); var context = new PipingInputContext(calculation.InputParameters, calculation, failureMechanism.SurfaceLines, failureMechanism.StochasticSoilModels, failureMechanism, assessmentSection); var properties = new PipingInputContextProperties { Data = context }; // Precondition: Assert.IsNull(calculation.InputParameters.SurfaceLine); // Call IEnumerable soilModels = properties.GetAvailableStochasticSoilModels(); // Assert Assert.AreSame(context.AvailableStochasticSoilModels, soilModels); mocks.VerifyAll(); } [Test] public void GetAvailableStochasticSoilModels_SurfaceLineAssigned_ReturnMatchingSubsetOfStochasticSoilModels() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); var surfaceLine = new RingtoetsPipingSurfaceLine(); surfaceLine.SetGeometry(new[] { new Point3D(0, 0, 0), new Point3D(10, 0, 0) }); var failureMechanism = new PipingFailureMechanism { StochasticSoilModels = { new StochasticSoilModel(1, "A", "B") { Geometry = { new Point2D(2, -1), new Point2D(2, 1) }, StochasticSoilProfiles = { new StochasticSoilProfile(0.2, SoilProfileType.SoilProfile1D, 1) } }, new StochasticSoilModel(2, "C", "D") { Geometry = { new Point2D(-2, -1), new Point2D(-2, 1) }, StochasticSoilProfiles = { new StochasticSoilProfile(0.3, SoilProfileType.SoilProfile1D, 2) } }, new StochasticSoilModel(3, "E", "F") { Geometry = { new Point2D(6, -1), new Point2D(6, 1) }, StochasticSoilProfiles = { new StochasticSoilProfile(0.3, SoilProfileType.SoilProfile1D, 3) } } } }; var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput) { InputParameters = { SurfaceLine = surfaceLine } }; var context = new PipingInputContext(calculation.InputParameters, calculation, failureMechanism.SurfaceLines, failureMechanism.StochasticSoilModels, failureMechanism, assessmentSection); var properties = new PipingInputContextProperties { Data = context }; // Precondition: Assert.IsNotNull(calculation.InputParameters.SurfaceLine); // Call IEnumerable soilModels = properties.GetAvailableStochasticSoilModels(); // Assert CollectionAssert.AreEqual(new[] { failureMechanism.StochasticSoilModels[0], failureMechanism.StochasticSoilModels[2] }, soilModels); mocks.VerifyAll(); } [Test] public void GetAvailableStochasticSoilProfiles_NoStochasticSoilModel_ReturnEmpty() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput); var context = new PipingInputContext(calculation.InputParameters, calculation, failureMechanism.SurfaceLines, failureMechanism.StochasticSoilModels, failureMechanism, assessmentSection); var properties = new PipingInputContextProperties { Data = context }; // Precondition Assert.IsNull(calculation.InputParameters.StochasticSoilModel); // Call IEnumerable profiles = properties.GetAvailableStochasticSoilProfiles(); // Assert CollectionAssert.IsEmpty(profiles); mocks.VerifyAll(); } [Test] public void GetAvailableStochasticSoilProfiles_StochasticSoilModel_ReturnAssignedSoilModelProfiles() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var model = new StochasticSoilModel(1, "A", "B") { StochasticSoilProfiles = { new StochasticSoilProfile(1.0, SoilProfileType.SoilProfile1D, 1) } }; var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput) { InputParameters = { StochasticSoilModel = model } }; var context = new PipingInputContext(calculation.InputParameters, calculation, failureMechanism.SurfaceLines, failureMechanism.StochasticSoilModels, failureMechanism, assessmentSection); var properties = new PipingInputContextProperties { Data = context }; // Precondition Assert.IsNotNull(calculation.InputParameters.StochasticSoilModel); // Call IEnumerable profiles = properties.GetAvailableStochasticSoilProfiles(); // Assert CollectionAssert.AreEqual(model.StochasticSoilProfiles, profiles); mocks.VerifyAll(); } [Test] public void SelectedHydraulicBoundaryLocation_InputNoLocation_ReturnsNull() { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput); var context = new PipingInputContext(calculation.InputParameters, calculation, failureMechanism.SurfaceLines, failureMechanism.StochasticSoilModels, failureMechanism, assessmentSection); var properties = new PipingInputContextProperties { Data = context }; SelectableHydraulicBoundaryLocation selectedHydraulicBoundaryLocation = null; // Call TestDelegate call = () => selectedHydraulicBoundaryLocation = properties.SelectedHydraulicBoundaryLocation; // Assert Assert.DoesNotThrow(call); Assert.IsNull(selectedHydraulicBoundaryLocation); mocks.VerifyAll(); } [Test] public void GetSelectableHydraulicBoundaryLocations_WithLocationsNoSurfaceLine_ReturnLocationsSortedById() { // Setup var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase() { Locations = { new HydraulicBoundaryLocation(1, "A", 0, 1), new HydraulicBoundaryLocation(4, "C", 0, 2), new HydraulicBoundaryLocation(3, "D", 0, 3), new HydraulicBoundaryLocation(2, "B", 0, 4) } }; var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); assessmentSection.HydraulicBoundaryDatabase = hydraulicBoundaryDatabase; mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput); var context = new PipingInputContext(calculation.InputParameters, calculation, failureMechanism.SurfaceLines, failureMechanism.StochasticSoilModels, failureMechanism, assessmentSection); var properties = new PipingInputContextProperties { Data = context }; // Call IEnumerable selectableHydraulicBoundaryLocations = properties.GetSelectableHydraulicBoundaryLocations(); // Assert IEnumerable expectedList = hydraulicBoundaryDatabase.Locations.Select(hbl => new SelectableHydraulicBoundaryLocation(hbl, null)) .OrderBy(hbl => hbl.HydraulicBoundaryLocation.Id); CollectionAssert.AreEqual(expectedList, selectableHydraulicBoundaryLocations); mocks.VerifyAll(); } [Test] public void GetSelectableHydraulicBoundaryLocations_WithLocationsAndSurfaceLine_ReturnLocationsSortedByDistanceThenById() { // Setup var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase() { Locations = { new HydraulicBoundaryLocation(1, "A", 0, 10), new HydraulicBoundaryLocation(4, "E", 0, 500), new HydraulicBoundaryLocation(6, "F", 0, 100), new HydraulicBoundaryLocation(5, "D", 0, 200), new HydraulicBoundaryLocation(3, "C", 0, 200), new HydraulicBoundaryLocation(2, "B", 0, 200) } }; var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); assessmentSection.HydraulicBoundaryDatabase = hydraulicBoundaryDatabase; mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput); var context = new PipingInputContext(calculation.InputParameters, calculation, failureMechanism.SurfaceLines, failureMechanism.StochasticSoilModels, failureMechanism, assessmentSection); RingtoetsPipingSurfaceLine surfaceLine = ValidSurfaceLine(0.0, 4.0); surfaceLine.ReferenceLineIntersectionWorldPoint = new Point2D(0.0, 0.0); var properties = new PipingInputContextProperties { Data = context, SurfaceLine = surfaceLine }; // Call IEnumerable selectableHydraulicBoundaryLocations = properties.GetSelectableHydraulicBoundaryLocations(); // Assert IEnumerable expectedList = hydraulicBoundaryDatabase.Locations.Select(hbl => new SelectableHydraulicBoundaryLocation( hbl, surfaceLine.ReferenceLineIntersectionWorldPoint)) .OrderBy(hbl => hbl.Distance) .ThenBy(hbl => hbl.HydraulicBoundaryLocation.Id); CollectionAssert.AreEqual(expectedList, selectableHydraulicBoundaryLocations); mocks.VerifyAll(); } [Test] public void GivenLocationAndReferencePoint_WhenUpdatingSurfaceLine_ThenUpdateSelectableBoundaryLocations() { // Given var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase() { Locations = { new HydraulicBoundaryLocation(1, "A", 0, 10), new HydraulicBoundaryLocation(4, "E", 0, 500), new HydraulicBoundaryLocation(6, "F", 0, 100), new HydraulicBoundaryLocation(5, "D", 0, 200), new HydraulicBoundaryLocation(3, "C", 0, 200), new HydraulicBoundaryLocation(2, "B", 0, 200) } }; var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); assessmentSection.HydraulicBoundaryDatabase = hydraulicBoundaryDatabase; mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput); var context = new PipingInputContext(calculation.InputParameters, calculation, failureMechanism.SurfaceLines, failureMechanism.StochasticSoilModels, failureMechanism, assessmentSection); var surfaceLine = ValidSurfaceLine(0.0, 4.0); surfaceLine.ReferenceLineIntersectionWorldPoint = new Point2D(0, 0); var properties = new PipingInputContextProperties { Data = context, SurfaceLine = surfaceLine }; IEnumerable originalList = properties.GetSelectableHydraulicBoundaryLocations() .ToList(); var newSurfaceLine = ValidSurfaceLine(0.0, 5.0); newSurfaceLine.ReferenceLineIntersectionWorldPoint = new Point2D(0, 190); // When properties.SurfaceLine = newSurfaceLine; // Then IEnumerable availableHydraulicBoundaryLocations = properties.GetSelectableHydraulicBoundaryLocations().ToList(); CollectionAssert.AreNotEqual(originalList, availableHydraulicBoundaryLocations); IEnumerable expectedList = hydraulicBoundaryDatabase.Locations .Select(hbl => new SelectableHydraulicBoundaryLocation(hbl, properties.SurfaceLine.ReferenceLineIntersectionWorldPoint)) .OrderBy(hbl => hbl.Distance) .ThenBy(hbl => hbl.HydraulicBoundaryLocation.Id); CollectionAssert.AreEqual(expectedList, availableHydraulicBoundaryLocations); mocks.VerifyAll(); } [Test] [TestCase(true)] [TestCase(false)] public void DynamicReadOnlyValidationMethod_AssessmentLevel_DependsOnUseCustomAssessmentLevel(bool useCustomAssessmentLevel) { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput) { InputParameters = { UseAssessmentLevelManualInput = useCustomAssessmentLevel } }; var context = new PipingInputContext(calculation.InputParameters, calculation, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection); var properties = new PipingInputContextProperties { Data = context }; // Call var result = properties.DynamicReadOnlyValidationMethod("AssessmentLevel"); // Assert Assert.AreNotEqual(useCustomAssessmentLevel, result); } [Test] public void DynamicReadOnlyValidationMethod_AnyOtherProperty_ReturnsTrue() { // Setup var properties = new PipingInputContextProperties(); // Call var result = properties.DynamicReadOnlyValidationMethod("prop"); // Assert Assert.IsTrue(result); } [Test] [TestCase(true)] [TestCase(false)] public void DynamicVisibleValidationMethod_SelectedHydraulicBoundaryLocation_DependsOnUseCustomAssessmentLevel(bool useCustomAssessmentLevel) { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); var failureMechanism = new PipingFailureMechanism(); var calculation = new PipingCalculationScenario(failureMechanism.GeneralInput) { InputParameters = { UseAssessmentLevelManualInput = useCustomAssessmentLevel } }; var context = new PipingInputContext(calculation.InputParameters, calculation, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection); var properties = new PipingInputContextProperties { Data = context }; // Call var result = properties.DynamicVisibleValidationMethod("SelectedHydraulicBoundaryLocation"); // Assert Assert.AreNotEqual(useCustomAssessmentLevel, result); } [Test] public void DynamicVisibleValidationMethod_AnyOtherProperty_ReturnsFalse() { // Setup var properties = new PipingInputContextProperties(); // Call var result = properties.DynamicVisibleValidationMethod("prop"); // Assert Assert.IsFalse(result); } private void SetPropertyAndVerifyNotifcationsAndOutput(bool hasOutput, Action setProperty) { SetPropertyAndVerifyNotifcationsAndOutputForCalculation( hasOutput, setProperty, new PipingCalculationScenario(new GeneralPipingInput())); } private void SetPropertyAndVerifyNotifcationsAndOutputForCalculation( bool hasOutput, Action setProperty, PipingCalculationScenario calculation) { // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); var calculationObserver = mocks.StrictMock(); int numberOfChangedProperties = hasOutput ? 1 : 0; calculationObserver.Expect(o => o.UpdateObserver()).Repeat.Times(numberOfChangedProperties); var inputObserver = mocks.StrictMock(); inputObserver.Expect(o => o.UpdateObserver()); mocks.ReplayAll(); if (hasOutput) { calculation.Output = new TestPipingOutput(); } calculation.Attach(calculationObserver); PipingInput inputParameters = calculation.InputParameters; inputParameters.Attach(inputObserver); var failureMechanism = new PipingFailureMechanism(); var properties = new PipingInputContextProperties { Data = new PipingInputContext(inputParameters, calculation, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, assessmentSection) }; // Call setProperty(properties); // Assert Assert.IsFalse(calculation.HasOutput); mocks.VerifyAll(); } private static StochasticSoilModel ValidStochasticSoilModel(double xMin, double xMax) { StochasticSoilModel stochasticSoilModel = new StochasticSoilModel(0, "StochasticSoilModelName", "StochasticSoilModelSegmentName"); stochasticSoilModel.StochasticSoilProfiles.Add(new StochasticSoilProfile(0.0, SoilProfileType.SoilProfile1D, 1234) { SoilProfile = new TestPipingSoilProfile() }); stochasticSoilModel.Geometry.Add(new Point2D(xMin, 1.0)); stochasticSoilModel.Geometry.Add(new Point2D(xMax, 0.0)); return stochasticSoilModel; } private static RingtoetsPipingSurfaceLine ValidSurfaceLine(double xMin, double xMax) { RingtoetsPipingSurfaceLine surfaceLine = new RingtoetsPipingSurfaceLine(); surfaceLine.SetGeometry(new[] { new Point3D(xMin, 0.0, 0.0), new Point3D(xMax, 0.0, 1.0) }); return surfaceLine; } } }