public void Flight_D1908_20170408_Partial()
        {
            FlightContext fc = new FlightContext("6770");

            int callbacks = 0;

            fc.OnRadarContact += (sender, args) =>
            {
                Assert.AreEqual(null, ((FlightContext)sender).Flight.DepartureTime);
                Assert.AreEqual(false, ((FlightContext)sender).Flight.DepartureInfoFound);
                Assert.AreEqual(0, ((FlightContext)sender).Flight.DepartureHeading);
                callbacks++;
            };

            fc.OnLanding += (sender, args) =>
            {
                Assert.AreEqual(636272628474023926, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                Assert.AreEqual(250, ((FlightContext)sender).Flight.ArrivalHeading);
                callbacks++;
            };

            // These events should NOT be fired
            fc.OnTakeoff             += (sender, args) => Assert.Fail();
            fc.OnCompletedWithErrors += (sender, e) => Assert.Fail();

            fc.Process(Common.ReadFlightPoints("2017-04-08_D-1908.csv").Skip(500));

            Assert.AreEqual(2, callbacks);
        }
        public async Task MinimalMemory_Flights_PH1387_20170419_20170421()
        {
            FlightContext fc = new FlightContext("2842", options =>
            {
            });

            int pass = 0;

            fc.OnTakeoff += (sender, args) =>
            {
                switch (pass)
                {
                case 0:
                    Assert.AreEqual(636281989825441178, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(355, ((FlightContext)sender).Flight.DepartureHeading);
                    break;

                case 1:
                    Assert.AreEqual(636283687551363359, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(355, ((FlightContext)sender).Flight.DepartureHeading);
                    break;

                case 2:
                    Assert.AreEqual(636283906924363860, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(21, ((FlightContext)sender).Flight.DepartureHeading);
                    break;

                default:
                    break;
                }
            };

            fc.OnLanding += (sender, args) =>
            {
                if (pass == 0)
                {
                    Assert.AreEqual(636282163561655897, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                    Assert.AreEqual(336, ((FlightContext)sender).Flight.ArrivalHeading);
                }
                if (pass == 1)
                {
                    Assert.AreEqual(636283891197427348, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                    Assert.AreEqual(333, ((FlightContext)sender).Flight.ArrivalHeading);
                }

                pass++;
            };

            fc.Process(Common.ReadFlightPoints("2017-04-19_2017-04-21_PH-1387.csv"));
        }
        public async Task Flight_D1908_20170408()
        {
            var fc = new FlightContext("6770");

            var countdownEvent = new CountdownEvent(3);

            fc.OnTakeoff += (sender, args) =>
            {
                countdownEvent.Signal();

                Assert.AreEqual(636272591685778931, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                Assert.AreEqual(new Point(4.35683333333333, 51.4516666666667, 30), ((FlightContext)sender).Flight.DepartureLocation);
            };

            fc.OnLaunchCompleted += (sender, args) =>
            {
                countdownEvent.Signal();

                Assert.AreEqual(LaunchMethods.Winch, ((FlightContext)sender).Flight.LaunchMethod);
                Assert.AreEqual(636272591835295201, ((FlightContext)sender).Flight.LaunchFinished?.Ticks);
                Assert.AreEqual(244, ((FlightContext)sender).Flight.DepartureHeading);
            };

            fc.OnLanding += (sender, args) =>
            {
                countdownEvent.Signal();

                Assert.AreEqual(636272628474023926, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                Assert.AreEqual(250, ((FlightContext)sender).Flight.ArrivalHeading);
                Assert.AreEqual(new Point(4.35583333333333, 51.451, 39), ((FlightContext)sender).Flight.ArrivalLocation);
            };

            // These events should NOT be fired
            fc.OnRadarContact        += (sender, e) => Assert.Fail();
            fc.OnCompletedWithErrors += (sender, e) => Assert.Fail();

            var points = Common.ReadFlightPoints("2017-04-08_D-1908.csv");

            fc.Process(points);

            countdownEvent.Wait(1000);

            Assert.IsTrue(countdownEvent.CurrentCount == 0);
        }
        public void Flight_PH1387_20170421()
        {
            FlightContext fc = new FlightContext("2842");

            /*
             * In this case the tool also detects a start after the previous flight. Therefore we have to add a switch
             * statement to check in which phase we are.
             */

            int pass = 0;

            fc.OnTakeoff += (sender, args) =>
            {
                if (pass == 0)
                {
                    Assert.AreEqual(636283687551363359, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(355, ((FlightContext)sender).Flight.DepartureHeading);
                }
                else if (pass == 1)
                {
                    Assert.AreEqual(636283906924363860, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(21, ((FlightContext)sender).Flight.DepartureHeading);
                }

                pass++;
            };

            fc.OnLaunchCompleted += (sender, args) =>
            {
                // If the tow would have been known, or it would have been known this aircraft is an engineless glider, it would have been obvious this self launch was a tow.
                Assert.AreEqual(LaunchMethods.Self, ((FlightContext)sender).Flight.LaunchMethod);
                Assert.AreEqual(636283689536727050, ((FlightContext)sender).Flight.LaunchFinished?.Ticks);

                pass++;
            };

            fc.OnLanding += (sender, args) =>
            {
                Assert.AreEqual(636283891197427348, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                Assert.AreEqual(338, ((FlightContext)sender).Flight.ArrivalHeading);
            };

            fc.Process(Common.ReadFlightPoints("2017-04-21_PH-1387.csv"));
        }
        /*
         * While this test is pretty well similar to the previous test, some of the data used (speed /
         * heading) is extracted from the lat/long  points. Therefore, results may not be 100% the same.
         *
         * For now the departure and arrival times seems to be the same, while there is a small
         * discrepancy in the observed heading for takeoff and landing (+- 10 degrees).
         *
         * This might be due to either of those reasons:
         * - FLARM units transmit their heading based on an internall compass (?)
         * - I'm using a rhumb line for heading calculations. However I don't think this makes up for a
         *   10 degree discrepancy...
         *
         *
         * FAILING TEST:
         *
         * The main reason to blame this failing test is to the way FLARM collects and sentds it's data.
         * It turns out the GPS fix is not updated nearly enough. Because of this the position is the same,
         * and therefore when calculating the difference in position we'll get '0', because of which the algorithm
         * thinks the aircraft has stopped.
         *
         * There are several possible solutions:
         *
         * 1. Ignore points which are quicker than x time period in succession.
         * 2. Determine the maximum G load for a specific operation, and ignore anything out of bounds.
         *
         * So long as this hasn't been solved we're disabling this test method.
         *
         */
        //[TestMethod]
        public async Task Flight_D1908_20170408_Subset()
        {
            FlightContext fc = new FlightContext("6770");

            int callbacks = 0;

            fc.OnTakeoff += (sender, args) =>
            {
                Assert.AreEqual(636272591485655057, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                Assert.AreEqual(195, ((FlightContext)sender).Flight.DepartureHeading);
                callbacks++;
            };

            fc.OnLaunchCompleted += (sender, args) =>
            {
                Assert.AreEqual(LaunchMethods.Winch, ((FlightContext)sender).Flight.LaunchMethod);
                Assert.AreEqual(636272591994430449, ((FlightContext)sender).Flight.LaunchFinished?.Ticks);
                callbacks++;
            };

            fc.OnLanding += (sender, args) =>
            {
                Assert.AreEqual(636272591764373758, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                Assert.AreEqual(244, ((FlightContext)sender).Flight.ArrivalHeading);

                callbacks++;
            };

            // These events should NOT be fired
            fc.OnRadarContact        += (sender, e) => Assert.Fail();
            fc.OnCompletedWithErrors += (sender, e) => Assert.Fail();

            fc.Process(Common.ReadFlightPoints("2017-04-08_D-1908.csv", true));

            Assert.AreEqual(3, callbacks);
        }
        public void Flights_PH1384_20170425()
        {
            FlightContext fc = new FlightContext("5657");

            int pass      = 0;
            int callbacks = 0;

            fc.OnTakeoff += (sender, args) =>
            {
                switch (pass)
                {
                case 0:
                    Assert.AreEqual(636287344501749071, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(246, ((FlightContext)sender).Flight.DepartureHeading);
                    break;

                case 1:
                    Assert.AreEqual(636287368213105015, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(246, ((FlightContext)sender).Flight.DepartureHeading);
                    break;

                case 2:
                    Assert.AreEqual(636287382263573133, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(244, ((FlightContext)sender).Flight.DepartureHeading);
                    break;

                case 3:
                    Assert.AreEqual(636287407314361125, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(245, ((FlightContext)sender).Flight.DepartureHeading);
                    break;

                default:
                    break;
                }

                callbacks++;
            };

            fc.OnLanding += (sender, args) =>
            {
                switch (pass)
                {
                case 0:
                    Assert.AreEqual(636287362871888759, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                    Assert.AreEqual(249, ((FlightContext)sender).Flight.ArrivalHeading);
                    break;

                case 1:
                    Assert.AreEqual(636287372913847335, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                    Assert.AreEqual(250, ((FlightContext)sender).Flight.ArrivalHeading);
                    break;

                case 2:
                    Assert.AreEqual(636287393734216787, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                    Assert.AreEqual(250, ((FlightContext)sender).Flight.ArrivalHeading);
                    break;

                case 3:
                    Assert.AreEqual(636287429323052452, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                    Assert.AreEqual(248, ((FlightContext)sender).Flight.ArrivalHeading);
                    break;

                default:
                    break;
                }

                pass++;
                callbacks++;
            };

            fc.Process(Common.ReadFlightPoints("2017-04-25_PH-1384.csv"));

            Assert.AreEqual(4, pass);
            Assert.AreEqual(8, callbacks);
        }
        public async Task Flights_PH1387_20170419_20170421()
        {
            FlightContext fc = new FlightContext("2842");

            int pass = 0;

            fc.OnTakeoff += (sender, args) =>
            {
                switch (pass)
                {
                case 0:
                    Assert.AreEqual(636281989825441178, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(355, ((FlightContext)sender).Flight.DepartureHeading);
                    break;

                case 1:
                    Assert.AreEqual(636283687551363359, ((FlightContext)sender).Flight.DepartureTime?.Ticks);
                    Assert.AreEqual(355, ((FlightContext)sender).Flight.DepartureHeading);
                    break;

                default:
                    Assert.Fail();
                    break;
                }
            };

            //fc.OnLaunchCompleted += (sender, args) =>
            //{
            //    switch (pass)
            //    {
            //        case 0:
            //            Assert.AreEqual(LaunchMethods.Self, ((Experimental.FlightContext)sender).Flight.LaunchMethod);
            //            Assert.AreEqual(636281993021809484, ((Experimental.FlightContext)sender).Flight.LaunchFinished?.Ticks);
            //            break;
            //        case 1:
            //            Assert.AreEqual(LaunchMethods.Self, ((Experimental.FlightContext)sender).Flight.LaunchMethod);
            //            Assert.AreEqual(636283689536727050, ((Experimental.FlightContext)sender).Flight.LaunchFinished?.Ticks);
            //            break;
            //        default:
            //            Assert.Fail();
            //            break;
            //    }
            //};

            fc.OnLanding += (sender, args) =>
            {
                switch (pass)
                {
                case 0:
                    Assert.AreEqual(636282163561655897, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                    Assert.AreEqual(339, ((FlightContext)sender).Flight.ArrivalHeading);
                    break;

                case 1:
                    Assert.AreEqual(636283891197427348, ((FlightContext)sender).Flight.ArrivalTime?.Ticks);
                    Assert.AreEqual(338, ((FlightContext)sender).Flight.ArrivalHeading);
                    break;

                default:
                    Assert.Fail();
                    break;
                }

                pass++;
            };

            fc.Process(Common.ReadFlightPoints("2017-04-19_2017-04-21_PH-1387.csv"));
        }