public void Create_WithArguments_ReturnsExpectedAircraftData()
        {
            // Setup
            var random = new Random(21);

            var aircraftData = new AircraftData
            {
                WingSurfaceArea         = random.NextDouble(),
                AspectRatio             = random.NextDouble(),
                OswaldFactor            = random.NextDouble(),
                MaximumLiftCoefficient  = random.NextDouble(),
                LiftCoefficientGradient = random.NextDouble(),
                ZeroLiftAngleOfAttack   = random.NextAngle(),
                RestDragCoefficient     = random.NextDouble(),
                RestDragCoefficientWithEngineFailure = random.NextDouble(),
                MaximumPitchAngle                   = random.NextAngle(),
                PitchGradient                       = random.NextAngle(),
                RollResistanceCoefficient           = random.NextDouble(),
                RollResistanceWithBrakesCoefficient = random.NextDouble(),
                TakeOffWeight                       = random.NextDouble()
            };

            var engineData = new EngineData
            {
                NrOfEngines     = random.Next(),
                ThrustPerEngine = random.NextDouble()
            };

            // Call
            KernelAircraftData data = AircraftDataFactory.Create(aircraftData, engineData);

            // Assert
            AircraftDataTestHelper.AssertAircraftData(aircraftData, engineData, data);
        }
        /// <summary>
        /// Calculates the <see cref="BalancedFieldLengthOutput"/> based on <paramref name="calculation"/>.
        /// </summary>
        /// <param name="calculation">The <see cref="BalancedFieldLengthCalculation"/> to calculate for.</param>
        /// <returns>A <see cref="BalancedFieldLengthOutput"/>.</returns>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="calculation"/> is <c>null</c>.</exception>
        /// <exception cref="CreateKernelDataException">Thrown when the calculation input
        /// could not be created for the kernel.</exception>
        /// <exception cref="KernelCalculationException">Thrown when <see cref="AggregatedDistanceOutput"/>
        /// could not be calculated.</exception>
        public BalancedFieldLengthOutput Calculate(BalancedFieldLengthCalculation calculation)
        {
            if (calculation == null)
            {
                throw new ArgumentNullException(nameof(calculation));
            }

            GeneralSimulationSettingsData generalSimulationSettings = calculation.SimulationSettings;
            double density     = generalSimulationSettings.Density;
            int    endVelocity = generalSimulationSettings.EndFailureVelocity;
            double gravitationalAcceleration = generalSimulationSettings.GravitationalAcceleration;

            EngineData   engineData        = calculation.EngineData;
            int          nrOfFailedEngines = engineData.NrOfFailedEngines;
            AircraftData aircraftData      = AircraftDataFactory.Create(calculation.AircraftData, engineData);

            var integrator = new EulerIntegrator();

            var outputs = new List <AggregatedDistanceOutput>();

            for (int i = 0; i < endVelocity; i++)
            {
                var calculationInput = new CalculationInput(generalSimulationSettings,
                                                            i,
                                                            aircraftData,
                                                            integrator,
                                                            nrOfFailedEngines,
                                                            density,
                                                            gravitationalAcceleration);
                AggregatedDistanceOutput output = CalculateDistances(calculationInput);
                outputs.Add(output);
            }

            return(BalancedFieldLengthOutputFactory.Create(outputs));
        }
        public void Create_EngineDataNull_ThrowsArgumentNullException()
        {
            // Call
            TestDelegate call = () => AircraftDataFactory.Create(new AircraftData(), null);

            // Assert
            Assert.That(call, Throws.ArgumentNullException
                        .With.Property(nameof(ArgumentNullException.ParamName))
                        .EqualTo("engineData"));
        }
        /// <summary>
        /// Validates a <see cref="BalancedFieldLengthCalculation"/>.
        /// </summary>
        /// <param name="calculation">The calculation to validate.</param>
        /// <returns>A collection of validation messages if the validation failed, empty otherwise.</returns>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="calculation"/>
        /// is <c>null</c>.</exception>
        public IEnumerable <string> Validate(BalancedFieldLengthCalculation calculation)
        {
            if (calculation == null)
            {
                throw new ArgumentNullException(nameof(calculation));
            }

            try
            {
                EngineData engineData = calculation.EngineData;
                GeneralSimulationSettingsData generalSimulationSettings = calculation.SimulationSettings;

                AircraftData          aircraftData     = AircraftDataFactory.Create(calculation.AircraftData, engineData);
                KernelValidationError validationResult = kernel.Validate(aircraftData,
                                                                         generalSimulationSettings.Density,
                                                                         generalSimulationSettings.GravitationalAcceleration,
                                                                         engineData.NrOfFailedEngines);

                var messages = new List <string>();
                if (generalSimulationSettings.EndFailureVelocity < 1)
                {
                    messages.Add(Resources.BalancedFieldLengthCalculationModule_ValidationMessage_End_failure_velocity_must_be_larger_than_Zero);
                }

                if (validationResult.HasFlag(KernelValidationError.InvalidDensity))
                {
                    messages.Add(Resources.BalancedFieldLengthCalculationModule_ValidationMessage_Invalid_Density);
                }

                if (validationResult.HasFlag(KernelValidationError.InvalidGravitationalAcceleration))
                {
                    messages.Add(Resources.BalancedFieldLengthCalculationModule_ValidationMessage_Invalid_GravitationalAcceleration);
                }

                if (validationResult.HasFlag(KernelValidationError.InvalidNrOfFailedEngines))
                {
                    messages.Add(Resources.BalancedFieldLengthCalculationModule_ValidationMessage_Invalid_NrOfFailedEngines);
                }

                return(messages);
            }
            catch (CreateKernelDataException e)
            {
                return(new[]
                {
                    e.Message
                });
            }
        }
        public void Create_WithDataResultingInArgumentOutOfRangeException_ThrowsKernelCreateException()
        {
            // Setup
            var random = new Random(21);

            var aircraftData = new AircraftData
            {
                WingSurfaceArea         = random.NextDouble(),
                AspectRatio             = random.NextDouble(),
                OswaldFactor            = random.NextDouble(),
                MaximumLiftCoefficient  = random.NextDouble(),
                LiftCoefficientGradient = random.NextDouble(),
                ZeroLiftAngleOfAttack   = random.NextAngle(),
                RestDragCoefficient     = random.NextDouble(),
                RestDragCoefficientWithEngineFailure = random.NextDouble(),
                MaximumPitchAngle                   = random.NextAngle(),
                PitchGradient                       = random.NextAngle(),
                RollResistanceCoefficient           = random.NextDouble(),
                RollResistanceWithBrakesCoefficient = random.NextDouble(),
                TakeOffWeight                       = random.NextDouble()
            };

            var engineData = new EngineData
            {
                NrOfEngines     = random.Next(),
                ThrustPerEngine = -random.NextDouble()
            };

            // Call
            TestDelegate call = () => AircraftDataFactory.Create(aircraftData, engineData);

            // Assert
            var       exception      = Assert.Throws <CreateKernelDataException>(call);
            Exception innerException = exception.InnerException;

            Assert.That(innerException, Is.TypeOf <ArgumentOutOfRangeException>());
            Assert.That(exception.Message, Is.EqualTo(exception.Message));
        }