コード例 #1
0
        public static void CreateAircraftData_Always_ReturnsAircraftData()
        {
            // Call
            AircraftData data = AircraftDataTestFactory.CreateRandomAircraftData();

            // Assert
            Assert.IsTrue(IsConcreteNonZeroNumber(data.NrOfEngines));
            Assert.IsTrue(IsConcreteNonZeroNumber(data.MaximumThrustPerEngine));
            Assert.IsTrue(IsConcreteNonZeroNumber(data.TakeOffWeight));
            Assert.IsTrue(IsConcreteNonZeroNumber(data.PitchAngleGradient.Degrees));
            Assert.IsTrue(IsConcreteNonZeroNumber(data.MaximumPitchAngle.Degrees));
            Assert.IsTrue(IsConcreteNonZeroNumber(data.RollingResistanceCoefficient));
            Assert.IsTrue(IsConcreteNonZeroNumber(data.BrakingResistanceCoefficient));

            AerodynamicsData aerodynamicsData = data.AerodynamicsData;

            Assert.IsTrue(IsConcreteNonZeroNumber(aerodynamicsData.AspectRatio));
            Assert.IsTrue(IsConcreteNonZeroNumber(aerodynamicsData.WingArea));
            Assert.IsTrue(IsConcreteNonZeroNumber(aerodynamicsData.ZeroLiftAngleOfAttack.Degrees));
            Assert.IsTrue(IsConcreteNonZeroNumber(aerodynamicsData.LiftCoefficientGradient));
            Assert.IsTrue(IsConcreteNonZeroNumber(aerodynamicsData.MaximumLiftCoefficient));
            Assert.IsTrue(IsConcreteNonZeroNumber(aerodynamicsData.RestDragCoefficientWithoutEngineFailure));
            Assert.IsTrue(IsConcreteNonZeroNumber(aerodynamicsData.RestDragCoefficientWithEngineFailure));
            Assert.IsTrue(IsConcreteNonZeroNumber(aerodynamicsData.OswaldFactor));
        }
コード例 #2
0
        public static void Calculate_ContinuedTakeOffDistanceCalculatorThrowsCalculatorException_ThrowsCalculatorException()
        {
            // Setup
            var random = new Random(21);

            AircraftData        aircraftData              = AircraftDataTestFactory.CreateRandomAircraftData();
            var                 integrator                = Substitute.For <IIntegrator>();
            int                 nrOfFailedEngines         = random.Next();
            double              density                   = random.NextDouble();
            double              gravitationalAcceleration = random.NextDouble();
            CalculationSettings calculationSettings       = CalculationSettingsTestFactory.CreateDistanceCalculatorSettings();

            var calculatorException = new CalculatorException();

            var continuedTakeOffDistanceCalculator = Substitute.For <IDistanceCalculator>();

            continuedTakeOffDistanceCalculator.Calculate().Throws(calculatorException);

            var distanceCalculatorFactory = Substitute.For <IDistanceCalculatorFactory>();

            distanceCalculatorFactory.CreateAbortedTakeOffDistanceCalculator(null, null, 0, 0, null).ReturnsForAnyArgs(continuedTakeOffDistanceCalculator);

            var aggregatedCalculator = new Calculator.AggregatedDistanceCalculator.AggregatedDistanceCalculator(distanceCalculatorFactory);

            // Call
            TestDelegate call = () => aggregatedCalculator.Calculate(aircraftData, integrator, nrOfFailedEngines, density, gravitationalAcceleration, calculationSettings);

            // Assert
            var exception = Assert.Throws <CalculatorException>(call);

            Assert.AreSame(calculatorException, exception);
        }
コード例 #3
0
        public void GivenAircraftStateResultsIntoInvalidCalculationException_WhenCalculateCalled_ThenCalculatorExceptionThrown()
        {
            // Given
            var random = new Random(21);

            AircraftData aircraftData = AircraftDataTestFactory.CreateRandomAircraftData();
            var          calculator   = new TestTakeOffDynamicsCalculator(aircraftData, random.NextDouble(), random.NextDouble());

            var state = new AircraftState(aircraftData.AerodynamicsData.ZeroLiftAngleOfAttack - Angle.FromRadians(1),
                                          new Angle(),
                                          random.NextDouble(),
                                          random.NextDouble(),
                                          random.NextDouble());

            // When
            TestDelegate call = () => calculator.Calculate(state);

            // Then
            var exception = Assert.Throws <CalculatorException>(call);

            Exception innerException = exception.InnerException;

            Assert.IsInstanceOf <InvalidCalculationException>(innerException);
            Assert.AreEqual(innerException.Message, exception.Message);
        }
