예제 #1
0
        private static void SetInputParameters(GrassCoverErosionOutwardsWaveConditionsCalculationEntity entity,
                                               GrassCoverErosionOutwardsWaveConditionsInput calculationInput,
                                               PersistenceRegistry registry)
        {
            HydraulicBoundaryLocation hydraulicBoundaryLocation = calculationInput.HydraulicBoundaryLocation;

            if (hydraulicBoundaryLocation != null)
            {
                entity.HydraulicLocationEntity = registry.Get(hydraulicBoundaryLocation);
            }

            if (calculationInput.ForeshoreProfile != null)
            {
                entity.ForeshoreProfileEntity = calculationInput.ForeshoreProfile.Create(registry, 0);
            }

            if (calculationInput.CalculationsTargetProbability != null)
            {
                entity.HydraulicLocationCalculationForTargetProbabilityCollectionEntity =
                    calculationInput.CalculationsTargetProbability.Create(HydraulicBoundaryLocationCalculationType.WaterLevel, 0, registry);
            }

            entity.Orientation              = calculationInput.Orientation.ToNaNAsNull();
            entity.UseBreakWater            = Convert.ToByte(calculationInput.UseBreakWater);
            entity.BreakWaterType           = Convert.ToByte(calculationInput.BreakWater.Type);
            entity.BreakWaterHeight         = calculationInput.BreakWater.Height.ToNaNAsNull();
            entity.UseForeshore             = Convert.ToByte(calculationInput.UseForeshore);
            entity.UpperBoundaryRevetment   = calculationInput.UpperBoundaryRevetment.ToNaNAsNull();
            entity.LowerBoundaryRevetment   = calculationInput.LowerBoundaryRevetment.ToNaNAsNull();
            entity.UpperBoundaryWaterLevels = calculationInput.UpperBoundaryWaterLevels.ToNaNAsNull();
            entity.LowerBoundaryWaterLevels = calculationInput.LowerBoundaryWaterLevels.ToNaNAsNull();
            entity.StepSize        = Convert.ToByte(calculationInput.StepSize);
            entity.CalculationType = Convert.ToByte(calculationInput.CalculationType);
            entity.WaterLevelType  = Convert.ToByte(calculationInput.WaterLevelType);
        }
        public void AddCalculationsFromLocations_MultipleLocationsEmptyCalculationBase_ReturnsUniquelyNamedCalculationsWithCorrectInputSet(
            NormativeProbabilityType normativeProbabilityType,
            WaveConditionsInputWaterLevelType expectedWaveConditionsInputWaterLevelType)
        {
            // Setup
            const string name      = "name";
            var          locations = new[]
            {
                new HydraulicBoundaryLocation(1, name, 1, 1),
                new HydraulicBoundaryLocation(2, name, 2, 2)
            };
            var calculationBases = new List <ICalculationBase>();

            // Call
            GrassCoverErosionOutwardsWaveConditionsCalculationHelper.AddCalculationsFromLocations(locations, calculationBases, normativeProbabilityType);

            // Assert
            Assert.AreEqual(2, calculationBases.Count);
            var firstCalculation = (GrassCoverErosionOutwardsWaveConditionsCalculation)calculationBases.First();

            Assert.AreEqual(name, firstCalculation.Name);
            GrassCoverErosionOutwardsWaveConditionsInput firstCalculationInput = firstCalculation.InputParameters;

            Assert.AreEqual(locations[0], firstCalculationInput.HydraulicBoundaryLocation);
            Assert.AreEqual(expectedWaveConditionsInputWaterLevelType, firstCalculationInput.WaterLevelType);

            var secondCalculation = (GrassCoverErosionOutwardsWaveConditionsCalculation)calculationBases.ElementAt(1);

            Assert.AreEqual($"{name} (1)", secondCalculation.Name);
            GrassCoverErosionOutwardsWaveConditionsInput secondCalculationInput = secondCalculation.InputParameters;

            Assert.AreSame(locations[1], secondCalculationInput.HydraulicBoundaryLocation);
            Assert.AreEqual(expectedWaveConditionsInputWaterLevelType, secondCalculationInput.WaterLevelType);
        }
