public void Build_Deceleration_CurveTestMethod()
        {
            // TODO : Fill the acceleration surface
            AccelerationSpeedDistanceSurface acceleration = new AccelerationSpeedDistanceSurface();

            for (int i = 0; i < 8; i++)
            {
                double StartDistance = i * 625;
                double EndDistance   = StartDistance + 625;

                for (int j = 0; j < 6; j++)
                {
                    double StartSpeed = j * 35;
                    double EndSpeed   = StartSpeed + 35;

                    acceleration.Tiles.Add(new SurfaceTile(
                                               new SiDistance(StartDistance),
                                               new SiDistance(EndDistance),
                                               new SiSpeed(StartSpeed, SiSpeed_SubUnits.KiloMeter_per_Hour),
                                               new SiSpeed(EndSpeed, SiSpeed_SubUnits.KiloMeter_per_Hour),
                                               new SiAcceleration(-Math.Abs(0.5 * (1.2 + Math.Pow(-1, i - j))))
                                               ));
                }
            }


            // the target
            SiSpeed    TargetSpeed    = new SiSpeed(50, SiSpeed_SubUnits.KiloMeter_per_Hour);
            SiDistance TargetDistance = new SiDistance(2250);

            // Compute the deceleration curve using the previous algorithm
            QuadraticSpeedDistanceCurve deceleration = EtcsBrakingCurveBuilder.Build_Deceleration_Curve(acceleration,
                                                                                                        TargetSpeed, TargetDistance);

            TestOutput = new StringBuilder();

            // Compare the deceleration curves
            for (double d = 0.0; d < 5000.0; d += 1)
            {
                double spd = deceleration.GetValueAt(new SiDistance(d), BrakingCurveDirectionEnum.Backwards).Value;
                TestOutput.Append(d.ToString());
                TestOutput.Append("\t");
                TestOutput.Append(spd.ToString());
                TestOutput.Append("\t");
                TestOutput.Append(acceleration.GetTileAt(new SiSpeed(spd), new SiDistance(d)).V.Y.Value);
                TestOutput.Append("\n");
            }
            File.WriteAllText("Results.csv", TestOutput.ToString());
        }
        public void Build_A_Safe_BackwardTestMethod()
        {
            // TODO : Fill the acceleration surface
            AccelerationSpeedDistanceSurface acceleration = new AccelerationSpeedDistanceSurface();

            for (int i = 0; i < 5; i++)
            {
                double StartDistance = i * 1000;
                double EndDistance   = StartDistance + 1000;

                for (int j = 0; j < 4; j++)
                {
                    double StartSpeed = j * 60;
                    double EndSpeed   = StartSpeed + 60;

                    acceleration.Tiles.Add(new SurfaceTile(
                                               new SiDistance(StartDistance),
                                               new SiDistance(EndDistance),
                                               new SiSpeed(StartSpeed, SiSpeed_SubUnits.KiloMeter_per_Hour),
                                               new SiSpeed(EndSpeed, SiSpeed_SubUnits.KiloMeter_per_Hour),
                                               new SiAcceleration(-(0.5 + (i - j) / 8))
                                               ));
                }
            }


            // TODO : Fill the mrsp
            FlatSpeedDistanceCurve mrsp = new FlatSpeedDistanceCurve();

            mrsp.AddSegment(new ConstantCurveSegment <SiDistance, SiSpeed>(
                                new SiDistance(0),
                                new SiDistance(650),
                                new SiSpeed(80, SiSpeed_SubUnits.KiloMeter_per_Hour)
                                ));
            mrsp.AddSegment(new ConstantCurveSegment <SiDistance, SiSpeed>(
                                new SiDistance(650),
                                new SiDistance(1500),
                                new SiSpeed(60, SiSpeed_SubUnits.KiloMeter_per_Hour)
                                ));
            mrsp.AddSegment(new ConstantCurveSegment <SiDistance, SiSpeed>(
                                new SiDistance(1500),
                                new SiDistance(2500),
                                new SiSpeed(120, SiSpeed_SubUnits.KiloMeter_per_Hour)
                                ));
            mrsp.AddSegment(new ConstantCurveSegment <SiDistance, SiSpeed>(
                                new SiDistance(2500),
                                new SiDistance(4000),
                                new SiSpeed(55, SiSpeed_SubUnits.KiloMeter_per_Hour)
                                ));
            mrsp.AddSegment(new ConstantCurveSegment <SiDistance, SiSpeed>(
                                new SiDistance(4000),
                                new SiDistance(5000),
                                new SiSpeed(0)
                                ));

            // Compute the deceleration curve using the previous algorithm
            QuadraticSpeedDistanceCurve deceleration =
                EtcsBrakingCurveBuilder_Obsolete.Build_A_Safe_Backward(acceleration, mrsp);

            // Compute the deceleration curve using the new algorithm
            // TODO : Implement the new algorithm and use it
            QuadraticSpeedDistanceCurve deceleration2 = EtcsBrakingCurveBuilder.Build_A_Safe_Backward(acceleration, mrsp);

            TestOutput = new StringBuilder();

            // Compare the deceleration curves
            for (double d = 0.0; d < 5000.0; d += 1)
            {
                Assert.AreEqual(
                    deceleration.GetValueAt(new SiDistance(0.0 + d), BrakingCurveDirectionEnum.Backwards),
                    deceleration2.GetValueAt(new SiDistance(0.0 + d), BrakingCurveDirectionEnum.Backwards),
                    "Value at " + d + " should be equal"
                    );
                TestOutput.Append(d.ToString());
                TestOutput.Append("\t");
                TestOutput.Append(mrsp.GetValueAt(new SiDistance(d), BrakingCurveDirectionEnum.Backwards).Value);
                TestOutput.Append("\t");
                TestOutput.Append(deceleration.GetValueAt(new SiDistance(d), BrakingCurveDirectionEnum.Backwards).Value);
                TestOutput.Append("\t");
                TestOutput.Append(deceleration2.GetValueAt(new SiDistance(d), BrakingCurveDirectionEnum.Backwards).Value);
                TestOutput.Append("\n");
            }
            File.WriteAllText("ResultsCompare.csv", TestOutput.ToString());
        }