コード例 #4
0
        public static void Constructor_ExpectedValues()
        {
            // Setup
            var          random       = new Random(21);
            AircraftData aircraftData = AircraftDataTestFactory.CreateRandomAircraftData();

            // Call
            var calculator = new NormalTakeOffDynamicsCalculator(aircraftData, random.NextDouble(), random.NextDouble());

            // Assert
            Assert.IsInstanceOf <TakeOffDynamicsCalculatorBase>(calculator);
            Assert.IsInstanceOf <INormalTakeOffDynamicsCalculator>(calculator);
        }
コード例 #5
0
        public void Calculate_AircraftStateNull_ThrowsArgumentNullException()
        {
            // Setup
            var          random       = new Random(21);
            AircraftData aircraftData = AircraftDataTestFactory.CreateRandomAircraftData();
            var          calculator   = new TestTakeOffDynamicsCalculator(aircraftData, random.NextDouble(), random.NextDouble());

            // Call
            TestDelegate call = () => calculator.Calculate(null);

            // Assert
            var exception = Assert.Throws <ArgumentNullException>(call);

            Assert.AreEqual("aircraftState", exception.ParamName);
        }
コード例 #6
0
        public static void Calculate_WithArguments_ExecutesDistanceCalculatorsAndReturnsExpectedOutput()
        {
            // Setup
            var random = new Random(21);

            AircraftData        aircraftData              = AircraftDataTestFactory.CreateRandomAircraftData();
            var                 integrator                = Substitute.For <IIntegrator>();
            int                 nrOfFailedEngines         = random.Next();
            double              density                   = random.NextDouble();
            double              gravitationalAcceleration = random.NextDouble();
            CalculationSettings calculationSettings       = CalculationSettingsTestFactory.CreateDistanceCalculatorSettings();

            var abortedTakeOffDistanceCalculator = Substitute.For <IDistanceCalculator>();
            var abortedTakeOffDistanceOutput     = new DistanceCalculatorOutput(calculationSettings.FailureSpeed, random.NextDouble());

            abortedTakeOffDistanceCalculator.Calculate().Returns(abortedTakeOffDistanceOutput);

            var continuedTakeOffDistanceCalculator = Substitute.For <IDistanceCalculator>();
            var continuedTakeOffDistanceOutput     = new DistanceCalculatorOutput(calculationSettings.FailureSpeed, random.NextDouble());

            continuedTakeOffDistanceCalculator.Calculate().Returns(continuedTakeOffDistanceOutput);

            var distanceCalculatorFactory = Substitute.For <IDistanceCalculatorFactory>();

            distanceCalculatorFactory.CreateAbortedTakeOffDistanceCalculator(Arg.Is(aircraftData),
                                                                             Arg.Is(integrator),
                                                                             Arg.Is(density),
                                                                             Arg.Is(gravitationalAcceleration),
                                                                             Arg.Is(calculationSettings))
            .Returns(abortedTakeOffDistanceCalculator);
            distanceCalculatorFactory.CreateContinuedTakeOffDistanceCalculator(Arg.Is(aircraftData),
                                                                               Arg.Is(integrator),
                                                                               Arg.Is(nrOfFailedEngines),
                                                                               Arg.Is(density),
                                                                               Arg.Is(gravitationalAcceleration),
                                                                               Arg.Is(calculationSettings))
            .Returns(continuedTakeOffDistanceCalculator);

            var aggregatedCalculator = new Calculator.AggregatedDistanceCalculator.AggregatedDistanceCalculator(distanceCalculatorFactory);

            // Call
            AggregatedDistanceOutput output = aggregatedCalculator.Calculate(aircraftData, integrator, nrOfFailedEngines, density, gravitationalAcceleration, calculationSettings);

            // Assert
            Assert.AreEqual(calculationSettings.FailureSpeed, output.FailureSpeed);
            Assert.AreEqual(abortedTakeOffDistanceOutput.Distance, output.AbortedTakeOffDistance);
            Assert.AreEqual(continuedTakeOffDistanceOutput.Distance, output.ContinuedTakeOffDistance);
        }
コード例 #7
0
        public void CreateAbortedTakeOffDynamics_Always_ReturnsExpectedCalculator()
        {
            // Setup
            var          random       = new Random(21);
            AircraftData aircraftData = AircraftDataTestFactory.CreateRandomAircraftData();

            var factory = new TakeOffDynamicsCalculatorFactory();

            // Call
            IFailureTakeOffDynamicsCalculator calculator = factory.CreateAbortedTakeOffDynamics(aircraftData,
                                                                                                random.NextDouble(),
                                                                                                random.NextDouble());

            // Assert
            Assert.IsInstanceOf <AbortedTakeOffDynamicsCalculator>(calculator);
        }