예제 #3
0
        public void Constructor_CalculationTypeWaveRunUpOrWaveImpact_PropertiesHaveExpectedAttributesValues(
            GrassCoverErosionOutwardsWaveConditionsCalculationType calculationType, string expectedDisplayName, string expectedDescription)
        {
            // Setup
            GrassCoverErosionOutwardsWaveConditionsOutput output = GrassCoverErosionOutwardsWaveConditionsOutputTestFactory.Create();
            var input = new GrassCoverErosionOutwardsWaveConditionsInput
            {
                CalculationType = calculationType
            };

            // Call
            var properties = new GrassCoverErosionOutwardsWaveConditionsOutputProperties(output, input);

            // Assert
            PropertyDescriptorCollection dynamicProperties = PropertiesTestHelper.GetAllVisiblePropertyDescriptors(properties);

            Assert.AreEqual(1, dynamicProperties.Count);

            PropertyDescriptor outputProperty = dynamicProperties[0];

            PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(outputProperty,
                                                                            "Resultaat",
                                                                            expectedDisplayName,
                                                                            expectedDescription,
                                                                            true);
        }
        public void Read_EntityWithNullValues_ReturnCalculationWithNaNValues()
        {
            // Setup
            var entity    = new GrassCoverErosionOutwardsWaveConditionsCalculationEntity();
            var collector = new ReadConversionCollector();

            // Call
            GrassCoverErosionOutwardsWaveConditionsCalculation calculation = entity.Read(collector);

            // Assert
            Assert.IsNull(calculation.Name);
            Assert.IsNull(calculation.Comments.Body);

            GrassCoverErosionOutwardsWaveConditionsInput calculationInput = calculation.InputParameters;

            Assert.IsNaN(calculationInput.BreakWater.Height);
            Assert.IsNaN(calculationInput.Orientation);
            Assert.IsNaN(calculationInput.UpperBoundaryRevetment);
            Assert.IsNaN(calculationInput.LowerBoundaryRevetment);
            Assert.IsNaN(calculationInput.UpperBoundaryWaterLevels);
            Assert.IsNaN(calculationInput.LowerBoundaryWaterLevels);

            Assert.IsNull(calculationInput.HydraulicBoundaryLocation);
            Assert.IsNull(calculationInput.ForeshoreProfile);
            Assert.IsNull(calculation.Output);
        }
        public void Constructor_ExpectedValues()
        {
            // Call
            var input = new GrassCoverErosionOutwardsWaveConditionsInput();

            // Assert
            Assert.IsInstanceOf <WaveConditionsInput>(input);
            Assert.AreEqual(GrassCoverErosionOutwardsWaveConditionsCalculationType.WaveRunUpAndWaveImpact, input.CalculationType);
        }
예제 #6
0
        /// <summary>
        /// Creates a new instance of <see cref="GrassCoverErosionOutwardsWaveConditionsOutputContext"/>.
        /// </summary>
        /// <param name="wrappedData">The wrapped data.</param>
        /// <param name="input">The input belonging to the wrapped data.</param>
        /// <exception cref="ArgumentNullException">Thrown when any parameter is <c>null</c>.</exception>
        public GrassCoverErosionOutwardsWaveConditionsOutputContext(GrassCoverErosionOutwardsWaveConditionsOutput wrappedData,
                                                                    GrassCoverErosionOutwardsWaveConditionsInput input)
            : base(wrappedData)
        {
            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }

            Input = input;
        }
예제 #7
0
        public void Constructor_WithArguments_ExpectedValues()
        {
            // Setup
            GrassCoverErosionOutwardsWaveConditionsOutput output = GrassCoverErosionOutwardsWaveConditionsOutputTestFactory.Create();
            var input = new GrassCoverErosionOutwardsWaveConditionsInput();

            // Call
            var context = new GrassCoverErosionOutwardsWaveConditionsOutputContext(output, input);

            // Assert
            Assert.IsInstanceOf <ObservableWrappedObjectContextBase <GrassCoverErosionOutwardsWaveConditionsOutput> >(context);
            Assert.AreSame(input, context.Input);
            Assert.AreSame(output, context.WrappedData);
        }
예제 #8
0
        public void Create_CalculationWithPropertiesSet_ReturnCalculationEntity()
        {
            // Setup
            var random = new Random(21);
            int order  = random.Next();

            var calculation = new GrassCoverErosionOutwardsWaveConditionsCalculation
            {
                InputParameters =
                {
                    Orientation              = random.NextRoundedDouble(0,                                                      360),
                    UseBreakWater            = random.NextBoolean(),
                    UseForeshore             = random.NextBoolean(),
                    UpperBoundaryRevetment   = (RoundedDouble)6.10,
                    LowerBoundaryRevetment   = (RoundedDouble)3.58,
                    UpperBoundaryWaterLevels = (RoundedDouble)5.88,
                    LowerBoundaryWaterLevels = (RoundedDouble)3.40,
                    StepSize        = random.NextEnumValue <WaveConditionsInputStepSize>(),
                    CalculationType = random.NextEnumValue <GrassCoverErosionOutwardsWaveConditionsCalculationType>(),
                    WaterLevelType  = random.NextEnumValue <WaveConditionsInputWaterLevelType>()
                }
            };

            var registry = new PersistenceRegistry();

            // Call
            GrassCoverErosionOutwardsWaveConditionsCalculationEntity entity = calculation.Create(registry, order);

            // Assert
            GrassCoverErosionOutwardsWaveConditionsInput input = calculation.InputParameters;

            Assert.AreEqual(input.Orientation, entity.Orientation, input.Orientation.GetAccuracy());
            Assert.AreEqual(Convert.ToByte(input.UseBreakWater), entity.UseBreakWater);
            Assert.AreEqual(Convert.ToByte(input.UseForeshore), entity.UseForeshore);
            Assert.AreEqual(input.UpperBoundaryRevetment, entity.UpperBoundaryRevetment, input.UpperBoundaryRevetment.GetAccuracy());
            Assert.AreEqual(input.LowerBoundaryRevetment, entity.LowerBoundaryRevetment, input.LowerBoundaryRevetment.GetAccuracy());
            Assert.AreEqual(input.UpperBoundaryWaterLevels, entity.UpperBoundaryWaterLevels, input.UpperBoundaryWaterLevels.GetAccuracy());
            Assert.AreEqual(input.LowerBoundaryWaterLevels, entity.LowerBoundaryWaterLevels, input.LowerBoundaryWaterLevels.GetAccuracy());
            Assert.AreEqual(Convert.ToByte(input.StepSize), entity.StepSize);
            Assert.AreEqual(Convert.ToByte(input.CalculationType), entity.CalculationType);
            Assert.AreEqual(Convert.ToByte(input.WaterLevelType), entity.WaterLevelType);

            Assert.AreEqual(order, entity.Order);
            Assert.IsNull(entity.CalculationGroupEntity);
            CollectionAssert.IsEmpty(entity.GrassCoverErosionOutwardsWaveConditionsOutputEntities);
            Assert.IsNull(entity.ForeshoreProfileEntity);
            Assert.IsNull(entity.HydraulicLocationEntity);
            Assert.IsNull(entity.HydraulicLocationCalculationForTargetProbabilityCollectionEntity);
        }
        public void Clone_AllPropertiesSet_ReturnNewInstanceWithCopiedValues()
        {
            // Setup
            var random   = new Random(21);
            var original = new GrassCoverErosionOutwardsWaveConditionsInput();

            WaveConditionsTestDataGenerator.SetRandomDataToWaveConditionsInput(original);
            original.CalculationType = random.NextEnumValue <GrassCoverErosionOutwardsWaveConditionsCalculationType>();

            // Call
            object clone = original.Clone();

            // Assert
            CoreCloneAssert.AreObjectClones(original, clone, GrassCoverErosionOutwardsCloneAssert.AreClones);
        }
        public void Clone_NotAllPropertiesSet_ReturnNewInstanceWithCopiedValues()
        {
            // Setup
            var original = new GrassCoverErosionOutwardsWaveConditionsInput();

            WaveConditionsTestDataGenerator.SetRandomDataToWaveConditionsInput(original);

            original.ForeshoreProfile          = null;
            original.HydraulicBoundaryLocation = null;

            // Call
            object clone = original.Clone();

            // Assert
            CoreCloneAssert.AreObjectClones(original, clone, GrassCoverErosionOutwardsCloneAssert.AreClones);
        }
예제 #11
0
        /// <summary>
        /// Creates a new instance of <see cref="GrassCoverErosionOutwardsWaveConditionsOutputProperties"/>.
        /// </summary>
        /// <param name="output">The data to show.</param>
        /// <param name="input">The input belonging to the output.</param>
        /// <exception cref="ArgumentNullException">Thrown when any parameter is <c>null</c>.</exception>
        public GrassCoverErosionOutwardsWaveConditionsOutputProperties(GrassCoverErosionOutwardsWaveConditionsOutput output,
                                                                       GrassCoverErosionOutwardsWaveConditionsInput input)
        {
            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }

            this.input = input;

            Data = output;
        }