コード例 #8
0
        public void CreateContinuedTakeOffDistanceCalculator_WithValidArguments_ReturnsExpectedCalculator()
        {
            // Setup
            var    random  = new Random(21);
            double density = random.NextDouble();
            double gravitationalAcceleration = random.NextDouble();
            int    nrOfFailedEngines         = random.Next();

            AircraftData aircraftData = AircraftDataTestFactory.CreateRandomAircraftData();

            var normalTakeOffDynamicsCalculator  = Substitute.For <INormalTakeOffDynamicsCalculator>();
            var failureTakeOffDynamicsCalculator = Substitute.For <IFailureTakeOffDynamicsCalculator>();

            var takeOffDynamicsCalculatorFactory = Substitute.For <ITakeOffDynamicsCalculatorFactory>();

            takeOffDynamicsCalculatorFactory.CreateNormalTakeOffDynamics(aircraftData, density, gravitationalAcceleration)
            .Returns(normalTakeOffDynamicsCalculator);
            takeOffDynamicsCalculatorFactory.CreateContinuedTakeOffDynamicsCalculator(aircraftData, nrOfFailedEngines, density, gravitationalAcceleration)
            .Returns(failureTakeOffDynamicsCalculator);

            var integrator = Substitute.For <IIntegrator>();

            IDistanceCalculatorFactory factory = new DistanceCalculatorFactory(takeOffDynamicsCalculatorFactory);

            // Call
            IDistanceCalculator calculator = factory.CreateContinuedTakeOffDistanceCalculator(aircraftData,
                                                                                              integrator,
                                                                                              nrOfFailedEngines,
                                                                                              density,
                                                                                              gravitationalAcceleration,
                                                                                              CalculationSettingsTestFactory.CreateDistanceCalculatorSettings());

            // Assert
            takeOffDynamicsCalculatorFactory.DidNotReceiveWithAnyArgs().CreateAbortedTakeOffDynamics(Arg.Any <AircraftData>(),
                                                                                                     Arg.Any <double>(),
                                                                                                     Arg.Any <double>());
            takeOffDynamicsCalculatorFactory.Received(1).CreateNormalTakeOffDynamics(Arg.Any <AircraftData>(),
                                                                                     Arg.Any <double>(),
                                                                                     Arg.Any <double>());
            takeOffDynamicsCalculatorFactory.Received(1).CreateContinuedTakeOffDynamicsCalculator(Arg.Any <AircraftData>(),
                                                                                                  Arg.Any <int>(),
                                                                                                  Arg.Any <double>(),
                                                                                                  Arg.Any <double>());

            Assert.IsInstanceOf <DistanceCalculator>(calculator);
        }
コード例 #9
0
        public void Validate_AllDataInvalid_ReturnsExpectedValidationResult()
        {
            // Setup
            AircraftData aircraftData = AircraftDataTestFactory.CreateRandomAircraftData();

            var kernel = new AggregatedDistanceCalculatorKernel();

            // Call
            KernelValidationError result = kernel.Validate(aircraftData, 0, 0,
                                                           aircraftData.NrOfEngines + 1);

            // Assert
            const KernelValidationError expectedResult = KernelValidationError.InvalidDensity
                                                         | KernelValidationError.InvalidGravitationalAcceleration
                                                         | KernelValidationError.InvalidNrOfFailedEngines;

            Assert.AreEqual(expectedResult, result);
        }
コード例 #10
0
        public void Validate_WithValidData_ReturnsExpectedValidationResult()
        {
            // Setup
            var          random       = new Random(21);
            AircraftData aircraftData = AircraftDataTestFactory.CreateRandomAircraftData();
            double       density      = random.NextDouble();
            double       gravitationalAcceleration = random.NextDouble();

            var kernel = new AggregatedDistanceCalculatorKernel();

            // Call
            KernelValidationError result = kernel.Validate(aircraftData,
                                                           density,
                                                           gravitationalAcceleration,
                                                           aircraftData.NrOfEngines - 1);

            // Assert
            Assert.AreEqual(KernelValidationError.None, result);
        }
コード例 #11
0
        public void Validate_DensityInvalid_ReturnsExpectedValidationResult(double density)
        {
            // Setup
            var          random       = new Random(21);
            AircraftData aircraftData = AircraftDataTestFactory.CreateRandomAircraftData();
            double       gravitationalAcceleration = random.NextDouble();

            var kernel = new AggregatedDistanceCalculatorKernel();

            // Call
            KernelValidationError result = kernel.Validate(aircraftData,
                                                           density,
                                                           gravitationalAcceleration,
                                                           aircraftData.NrOfEngines - 1);

            // Assert
            Assert.IsTrue(result.HasFlag(KernelValidationError.InvalidDensity));
            Assert.IsFalse(result.HasFlag(KernelValidationError.InvalidGravitationalAcceleration));
            Assert.IsFalse(result.HasFlag(KernelValidationError.InvalidNrOfFailedEngines));
        }