예제 #12
0
        public void DynamicVisibleValidationMethod_DependingOnRelevancy_ReturnExpectedVisibility(
            GrassCoverErosionOutwardsWaveConditionsCalculationType calculationType, bool waveRunUpVisible, bool waveImpactVisible, bool waveImpactWithWaveDirectionVisible)
        {
            // Setup
            GrassCoverErosionOutwardsWaveConditionsOutput output = GrassCoverErosionOutwardsWaveConditionsOutputTestFactory.Create();
            var input = new GrassCoverErosionOutwardsWaveConditionsInput
            {
                CalculationType = calculationType
            };

            var properties = new GrassCoverErosionOutwardsWaveConditionsOutputProperties(output, input);

            // Call & Assert
            Assert.AreEqual(waveRunUpVisible, properties.DynamicVisibleValidationMethod(nameof(properties.WaveRunUpOutput)));
            Assert.AreEqual(waveImpactVisible, properties.DynamicVisibleValidationMethod(nameof(properties.WaveImpactOutput)));
            Assert.AreEqual(waveImpactWithWaveDirectionVisible, properties.DynamicVisibleValidationMethod(nameof(properties.WaveImpactWithWaveDirectionOutput)));
            Assert.IsFalse(properties.DynamicVisibleValidationMethod(null));
        }
예제 #13
0
        public void Constructor_CalculationTypeAll_PropertiesHaveExpectedAttributesValues()
        {
            // Setup
            GrassCoverErosionOutwardsWaveConditionsOutput output = GrassCoverErosionOutwardsWaveConditionsOutputTestFactory.Create();
            var input = new GrassCoverErosionOutwardsWaveConditionsInput
            {
                CalculationType = GrassCoverErosionOutwardsWaveConditionsCalculationType.All
            };

            // Precondition
            Assert.AreEqual(GrassCoverErosionOutwardsWaveConditionsCalculationType.All, input.CalculationType);

            // Call
            var properties = new GrassCoverErosionOutwardsWaveConditionsOutputProperties(output, input);

            // Assert
            PropertyDescriptorCollection dynamicProperties = PropertiesTestHelper.GetAllVisiblePropertyDescriptors(properties);

            Assert.AreEqual(3, dynamicProperties.Count);

            PropertyDescriptor waveRunUpProperty = dynamicProperties[waveRunUpPropertyIndex];

            PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(waveRunUpProperty,
                                                                            "Resultaat",
                                                                            "Hydraulische belastingen voor golfoploop",
                                                                            "Berekende hydraulische belastingen voor golfoploop.",
                                                                            true);

            PropertyDescriptor waveImpactProperty = dynamicProperties[waveImpactPropertyIndex];

            PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(waveImpactProperty,
                                                                            "Resultaat",
                                                                            "Hydraulische belastingen voor golfklap",
                                                                            "Berekende hydraulische belastingen voor golfklap zonder invloed van de golfinvalshoek.",
                                                                            true);

            PropertyDescriptor waveImpactWithWaveDirectionProperty = dynamicProperties[waveImpactWithWaveDirectionPropertyIndex];

            PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(waveImpactWithWaveDirectionProperty,
                                                                            "Resultaat",
                                                                            "Hydraulische belastingen voor golfklap met golfrichting",
                                                                            "Berekende hydraulische belastingen voor golfklap met invloed van de golfinvalshoek.",
                                                                            true);
        }
예제 #14
0
        private void DetermineTotalWaterLevelCalculations(GrassCoverErosionOutwardsWaveConditionsInput calculationInput,
                                                          RoundedDouble assessmentLevel)
        {
            int waterLevelCount = calculationInput.GetWaterLevels(assessmentLevel).Count();
            GrassCoverErosionOutwardsWaveConditionsCalculationType calculationType = calculationInput.CalculationType;

            if (calculationType == GrassCoverErosionOutwardsWaveConditionsCalculationType.All)
            {
                TotalWaterLevelCalculations = waterLevelCount * 3;
                return;
            }

            if (calculationType == GrassCoverErosionOutwardsWaveConditionsCalculationType.WaveRunUpAndWaveImpact ||
                calculationType == GrassCoverErosionOutwardsWaveConditionsCalculationType.WaveRunUpAndWaveImpactWithWaveDirection)
            {
                TotalWaterLevelCalculations = waterLevelCount * 2;
                return;
            }

            TotalWaterLevelCalculations = waterLevelCount;
        }
예제 #15
0
        private static void ReadCalculationInputs(GrassCoverErosionOutwardsWaveConditionsInput inputParameters,
                                                  GrassCoverErosionOutwardsWaveConditionsCalculationEntity entity,
                                                  ReadConversionCollector collector)
        {
            inputParameters.ForeshoreProfile              = GetDikeProfileValue(entity.ForeshoreProfileEntity, collector);
            inputParameters.HydraulicBoundaryLocation     = GetHydraulicBoundaryLocationValue(entity.HydraulicLocationEntity, collector);
            inputParameters.CalculationsTargetProbability = GetHydraulicBoundaryLocationCalculationsForTargetProbabilityValue(
                entity.HydraulicLocationCalculationForTargetProbabilityCollectionEntity, collector);

            inputParameters.Orientation              = (RoundedDouble)entity.Orientation.ToNullAsNaN();
            inputParameters.UseForeshore             = Convert.ToBoolean(entity.UseForeshore);
            inputParameters.UseBreakWater            = Convert.ToBoolean(entity.UseBreakWater);
            inputParameters.BreakWater.Height        = (RoundedDouble)entity.BreakWaterHeight.ToNullAsNaN();
            inputParameters.BreakWater.Type          = (BreakWaterType)entity.BreakWaterType;
            inputParameters.UpperBoundaryRevetment   = (RoundedDouble)entity.UpperBoundaryRevetment.ToNullAsNaN();
            inputParameters.LowerBoundaryRevetment   = (RoundedDouble)entity.LowerBoundaryRevetment.ToNullAsNaN();
            inputParameters.UpperBoundaryWaterLevels = (RoundedDouble)entity.UpperBoundaryWaterLevels.ToNullAsNaN();
            inputParameters.LowerBoundaryWaterLevels = (RoundedDouble)entity.LowerBoundaryWaterLevels.ToNullAsNaN();
            inputParameters.StepSize        = (WaveConditionsInputStepSize)entity.StepSize;
            inputParameters.CalculationType = (GrassCoverErosionOutwardsWaveConditionsCalculationType)entity.CalculationType;
            inputParameters.WaterLevelType  = (WaveConditionsInputWaterLevelType)entity.WaterLevelType;
        }