コード例 #12
0
        public static void Calculate_Always_ReturnsExpectedZeroPitchRate()
        {
            // Setup
            var          random        = new Random(21);
            AircraftData aircraftData  = AircraftDataTestFactory.CreateRandomAircraftData();
            Angle        angleOfAttack = AerodynamicsDataTestHelper.GetValidAngleOfAttack(aircraftData.AerodynamicsData);
            var          aircraftState = new AircraftState(angleOfAttack,
                                                           new Angle(),
                                                           random.NextDouble(),
                                                           random.NextDouble(),
                                                           random.NextDouble());

            var calculator = new AbortedTakeOffDynamicsCalculator(aircraftData, random.NextDouble(), random.NextDouble());

            // Call
            AircraftAccelerations accelerations = calculator.Calculate(aircraftState);

            // Assert
            Assert.Zero(accelerations.PitchRate.Radians);
        }
コード例 #13
0
        public static void Calculate_Always_SendsCorrectInput()
        {
            // Setup
            var random = new Random(21);

            AircraftData aircraftData  = AircraftDataTestFactory.CreateRandomAircraftData();
            var          calculator    = new TestTakeOffDynamicsCalculator(aircraftData, random.NextDouble(), random.NextDouble());
            Angle        angleOfAttack = AerodynamicsDataTestHelper.GetValidAngleOfAttack(aircraftData.AerodynamicsData);

            var state = new AircraftState(angleOfAttack,
                                          new Angle(),
                                          random.NextDouble(),
                                          random.NextDouble(),
                                          random.NextDouble());

            // Call
            calculator.Calculate(state);

            // Assert
            Assert.AreSame(state, calculator.CalculateDragInput);
        }
コード例 #14
0
        public static void Calculate_WithAircraftStateAlways_ReturnsExpectedClimbRate()
        {
            // Setup
            var          random        = new Random(21);
            AircraftData aircraftData  = AircraftDataTestFactory.CreateRandomAircraftData();
            Angle        angleOfAttack = AerodynamicsDataTestHelper.GetValidAngleOfAttack(aircraftData.AerodynamicsData);

            var aircraftState = new AircraftState(angleOfAttack,
                                                  new Angle(),
                                                  random.NextDouble(),
                                                  random.NextDouble(),
                                                  random.NextDouble());

            var calculator = new TestTakeOffDynamicsCalculator(aircraftData, random.NextDouble(), random.NextDouble());

            // Call
            AircraftAccelerations accelerations = calculator.Calculate(aircraftState);

            // Assert
            double expectedClimbRate = aircraftState.TrueAirspeed * Math.Sin(aircraftState.FlightPathAngle.Radians);

            Assert.AreEqual(expectedClimbRate, accelerations.ClimbRate, tolerance);
        }
コード例 #15
0
        public void Calculate_CalculationSettingsNull_ThrowsArgumentNullException()
        {
            // Setup
            var random = new Random(21);

            AircraftData aircraftData              = AircraftDataTestFactory.CreateRandomAircraftData();
            var          integrator                = Substitute.For <IIntegrator>();
            int          nrOfFailedEngines         = random.Next();
            double       density                   = random.NextDouble();
            double       gravitationalAcceleration = random.NextDouble();

            var distanceCalculatorFactory = Substitute.For <IDistanceCalculatorFactory>();

            var aggregatedCalculator = new Calculator.AggregatedDistanceCalculator.AggregatedDistanceCalculator(distanceCalculatorFactory);

            // Call
            TestDelegate call = () => aggregatedCalculator.Calculate(aircraftData, integrator, nrOfFailedEngines, density, gravitationalAcceleration, null);

            // Assert
            var exception = Assert.Throws <ArgumentNullException>(call);

            Assert.AreEqual("calculationSettings", exception.ParamName);
        }
コード例 #16
0
            public static void Calculate_WithAirspeedLowerThanThreshold_ReturnsExpectedZeroRate()
            {
                // Setup
                var          random        = new Random(21);
                AircraftData aircraftData  = AircraftDataTestFactory.CreateRandomAircraftData();
                Angle        angleOfAttack = AerodynamicsDataTestHelper.GetValidAngleOfAttack(aircraftData.AerodynamicsData);

                var aircraftState = new AircraftState(angleOfAttack,
                                                      new Angle(),
                                                      random.NextDouble(),
                                                      random.NextDouble(),
                                                      random.NextDouble());

                // Precondition
                Assert.IsTrue(aircraftState.TrueAirspeed < 1);

                var calculator = new TestTakeOffDynamicsCalculator(aircraftData, random.NextDouble(), random.NextDouble());

                // Call
                AircraftAccelerations accelerations = calculator.Calculate(aircraftState);

                // Assert
                Assert.Zero(accelerations.FlightPathRate.Degrees);
            }