예제 #16
0
        /// <summary>
        /// Performs a wave conditions calculation for the grass cover erosion outwards failure mechanism based on the supplied
        /// <see cref="GrassCoverErosionOutwardsWaveConditionsCalculation"/> and sets
        /// <see cref="GrassCoverErosionOutwardsWaveConditionsCalculation.Output"/> if the calculation was successful.
        /// Error and status information is logged during the execution of the operation.
        /// </summary>
        /// <param name="calculation">The <see cref="GrassCoverErosionOutwardsWaveConditionsCalculation"/> that holds all the information required to perform the calculation.</param>
        /// <param name="failureMechanism">The grass cover erosion outwards failure mechanism, which contains general parameters that apply to all
        /// <see cref="GrassCoverErosionOutwardsWaveConditionsCalculation"/> instances.</param>
        /// <param name="assessmentSection">The <see cref="IAssessmentSection"/> that holds information about the target probability used in the calculation.</param>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="calculation"/>, <paramref name="failureMechanism"/>
        /// or <paramref name="assessmentSection"/> is <c>null</c>.</exception>
        /// <exception cref="ArgumentException">Thrown when:
        /// <list type="bullet">
        /// <item>the hydraulic boundary database file path contains invalid characters.</item>
        /// <item><paramref name="failureMechanism"/> has no (0) contribution.</item>
        /// </list></exception>
        /// <exception cref="InvalidEnumArgumentException">Thrown when an unexpected
        /// enum value is encountered.</exception>
        /// <exception cref="CriticalFileReadException">Thrown when:
        /// <list type="bullet">
        /// <item>No settings database file could be found at the location of the hydraulic boundary database file path
        /// with the same name.</item>
        /// <item>Unable to open settings database file.</item>
        /// <item>Unable to read required data from database file.</item>
        /// </list>
        /// </exception>
        /// <exception cref="ArgumentOutOfRangeException">Thrown when the target probability or
        /// calculated probability falls outside the [0.0, 1.0] range and is not <see cref="double.NaN"/>.</exception>
        /// <exception cref="HydraRingFileParserException">Thrown when an error occurs during parsing of the Hydra-Ring output.</exception>
        /// <exception cref="HydraRingCalculationException">Thrown when an error occurs during the calculation.</exception>
        /// <exception cref="NotSupportedException">Thrown when <see cref="GrassCoverErosionOutwardsWaveConditionsCalculationType"/>
        /// is a valid value, but unsupported.</exception>
        public void Calculate(GrassCoverErosionOutwardsWaveConditionsCalculation calculation,
                              GrassCoverErosionOutwardsFailureMechanism failureMechanism,
                              IAssessmentSection assessmentSection)
        {
            if (calculation == null)
            {
                throw new ArgumentNullException(nameof(calculation));
            }

            if (failureMechanism == null)
            {
                throw new ArgumentNullException(nameof(failureMechanism));
            }

            if (assessmentSection == null)
            {
                throw new ArgumentNullException(nameof(assessmentSection));
            }

            GrassCoverErosionOutwardsWaveConditionsInput           calculationInput = calculation.InputParameters;
            GrassCoverErosionOutwardsWaveConditionsCalculationType calculationType  = calculationInput.CalculationType;

            if (!Enum.IsDefined(typeof(GrassCoverErosionOutwardsWaveConditionsCalculationType), calculationType))
            {
                throw new InvalidEnumArgumentException(nameof(calculationType), (int)calculationType,
                                                       typeof(GrassCoverErosionOutwardsWaveConditionsCalculationType));
            }

            CalculationServiceHelper.LogCalculationBegin();

            RoundedDouble assessmentLevel = WaveConditionsInputHelper.GetAssessmentLevel(calculationInput, assessmentSection);

            double targetProbability = WaveConditionsInputHelper.GetTargetProbability(calculationInput, assessmentSection);

            HydraulicBoundaryDatabase hydraulicBoundaryDatabase = assessmentSection.HydraulicBoundaryDatabase;

            DetermineTotalWaterLevelCalculations(calculationInput, assessmentLevel);

            try
            {
                IEnumerable <WaveConditionsOutput> waveRunUpOutput = null;
                if (ShouldCalculateWaveRunUp(calculationType))
                {
                    CurrentCalculationType = Resources.GrassCoverErosionOutwardsWaveConditions_WaveRunUp_DisplayName;
                    waveRunUpOutput        = CalculateWaveRunUp(calculation, failureMechanism, hydraulicBoundaryDatabase, assessmentLevel, targetProbability);
                }

                if (Canceled)
                {
                    return;
                }

                IEnumerable <WaveConditionsOutput> waveImpactOutput = null;
                if (ShouldCalculateWaveImpact(calculationType))
                {
                    CurrentCalculationType = Resources.GrassCoverErosionOutwardsWaveConditions_WaveImpact_DisplayName;
                    waveImpactOutput       = CalculateWaveImpact(calculation, failureMechanism, hydraulicBoundaryDatabase, assessmentLevel, targetProbability);
                }

                IEnumerable <WaveConditionsOutput> waveImpactWithWaveDirectionOutput = null;
                if (ShouldCalculateWaveImpactWithWaveDirection(calculationType))
                {
                    CurrentCalculationType            = Resources.GrassCoverErosionOutwardsWaveConditions_WaveImpactWithWaveDirection_DisplayName;
                    waveImpactWithWaveDirectionOutput = CalculateWaveImpactWithWaveDirection(calculation, failureMechanism, hydraulicBoundaryDatabase, assessmentLevel, targetProbability);
                }

                if (!Canceled)
                {
                    calculation.Output = CreateOutput(calculationType, waveRunUpOutput, waveImpactOutput, waveImpactWithWaveDirectionOutput);
                }
            }
            finally
            {
                CalculationServiceHelper.LogCalculationEnd();
            }
        }
        public void Read_ValidEntity_ReturnCalculation()
        {
            // Setup
            const string name     = "Calculation Name";
            const string comments = "Calculation Comment";

            var          random                   = new Random(21);
            double       orientation              = random.NextDouble();
            bool         useBreakWater            = random.NextBoolean();
            var          breakWaterType           = random.NextEnumValue <BreakWaterType>();
            double       breakWaterHeight         = random.NextDouble();
            bool         useForeshore             = random.NextBoolean();
            const double lowerBoundaryRevetment   = 3.58;
            const double upperBoundaryRevetment   = 6.10;
            const double lowerBoundaryWaterLevels = 3.40;
            const double upperBoundaryWaterLevels = 5.88;
            var          stepSize                 = random.NextEnumValue <WaveConditionsInputStepSize>();
            var          calculationType          = random.NextEnumValue <GrassCoverErosionOutwardsWaveConditionsCalculationType>();
            var          waterLevelType           = random.NextEnumValue <WaveConditionsInputWaterLevelType>();

            var entity = new GrassCoverErosionOutwardsWaveConditionsCalculationEntity
            {
                Name                     = name,
                Comments                 = comments,
                UseBreakWater            = Convert.ToByte(useBreakWater),
                BreakWaterType           = Convert.ToByte(breakWaterType),
                BreakWaterHeight         = breakWaterHeight,
                UseForeshore             = Convert.ToByte(useForeshore),
                Orientation              = orientation,
                UpperBoundaryRevetment   = upperBoundaryRevetment,
                LowerBoundaryRevetment   = lowerBoundaryRevetment,
                UpperBoundaryWaterLevels = upperBoundaryWaterLevels,
                LowerBoundaryWaterLevels = lowerBoundaryWaterLevels,
                StepSize                 = Convert.ToByte(stepSize),
                CalculationType          = Convert.ToByte(calculationType),
                WaterLevelType           = Convert.ToByte(waterLevelType)
            };

            var collector = new ReadConversionCollector();

            // Call
            GrassCoverErosionOutwardsWaveConditionsCalculation calculation = entity.Read(collector);

            // Assert
            Assert.AreEqual(name, calculation.Name);
            Assert.AreEqual(comments, calculation.Comments.Body);

            GrassCoverErosionOutwardsWaveConditionsInput calculationInput = calculation.InputParameters;

            Assert.AreEqual(useBreakWater, calculationInput.UseBreakWater);
            Assert.AreEqual(breakWaterType, calculationInput.BreakWater.Type);
            RoundedDoubleTestHelper.AssertRoundedDouble(breakWaterHeight, calculationInput.BreakWater.Height);
            Assert.AreEqual(useForeshore, calculationInput.UseForeshore);
            RoundedDoubleTestHelper.AssertRoundedDouble(orientation, calculationInput.Orientation);
            RoundedDoubleTestHelper.AssertRoundedDouble(upperBoundaryRevetment, calculationInput.UpperBoundaryRevetment);
            RoundedDoubleTestHelper.AssertRoundedDouble(lowerBoundaryRevetment, calculationInput.LowerBoundaryRevetment);
            RoundedDoubleTestHelper.AssertRoundedDouble(upperBoundaryWaterLevels, calculationInput.UpperBoundaryWaterLevels);
            RoundedDoubleTestHelper.AssertRoundedDouble(lowerBoundaryWaterLevels, calculationInput.LowerBoundaryWaterLevels);
            Assert.AreEqual(stepSize, calculationInput.StepSize);
            Assert.AreEqual(calculationType, calculationInput.CalculationType);
            Assert.AreEqual(waterLevelType, calculationInput.WaterLevelType);

            Assert.IsNull(calculationInput.HydraulicBoundaryLocation);
            Assert.IsNull(calculationInput.ForeshoreProfile);
            Assert.IsNull(calculationInput.CalculationsTargetProbability);
            Assert.IsNull(calculation.Output);
        }
 /// <summary>
 /// Method that asserts whether <paramref name="original"/> and <paramref name="clone"/>
 /// are clones.
 /// </summary>
 /// <param name="original">The original object.</param>
 /// <param name="clone">The cloned object.</param>
 /// <exception cref="AssertionException">Thrown when <paramref name="original"/> and
 /// <paramref name="clone"/> are not clones.</exception>
 public static void AreClones(GrassCoverErosionOutwardsWaveConditionsInput original, GrassCoverErosionOutwardsWaveConditionsInput clone)
 {
     Assert.AreEqual(original.CalculationType, clone.CalculationType);
     WaveConditionsCloneAssert.AreClones(original, clone);
 }