public void IPEndPointHelper_IsLocalOrLanAddress_Returns_Correct_Values()
        {
            ExcelWorksheetData worksheet = new ExcelWorksheetData(TestContext);

            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(worksheet.String("IPAddress")), 0);
            Assert.AreEqual(worksheet.Bool("Expected"), IPEndPointHelper.IsLocalOrLanAddress(endPoint));
        }
        public void AccessConfiguration_IsPathAccessible_StringVersion_Rejects_Or_Allows_Requests()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            RunDataDrivenTest(worksheet, (requestPathAndFile, requestAddress) => {
                return(_Configuration.IsPathAccessible(requestPathAndFile, requestAddress));
            });
        }
Example #3
0
        public void MimeType_GetForExtension_Returns_Correct_MimeType_For_Extension()
        {
            var excelWorkSheet = new ExcelWorksheetData(TestContext);
            var mimeType       = excelWorkSheet.String("MimeType");
            var extension      = excelWorkSheet.String("Extension");

            Assert.AreEqual(mimeType, MimeType.GetForExtension(extension), extension);
        }
Example #4
0
        public void MimeType_GetForExtension_Returns_Correct_MimeType_For_Extensions_With_Leading_Full_Stop()
        {
            var excelWorkSheet = new ExcelWorksheetData(TestContext);
            var mimeType       = excelWorkSheet.String("MimeType");
            var extension      = String.Format(".{0}", excelWorkSheet.String("Extension"));

            Assert.AreEqual(mimeType, MimeType.GetForExtension(extension), extension);
        }
Example #5
0
        public void MimeType_GetContentClassification_Returns_Correct_Content_Classification_For_Mime_Type()
        {
            var worksheet      = new ExcelWorksheetData(TestContext);
            var mimeType       = worksheet.EString("MimeType");
            var classification = worksheet.ParseEnum <ContentClassification>("Classification");

            Assert.AreEqual(classification, MimeType.GetContentClassification(mimeType));
        }
Example #6
0
        public void Describe_Bytes_Formats_Bytes_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            using (var switcher = new CultureSwitcher(worksheet.String("Region"))) {
                Assert.AreEqual(worksheet.String("Description"), Describe.Bytes(worksheet.Long("Bytes")));
            }
        }
        public void LogClient_IsLocal_Is_Conversion_Of_IpAddress_Property()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var logClient = new LogClient() { IpAddress = worksheet.EString("IpAddress") };

            Assert.AreEqual(worksheet.Bool("IsLocal"), logClient.IsLocal);
        }
        public void Describe_Bytes_Formats_Bytes_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            using(var switcher = new CultureSwitcher(worksheet.String("Region"))) {
                Assert.AreEqual(worksheet.String("Description"), Describe.Bytes(worksheet.Long("Bytes")));
            }
        }
Example #9
0
        public void Aircraft_UpdateCoordinates_Resets_Coordinates_If_Aircraft_Looks_To_Be_Moving_Impossibly_Quickly()
        {
            // Some aircraft's transponders report the wrong position. Further, some radios misinterpret position updates at
            // extreme ranges. We can guess the position is wrong if the position and timing of two updates would require the
            // aircraft to be moving at incredibly high speeds. When this is detected we should reset the trails, otherwise the
            // user sees long lines drawn across the map, or a scribble effect if the transponder is just reporting nonsense.

            var worksheet = new ExcelWorksheetData(TestContext);

            var time         = DateTime.UtcNow;
            var shortSeconds = 24 * 60 * 60; // seconds in a day

            _Aircraft.DataVersion = time.Ticks;
            _Aircraft.Latitude    = worksheet.Float("Lat1");
            _Aircraft.Longitude   = worksheet.Float("Lng1");
            _Aircraft.Track       = 1;
            _Aircraft.UpdateCoordinates(time, shortSeconds);

            int milliseconds = worksheet.Int("Milliseconds");

            time = time.AddMilliseconds(milliseconds);
            _Aircraft.DataVersion = time.Ticks;
            _Aircraft.Latitude    = worksheet.Float("Lat2");
            _Aircraft.Longitude   = worksheet.Float("Lng2");
            _Aircraft.Track       = 2;
            _Aircraft.UpdateCoordinates(time, shortSeconds);

            if (!worksheet.Bool("ResetTrail"))
            {
                if (milliseconds >= 1000)
                {
                    Assert.AreEqual(2, _Aircraft.FullCoordinates.Count);
                    Assert.AreEqual(2, _Aircraft.ShortCoordinates.Count);
                }
                else
                {
                    Assert.AreEqual(1, _Aircraft.FullCoordinates.Count);
                    Assert.AreEqual(1, _Aircraft.ShortCoordinates.Count);
                    Assert.AreEqual(1, _Aircraft.FullCoordinates[0].Heading);
                    Assert.AreEqual(1, _Aircraft.ShortCoordinates[0].Heading);
                }
            }
            else
            {
                if (milliseconds < 1000)
                {
                    Assert.AreEqual(0, _Aircraft.FullCoordinates.Count);
                    Assert.AreEqual(0, _Aircraft.ShortCoordinates.Count);
                }
                else
                {
                    Assert.AreEqual(1, _Aircraft.FullCoordinates.Count);
                    Assert.AreEqual(1, _Aircraft.ShortCoordinates.Count);
                    Assert.AreEqual(2, _Aircraft.FullCoordinates[0].Heading);
                    Assert.AreEqual(2, _Aircraft.ShortCoordinates[0].Heading);
                }
            }
        }
Example #10
0
        public void MimeType_GetForExtension_Is_Case_Insensitive()
        {
            var worksheet = new ExcelWorksheetData(TestContext);
            var mimeType  = worksheet.String("MimeType");
            var extension = String.Format(".{0}", worksheet.String("Extension"));

            Assert.AreEqual(mimeType, MimeType.GetForExtension(extension.ToLower()), extension.ToLower());
            Assert.AreEqual(mimeType, MimeType.GetForExtension(extension.ToUpper()), extension.ToUpper());
        }
        private void BuildExpectedList(ExcelWorksheetData worksheet, List <string> list, string column)
        {
            string value = worksheet.EString(column);

            if (value != null)
            {
                list.Add(value);
            }
        }
Example #12
0
        public void MimeType_GetKnownExtensions_Returns_Reasonable_List()
        {
            var worksheet = new ExcelWorksheetData(TestContext);
            var mimeType  = worksheet.String("MimeType");
            var extension = worksheet.String("Extension");

            var extensions = MimeType.GetKnownExtensions();

            Assert.IsTrue(extensions.Contains(extension.ToLower()));
        }
        public void LogClient_Address_Is_Conversion_Of_IpAddress_Property()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var logClient = new LogClient() { IpAddress = worksheet.EString("IpAddress") };

            var expected = worksheet.String("Address");
            if(expected == null) Assert.IsNull(logClient.Address);
            else                 Assert.AreEqual(expected, logClient.Address.ToString());
        }
        public void Do_ExtractMessageBytes_Extracts_Messages_From_Bytes(bool inputIsText, int blobCount, int extractedCount, Func<byte[], byte[]> alterFirstPacket = null)
        {
            var worksheet = new ExcelWorksheetData(TestContext);
            var comments = worksheet.String("Comments");

            var input = new List<byte[]>();
            for(var i = 1;i <= blobCount;++i) {
                var blobColumn = String.Format("Blob{0}", i);
                if(worksheet.String(blobColumn) != null) {
                    byte[] bytes;
                    if(inputIsText) bytes = Encoding.ASCII.GetBytes(worksheet.String(blobColumn).Replace("\\n", "\n").Replace("\\r", "\r"));
                    else bytes = worksheet.Bytes(blobColumn);

                    if(input.Count == 0 && alterFirstPacket != null) bytes = alterFirstPacket(bytes);
                    input.Add(bytes);
                }
            }

            var expectedOutput = new List<ExtractedBytes>();
            for(var i = 1;i <= extractedCount;++i) {
                var bytesColumn = String.Format("Extracted{0}", i);
                var parityColumn = String.Format("HadParity{0}", i);
                var checksumColumn = String.Format("BadChecksum{0}", i);
                if(worksheet.String(bytesColumn) != null || worksheet.String(checksumColumn) != null) {
                    expectedOutput.Add(new ExtractedBytes() { 
                        Bytes = worksheet.Bytes(bytesColumn),
                        HasParity = worksheet.Bool(parityColumn),
                        ChecksumFailed = worksheet.Bool(checksumColumn),
                    });
                }
            }

            var output = new List<ExtractedBytes>();
            foreach(var inputBytes in input) {
                foreach(var extractedBytes in Extractor.ExtractMessageBytes(inputBytes, 0, inputBytes.Length)) {
                    output.Add((ExtractedBytes)extractedBytes.Clone());
                }
            }

            Assert.AreEqual(expectedOutput.Count, output.Count, comments);
            for(var i = 0;i < expectedOutput.Count;++i) {
                var expected = expectedOutput[i];
                var actual = output[i];
                Assert.AreEqual(Format, actual.Format);
                Assert.AreEqual(expected.ChecksumFailed, actual.ChecksumFailed, comments);
                if(!expected.ChecksumFailed) {
                    Assert.AreEqual(expected.HasParity, actual.HasParity, comments);

                    var actualBytes = new byte[actual.Length];
                    Array.Copy(actual.Bytes, actual.Offset, actualBytes, 0, actual.Length);

                    Assert.IsTrue(expected.Bytes.SequenceEqual(actualBytes), comments);
                }
            }
        }
Example #15
0
        public void PipelineRequest_IsMobileUserAgentString_Decodes_Common_Mobile_UserAgent_Strings()
        {
            var worksheet = new ExcelWorksheetData(TestContext);
            var userAgent = worksheet.EString("UserAgent");
            var device    = worksheet.String("Device");
            var isMobile  = worksheet.Bool("IsMobile");

            _Request.UserAgent = userAgent;

            Assert.AreEqual(isMobile, _Request.IsMobileUserAgentString, "{0}: {1}", device, userAgent ?? "<null>");
        }
Example #16
0
        public void LogClient_IsLocal_Is_Conversion_Of_IpAddress_Property()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var logClient = new LogClient()
            {
                IpAddress = worksheet.EString("IpAddress")
            };

            Assert.AreEqual(worksheet.Bool("IsLocal"), logClient.IsLocal);
        }
        private void SpreadsheetTests(Action <ExcelWorksheetData> afterSetFolder)
        {
            var  worksheet         = new ExcelWorksheetData(TestContext);
            bool checkCacheChanged = worksheet.ColumnExists("CacheChanged");

            for (int i = 1; i <= 2; ++i)
            {
                string nameColumn         = String.Format("File{0}", i);
                string lastModifiedColumn = String.Format("Time{0}", i);

                if (!worksheet.ColumnExists(nameColumn))
                {
                    continue;
                }

                var name = worksheet.String(nameColumn);
                var time = worksheet.ColumnExists(lastModifiedColumn) ? worksheet.DateTime(lastModifiedColumn) : new DateTime(2999, 12, 31);
                if (name != null)
                {
                    _Files.Add(new TestFileInfo(name, time));
                }
            }
            _Provider.Setup(p => p.GetFilesInFolder(It.IsAny <string>())).Returns(_Files);

            var folder = worksheet.String("Folder");

            if (folder != null)
            {
                _DirectoryCache.Folder = folder;
            }

            if (worksheet.ColumnExists("LastModified"))
            {
                var fileInfo = worksheet.String("LastModified") == null ? null : new TestFileInfo(worksheet.String("FileName"), worksheet.DateTime("LastModified"));
                _Provider.Setup(p => p.GetFileInfo(worksheet.EString("FileName"))).Returns(fileInfo);
            }

            if (checkCacheChanged)
            {
                _DirectoryCache.CacheChanged += _CacheChangedEvent.Handler;
            }
            if (afterSetFolder != null)
            {
                afterSetFolder(worksheet);
            }

            Assert.AreEqual(folder, _DirectoryCache.Folder);
            Assert.AreEqual(worksheet.Bool("Exists"), _DirectoryCache.FileExists(worksheet.EString("SearchFor")));

            if (checkCacheChanged)
            {
                Assert.AreEqual(worksheet.Bool("CacheChanged") ? 1 : 0, _CacheChangedEvent.CallCount);
            }
        }
Example #18
0
        public void Aircraft_IcaoCompliantRegistration_Correctly_Transforms_Registration_To_Comply_With_ICAO_Rules()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var aircraft = Factory.Singleton.Resolve <IAircraft>();

            aircraft.Registration = worksheet.EString("Registration");

            Assert.AreEqual(worksheet.EString("IcaoCompliantRegistration"), aircraft.IcaoCompliantRegistration);
            Assert.AreEqual(worksheet.EString("Registration"), aircraft.Registration);
        }
        public void Describe_AirportName_Formats_AirportName_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var officialName = worksheet.EString("OfficialName");
            var cityName = worksheet.EString("City");
            var expected = worksheet.EString("Result");

            var result = Describe.AirportName(officialName, cityName);

            Assert.AreEqual(expected, result);
        }
Example #20
0
        public void NewVersionChecker_CheckForNewVersion_Returns_Correct_Value()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            _ApplicationInformation.Setup(p => p.Version).Returns(new Version(worksheet.String("ApplicationVersion")));
            _Provider.Setup(p => p.DownloadFileContent(It.IsAny <string>())).Returns(worksheet.String("WebsiteVersion").Replace(@"\r", "\r").Replace(@"\n", "\n"));

            bool expected = worksheet.Bool("IsNewer");

            Assert.AreEqual(expected, _NewVersionChecker.CheckForNewVersion());
            Assert.AreEqual(expected, _NewVersionChecker.IsNewVersionAvailable);
        }
Example #21
0
        public void RequestReceivedEventArgs_Constructor_Builds_Properties_From_Request_Correctly()
        {
            ExcelWorksheetData worksheet = new ExcelWorksheetData(TestContext);

            var request = new Mock <IRequest>()
            {
                DefaultValue = DefaultValue.Mock
            }.SetupAllProperties();
            var response = new Mock <IResponse>()
            {
                DefaultValue = DefaultValue.Mock
            }.SetupAllProperties();
            var headers = new NameValueCollection();

            var endPoint = new IPEndPoint(IPAddress.Parse(worksheet.String("ResponseAddress")), 45678);

            request.Setup(r => r.RemoteEndPoint).Returns(endPoint);
            request.Setup(r => r.Url).Returns(new Uri(worksheet.EString("Url")));
            request.Setup(r => r.RawUrl).Returns(worksheet.EString("RawUrl"));
            request.Setup(r => r.Headers).Returns(headers);

            var xForwardedFor = worksheet.EString("XForwardedFor");

            if (xForwardedFor != null)
            {
                headers.Add("X-Forwarded-For", xForwardedFor);
            }

            var args = new RequestReceivedEventArgs(request.Object, response.Object, worksheet.EString("Root"));

            Assert.AreEqual(worksheet.EString("WebSite"), args.WebSite);
            Assert.AreEqual(worksheet.EString("PathAndFile"), args.PathAndFile);
            Assert.AreEqual(worksheet.EString("Path"), args.Path);
            Assert.AreEqual(worksheet.EString("File"), args.File);
            Assert.AreEqual(worksheet.EString("ProxyAddress"), args.ProxyAddress);
            Assert.AreEqual(worksheet.EString("ClientAddress"), args.ClientAddress);
            Assert.AreEqual(worksheet.Bool("IsInternetRequest"), args.IsInternetRequest);
            Assert.AreEqual(worksheet.Int("PathCount"), args.PathParts.Count);
            Assert.AreEqual(worksheet.Int("QueryCount"), args.QueryString.Count);

            for (var i = 0; i < args.PathParts.Count; ++i)
            {
                Assert.AreEqual(worksheet.EString(String.Format("Path{0}", i)), args.PathParts[i]);
            }

            for (var i = 0; i < args.QueryString.Count; ++i)
            {
                var expectedName  = worksheet.String(String.Format("QueryName{0}", i));
                var expectedValue = worksheet.String(String.Format("QueryValue{0}", i));

                Assert.AreEqual(expectedValue, args.QueryString[expectedName]);
            }
        }
        public void ModeSParity_StripParity_Removes_Parity_From_Last_Three_Bytes()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var bytes = worksheet.Bytes("Bytes");
            var offset = worksheet.Int("Offset");
            var length = worksheet.Int("Length");

            _ModeSParity.StripParity(bytes, offset, length);

            Assert.IsTrue(worksheet.Bytes("Expected").SequenceEqual(bytes));
        }
Example #23
0
        public void ModeSParity_StripParity_Removes_Parity_From_Last_Three_Bytes()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var bytes  = worksheet.Bytes("Bytes");
            var offset = worksheet.Int("Offset");
            var length = worksheet.Int("Length");

            _ModeSParity.StripParity(bytes, offset, length);

            Assert.IsTrue(worksheet.Bytes("Expected").SequenceEqual(bytes));
        }
Example #24
0
        public void AircraftSanityChecker_IsGoodAircraftIcao_Returns_Correct_Value()
        {
            var worksheet = new ExcelWorksheetData(TestContext);
            var icao      = worksheet.EString("ICAO");
            var expected  = worksheet.Bool("Result");

            _Configuration.RawDecodingSettings.SuppressIcao0 = worksheet.Bool("SuppressIcao0");

            var result = _Checker.IsGoodAircraftIcao(icao);

            Assert.AreEqual(expected, result);
        }
Example #25
0
        public void Describe_AirportName_Formats_AirportName_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var officialName = worksheet.EString("OfficialName");
            var cityName     = worksheet.EString("City");
            var expected     = worksheet.EString("Result");

            var result = Describe.AirportName(officialName, cityName);

            Assert.AreEqual(expected, result);
        }
Example #26
0
        public void AccessConfiguration_IsPathAccessible_IPAddressVersion_Rejects_Or_Allows_Requests()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            RunDataDrivenTest(worksheet, (requestPathAndFile, requestAddress) => {
                IPAddress ipAddress;
                if (!IPAddress.TryParse(requestAddress, out ipAddress))
                {
                    ipAddress = IPAddress.None;
                }
                return(_Configuration.IsPathAccessible(requestPathAndFile, ipAddress));
            });
        }
Example #27
0
        public void PolarPlotter_Initialise_Initialises_The_Plotter_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var roundDegrees     = 0;
            var seenArgException = false;

            try {
                roundDegrees = worksheet.Int("RoundDegree");
                _Plotter.Initialise(
                    worksheet.Double("Latitude"),
                    worksheet.Double("Longitude"),
                    worksheet.Int("LowSlice"),
                    worksheet.Int("HighSlice"),
                    worksheet.Int("SliceHeight"),
                    roundDegrees
                    );
            } catch (ArgumentException) {
                seenArgException = true;
            }

            Assert.AreEqual(worksheet.Bool("ArgException"), seenArgException);
            if (!seenArgException)
            {
                var slices = _Plotter.TakeSnapshot();
                Assert.AreEqual(worksheet.Double("Latitude"), _Plotter.Latitude);
                Assert.AreEqual(worksheet.Double("Longitude"), _Plotter.Longitude);
                Assert.AreEqual(worksheet.Int("RoundDegree"), _Plotter.RoundToDegrees);
                Assert.AreEqual(worksheet.Int("CountSlices"), slices.Count);

                var expectedPlotsPerSlice = 360 / roundDegrees;
                foreach (var slice in slices)
                {
                    Assert.AreEqual(expectedPlotsPerSlice, slice.PolarPlots.Count);
                }

                for (var i = 1; i <= 5; ++i)
                {
                    var lowName  = String.Format("Low{0}", i);
                    var highName = String.Format("High{0}", i);
                    var lowText  = worksheet.String(lowName);
                    var highText = worksheet.String(highName);
                    if (lowText != null && highText != null)
                    {
                        var expectedLow  = lowText == "Min" ? int.MinValue : int.Parse(lowText);
                        var expectedHigh = highText == "Max" ? int.MaxValue : int.Parse(highText);
                        Assert.IsTrue(slices.Any(r => r.AltitudeLower == expectedLow && r.AltitudeHigher == expectedHigh), "Could not find {0}-{1}", lowText, highText);
                    }
                }
            }
        }
Example #28
0
        public void Aircraft_UpdateCoordinates_Replaces_Last_Full_Coordinate_If_Track_Hardly_Changes()
        {
            // If an update changes the position but the aircraft remains on the same ground track as the previous position
            // then there's no need to keep the previous position, it can be replaced with the current one.

            var worksheet = new ExcelWorksheetData(TestContext);

            var time = DateTime.Now;

            var expected = new List <Coordinate>();

            for (int i = 1; i <= 4; ++i)
            {
                var latInColumn = String.Format("Lat{0}", i);
                var lngInColumn = String.Format("Lng{0}", i);
                var trkInColumn = String.Format("Trk{0}", i);

                var latOutColumn = String.Format("CLat{0}", i);
                var lngOutColumn = String.Format("CLng{0}", i);
                var trkOutColumn = String.Format("CTrk{0}", i);

                if (worksheet.String(latInColumn) != null)
                {
                    time = time.AddHours(1);
                    _Aircraft.DataVersion = time.Ticks;
                    _Aircraft.Latitude    = worksheet.Float(latInColumn);
                    _Aircraft.Longitude   = worksheet.Float(lngInColumn);
                    _Aircraft.Track       = worksheet.NFloat(trkInColumn);
                    _Aircraft.UpdateCoordinates(time, 300 * 60 * 60);

                    Assert.AreEqual(i, _Aircraft.ShortCoordinates.Count);
                }

                if (worksheet.String(latOutColumn) != null)
                {
                    expected.Add(new Coordinate(0, 0, worksheet.Float(latOutColumn), worksheet.Float(lngOutColumn), worksheet.NFloat(trkOutColumn)));
                }
            }

            Assert.AreEqual(expected.Count, _Aircraft.FullCoordinates.Count);

            for (int i = 0; i < expected.Count; ++i)
            {
                var expCoordinate  = expected[i];
                var fullCoordinate = _Aircraft.FullCoordinates[i];

                Assert.AreEqual(expCoordinate, fullCoordinate, i.ToString());
                Assert.AreEqual(expCoordinate.Heading, fullCoordinate.Heading, i.ToString());
            }
        }
        public void Describe_Airport_Formats_Airport_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var comparer = new IPAddressComparer();
            var lhs = worksheet.String("LHS") == null ? null : IPAddress.Parse(worksheet.String("LHS"));
            var rhs = worksheet.String("RHS") == null ? null : IPAddress.Parse(worksheet.String("RHS"));
            var expectedResult = worksheet.Int("Result");

            var result = comparer.Compare(lhs, rhs);
            if(expectedResult < 0)      Assert.IsTrue(result < 0);
            else if(expectedResult > 0) Assert.IsTrue(result > 0);
            else                        Assert.AreEqual(0, result);
        }
        public void Describe_Airport_Formats_Airport_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var airport = new Airport();
            airport.IcaoCode = worksheet.EString("Icao");
            airport.IataCode = worksheet.EString("Iata");
            airport.Name = worksheet.EString("Name");
            airport.Country = worksheet.EString("Country");

            var result = Describe.Airport(airport, worksheet.Bool("PreferIata"), worksheet.Bool("ShowCode"), worksheet.Bool("ShowName"), worksheet.Bool("ShowCountry"));

            Assert.AreEqual(worksheet.EString("Result"), result);
        }
        public void GreatCircleMaths_Distance_Calculates_Correct_Distances()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var startLatitude = worksheet.NDouble("StartLatitude");
            var startLongitude = worksheet.NDouble("StartLongitude");
            var endLatitude = worksheet.NDouble("EndLatitude");
            var endLongitude = worksheet.NDouble("EndLongitude");
            var expected = worksheet.NDouble("Distance");

            var actual = GreatCircleMaths.Distance(startLatitude, startLongitude, endLatitude, endLongitude);

            if(expected == null) Assert.IsNull(actual);
            else                 Assert.AreEqual((double)expected, (double)actual, 0.0001);
        }
Example #32
0
        public void PipelineContext_ConstructUrl_Returns_Correct_Values()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var scheme      = worksheet.EString("Scheme");
            var host        = worksheet.EString("Host");
            var pathBase    = worksheet.EString("PathBase");
            var path        = worksheet.EString("Path");
            var queryString = worksheet.EString("QueryString");
            var expected    = worksheet.EString("URL");

            var url = PipelineContext.ConstructUrl(scheme, host, pathBase, path, queryString);

            Assert.AreEqual(expected, url);
        }
Example #33
0
        public void Describe_Airport_Formats_Airport_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var airport = new Airport();

            airport.IcaoCode = worksheet.EString("Icao");
            airport.IataCode = worksheet.EString("Iata");
            airport.Name     = worksheet.EString("Name");
            airport.Country  = worksheet.EString("Country");

            var result = Describe.Airport(airport, worksheet.Bool("PreferIata"), worksheet.Bool("ShowCode"), worksheet.Bool("ShowName"), worksheet.Bool("ShowCountry"));

            Assert.AreEqual(worksheet.EString("Result"), result);
        }
Example #34
0
        public void Airline_IsCharterFlightNumber_Returns_Correct_Value()
        {
            var worksheet    = new ExcelWorksheetData(TestContext);
            var regex        = worksheet.EString("Regex");
            var flightNumber = worksheet.EString("FlightNumber");

            var airline = new Airline()
            {
                CharterFlightPattern = regex
            };
            var actual   = airline.IsCharterFlightNumber(flightNumber);
            var expected = worksheet.Bool("Matches");

            Assert.AreEqual(expected, actual, $"FlightNumber '{flightNumber}' and Regex '{regex}'");
        }
Example #35
0
        public void Cidr_Matches_Compares_Addresses_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            // Uncomment this block if you want to restrict the test to just those rows with a RunThis of true
            // var runThis = worksheet.NBool("RunThis").GetValueOrDefault();
            // if(!runThis) Assert.Fail();

            var cidr    = Cidr.Parse(worksheet.String("CIDR"));
            var address = GetExcelIPAddress(worksheet, "Address");

            var expected = worksheet.Bool("Result");
            var actual   = cidr.Matches(address);

            Assert.AreEqual(expected, actual);
        }
        public void GreatCircleMaths_Bearing_Calculates_Correct_Bearing()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var startLatitude = worksheet.NDouble("StartLatitude");
            var startLongitude = worksheet.NDouble("StartLongitude");
            var endLatitude = worksheet.NDouble("EndLatitude");
            var endLongitude = worksheet.NDouble("EndLongitude");
            var currentTrack = worksheet.NDouble("CurrentTrack");
            var expected = worksheet.NDouble("Bearing");

            var actual = GreatCircleMaths.Bearing(startLatitude, startLongitude, endLatitude, endLongitude, currentTrack, worksheet.Bool("ReverseBearing"), worksheet.Bool("IgnoreCurrentTrack"));

            if(expected == null) Assert.IsNull(actual);
            else                 Assert.AreEqual((double)expected, (double)actual, 0.0001);
        }
Example #37
0
        public void Callsign_Ctor_Parses_Callsigns_Correctly()
        {
            var worksheet    = new ExcelWorksheetData(TestContext);
            var callsignText = worksheet.EString("Callsign");

            var callsign = new Callsign(callsignText);

            var message = $"Callsign is '{callsignText}'";

            Assert.AreEqual(worksheet.EString("OriginalCallsign"), callsign.OriginalCallsign, message);
            Assert.AreEqual(worksheet.EString("Code"), callsign.Code, message);
            Assert.AreEqual(worksheet.EString("Number"), callsign.Number, message);
            Assert.AreEqual(worksheet.EString("TrimmedNumber"), callsign.TrimmedNumber, message);
            Assert.AreEqual(worksheet.EString("TrimmedCallsign"), callsign.TrimmedCallsign, message);
            Assert.AreEqual(worksheet.Bool("IsOriginalCallsignValid"), callsign.IsOriginalCallsignValid, message);
        }
Example #38
0
        public void Cidr_TryParse_Parses_Addresses_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            Cidr cidr;
            var  address = worksheet.EString("Parse");
            var  parsed  = Cidr.TryParse(address, out cidr);

            Assert.AreEqual(!parsed, worksheet.NBool("Exception").GetValueOrDefault());
            if (parsed)
            {
                Assert.AreEqual(GetExcelIPAddress(worksheet, "Address"), cidr.Address);
                Assert.AreEqual(GetExcelIPAddress(worksheet, "MaskedAddress"), cidr.MaskedAddress);
                Assert.AreEqual(worksheet.Int("BitmaskBits"), cidr.BitmaskBits);
                Assert.AreEqual(worksheet.UInt("IPv4Bitmask"), cidr.IPv4Bitmask);
            }
        }
Example #39
0
        public void Responder_SendText_Fills_Response_Correctly()
        {
            ExcelWorksheetData worksheet = new ExcelWorksheetData(TestContext);

            string encodingName = worksheet.String("Encoding");
            var    encoding     = encodingName == null ? (Encoding)null : (Encoding)typeof(Encoding).GetProperty(encodingName, BindingFlags.Static | BindingFlags.Public).GetValue(null, null);

            _Responder.SendText(_Request.Object, _Response.Object, worksheet.EString("Text"), encoding, worksheet.EString("MimeType"));

            byte[] expectedStreamContent = worksheet.Bytes("ResponseContent");
            byte[] actualStreamContent   = _OutputStream.ToArray();

            Assert.IsTrue(expectedStreamContent.SequenceEqual(actualStreamContent));
            Assert.AreEqual(expectedStreamContent.Length, _Response.Object.ContentLength);
            Assert.AreEqual(worksheet.String("ResponseMimeType"), _Response.Object.MimeType);
            Assert.AreEqual(HttpStatusCode.OK, _Response.Object.StatusCode);
        }
Example #40
0
        public void WebSite_Image_Renders_Pictures_At_Correct_Size()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            CreateMonochromeImage("ImageRenderSize.png", worksheet.Int("OriginalWidth"), worksheet.Int("OriginalHeight"), Brushes.Red);
            ConfigurePictureManagerForPathAndFile(TestContext.TestDeploymentDir, "ImageRenderSize.png");

            _Configuration.BaseStationSettings.PicturesFolder = TestContext.TestDeploymentDir;
            _WebSite.AttachSiteToServer(_WebServer.Object);

            string pathAndFile = String.Format("/Images/Size-{0}/File-ImageRenderSize/Picture.png", worksheet.String("Size"));

            _WebServer.Raise(m => m.RequestReceived += null, RequestReceivedEventArgsHelper.Create(_Request, _Response, pathAndFile, false));

            using (var siteImage = (Bitmap)Bitmap.FromStream(_OutputStream)) {
                AssertImageIsMonochrome(siteImage, _Red, worksheet.Int("NewWidth"), worksheet.Int("NewHeight"));
            }
        }
Example #41
0
        public void AircraftPictureManager_FindPicture_Uses_ICAO_Compliant_Registration()
        {
            var worksheet    = new ExcelWorksheetData(TestContext);
            var registration = worksheet.EString("Registration");
            var icaoCompliantRegistration = worksheet.EString("IcaoCompliantRegistration");

            if (registration != icaoCompliantRegistration && !String.IsNullOrEmpty(icaoCompliantRegistration))
            {
                var registrationFileName  = String.Format("{0}.jpg", registration);
                var icaoCompliantFileName = String.Format("{0}.jpg", icaoCompliantRegistration);

                _DirectoryCache.Object.Folder = "";
                _DirectoryCache.Setup(c => c.FileExists(registrationFileName)).Returns((string fn) => { Assert.Fail("FindPicture did not strip non-ICAO characters from the registration"); return(false); });
                _DirectoryCache.Setup(c => c.FileExists(icaoCompliantFileName)).Returns((string fn) => { return(true); });

                Assert.AreEqual(icaoCompliantFileName, _PictureManager.FindPicture(_DirectoryCache.Object, "ICAO", registration));
            }
        }
        public void ModeSTranslator_Translate_Decodes_Packets_Correctly()
        {
            for(var conversionMethod = 0;conversionMethod < 2;++conversionMethod) {
                var worksheet = new ExcelWorksheetData(TestContext);
                var expectedValue = new SpreadsheetFieldValue(worksheet, 7);

                var bits = worksheet.String("Packet");
                var bytes = TestUtilities.ConvertBitStringToBytes(bits);

                var reply = conversionMethod == 0 ? _Translator.Translate(bytes.ToArray()) : _Translator.Translate(bytes.ToArray(), 0);

                foreach(var replyProperty in reply.GetType().GetProperties()) {
                    switch(replyProperty.Name) {
                        case "ACASMessage":                          Assert.IsTrue(TestUtilities.SequenceEqual(expectedValue.GetBytes("MV"), reply.ACASMessage)); break;
                        case "Altitude":                             Assert.AreEqual(expectedValue.GetNInt("AC"), reply.Altitude); break;
                        case "AltitudeIsMetric":                     Assert.AreEqual(expectedValue.GetNBool("AC:M"), reply.AltitudeIsMetric); break;
                        case "ApplicationField":                     Assert.AreEqual(expectedValue.GetEnum<ApplicationField>("AF"), reply.ApplicationField); break;
                        case "Capability":                           Assert.AreEqual(expectedValue.GetEnum<Capability>("CA"), reply.Capability); break;
                        case "CommBMessage":                         Assert.IsTrue(TestUtilities.SequenceEqual(expectedValue.GetBytes("MB"), reply.CommBMessage)); break;
                        case "CommDMessage":                         Assert.IsTrue(TestUtilities.SequenceEqual(expectedValue.GetBytes("MD"), reply.CommDMessage)); break;
                        case "ControlField":                         Assert.AreEqual(expectedValue.GetEnum<ControlField>("CF"), reply.ControlField); break;
                        case "CrossLinkCapability":                  Assert.AreEqual(expectedValue.GetNBool("CC"), reply.CrossLinkCapability); break;
                        case "DownlinkFormat":                       Assert.AreEqual(worksheet.ParseEnum<DownlinkFormat>("DownlinkFormat"), reply.DownlinkFormat); break;
                        case "DownlinkRequest":                      Assert.AreEqual(expectedValue.GetNByte("DR", true), reply.DownlinkRequest); break;
                        case "DSegmentNumber":                       Assert.AreEqual(expectedValue.GetNByte("ND", true), reply.DSegmentNumber); break;
                        case "ElmControl":                           Assert.AreEqual(expectedValue.GetEnum<ElmControl>("KE"), reply.ElmControl); break;
                        case "ExtendedSquitterMessage":              Assert.IsTrue(TestUtilities.SequenceEqual(expectedValue.GetBytes("ME"), reply.ExtendedSquitterMessage)); break;
                        case "ExtendedSquitterSupplementaryMessage": Assert.IsTrue(TestUtilities.SequenceEqual(expectedValue.GetBytes("MEX"), reply.ExtendedSquitterSupplementaryMessage)); break;
                        case "FlightStatus":                         Assert.AreEqual(expectedValue.GetEnum<FlightStatus>("FS"), reply.FlightStatus); break;
                        case "FormattedIcao24":                      Assert.AreEqual(worksheet.String("Icao24"), reply.FormattedIcao24); break;
                        case "Icao24":                               Assert.AreEqual(Convert.ToInt32(worksheet.String("Icao24"), 16), reply.Icao24); break;
                        case "Identity":                             Assert.AreEqual(expectedValue.GetNShort("ID"), reply.Identity); break;
                        case "NonIcao24Address":                     Assert.AreEqual(expectedValue.GetNInt("AAX", true), reply.NonIcao24Address); break;
                        case "ParityInterrogatorIdentifier":         Assert.AreEqual(expectedValue.GetNInt("PI", true), reply.ParityInterrogatorIdentifier); break;
                        case "PossibleCallsign":                     Assert.AreEqual(expectedValue.GetString("PC"), reply.PossibleCallsign); break;
                        case "ReplyInformation":                     Assert.AreEqual(expectedValue.GetNByte("RI", true), reply.ReplyInformation); break;
                        case "SensitivityLevel":                     Assert.AreEqual(expectedValue.GetNByte("SL", true), reply.SensitivityLevel); break;
                        case "UtilityMessage":                       Assert.AreEqual(expectedValue.GetNByte("UM", true), reply.UtilityMessage); break;
                        case "VerticalStatus":                       Assert.AreEqual(expectedValue.GetEnum<VerticalStatus>("VS"), reply.VerticalStatus); break;
                        default:                                     throw new NotImplementedException();
                    }
                }
            }
        }
        public void VectorVelocity_Calculates_Velocity_And_Bearing_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var velocity = new VectorVelocity() {
                IsWesterlyVelocity = worksheet.Bool("IsWesterlyVelocity"),
                IsSoutherlyVelocity = worksheet.Bool("IsSoutherlyVelocity"),
                EastWestVelocity = worksheet.NShort("EastWestVelocity"),
                EastWestExceeded = worksheet.Bool("EastWestExceeded"),
                NorthSouthVelocity = worksheet.NShort("NorthSouthVelocity"),
                NorthSouthExceeded = worksheet.Bool("NorthSouthExceeded"),
            };

            if(worksheet.String("Speed") == null) Assert.IsNull(velocity.Speed);
            else Assert.AreEqual(worksheet.Double("Speed"), velocity.Speed.Value, 0.000001);

            if(worksheet.String("Bearing") == null) Assert.IsNull(velocity.Bearing);
            else Assert.AreEqual(worksheet.Double("Bearing"), velocity.Bearing.Value, 0.000001);
        }
        public void RequestReceivedEventArgs_Constructor_Builds_Properties_From_Request_Correctly()
        {
            ExcelWorksheetData worksheet = new ExcelWorksheetData(TestContext);

            var request = new Mock<IRequest>() { DefaultValue = DefaultValue.Mock }.SetupAllProperties();
            var response = new Mock<IResponse>()  { DefaultValue = DefaultValue.Mock }.SetupAllProperties();
            var headers = new NameValueCollection();

            var endPoint = new IPEndPoint(IPAddress.Parse(worksheet.String("ResponseAddress")), 45678);

            request.Setup(r => r.RemoteEndPoint).Returns(endPoint);
            request.Setup(r => r.Url).Returns(new Uri(worksheet.EString("Url")));
            request.Setup(r => r.RawUrl).Returns(worksheet.EString("RawUrl"));
            request.Setup(r => r.Headers).Returns(headers);

            var xForwardedFor = worksheet.EString("XForwardedFor");
            if(xForwardedFor != null) headers.Add("X-Forwarded-For", xForwardedFor);

            var args = new RequestReceivedEventArgs(request.Object, response.Object, worksheet.EString("Root"));

            Assert.AreEqual(worksheet.EString("WebSite"), args.WebSite);
            Assert.AreEqual(worksheet.EString("PathAndFile"), args.PathAndFile);
            Assert.AreEqual(worksheet.EString("File"), args.File);
            Assert.AreEqual(worksheet.EString("ProxyAddress"), args.ProxyAddress);
            Assert.AreEqual(worksheet.EString("ClientAddress"), args.ClientAddress);
            Assert.AreEqual(worksheet.Bool("IsInternetRequest"), args.IsInternetRequest);
            Assert.AreEqual(worksheet.Int("PathCount"), args.PathParts.Count);
            Assert.AreEqual(worksheet.Int("QueryCount"), args.QueryString.Count);

            for(var i = 0;i < args.PathParts.Count;++i) {
                Assert.AreEqual(worksheet.EString(String.Format("Path{0}", i)), args.PathParts[i]);
            }

            for(var i = 0;i < args.QueryString.Count;++i) {
                var expectedName = worksheet.String(String.Format("QueryName{0}", i));
                var expectedValue = worksheet.String(String.Format("QueryValue{0}", i));

                Assert.AreEqual(expectedValue, args.QueryString[expectedName]);
            }
        }
        public void GreatCircleMaths_Destination_Calculates_Correct_Destination()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var startLatitude = worksheet.NDouble("StartLatitude");
            var startLongitude = worksheet.NDouble("StartLongitude");
            var bearing = worksheet.NDouble("Bearing");
            var distance = worksheet.NDouble("Distance");

            double? endLatitude, endLongitude;
            GreatCircleMaths.Destination(startLatitude, startLongitude, bearing, distance, out endLatitude, out endLongitude);

            var expectedLatitude = worksheet.NDouble("EndLatitude");
            var expectedLongitude = worksheet.NDouble("EndLongitude");

            if(expectedLatitude == null || expectedLongitude == null) {
                Assert.AreEqual(expectedLatitude, endLatitude);
                Assert.AreEqual(expectedLongitude, endLongitude);
            } else {
                Assert.AreEqual(expectedLatitude.Value, endLatitude.Value, 0.0001);
                Assert.AreEqual(expectedLongitude.Value, endLongitude.Value, 0.0001);
            }
        }
        public void CompactPositionReporting_Encode_Produces_Correct_Results_For_CPR101_Tables()
        {
            // The values for this test are all taken directly from the transition latitude test tables in 1090-WP30-12 Proposed New Appendix CPR101.
            var worksheet = new ExcelWorksheetData(TestContext);

            var numberOfBits = worksheet.Byte("Bits");
            var oddFormat = worksheet.Bool("OddFormat");
            var latitude = worksheet.Double("Latitude");
            var longitude = worksheet.Double("Longitude");
            var globalCoordinate = new GlobalCoordinate(latitude, longitude);

            var expectedLatitude = Convert.ToInt32(worksheet.String("ExpectedLatitude"), 16);
            var expectedLongitude = Convert.ToInt32(worksheet.String("ExpectedLongitude"), 16);
            var dataRow = worksheet.Int("DataRow"); // helps set conditional breakpoints, VSTS doesn't always process rows in ascending order as they appear in the worksheet

            // In testing some of the input latitudes and longitudes couldn't produce the expected results from table 6-1 etc. of 1090-WP30-12 because of small
            // rounding errors in the handling of doubles. Switching to decimals didn't help and it would make the code slower because the FPU doesn't work with
            // decimals. So the "RELatitude" and "RELongitude" columns were added - if they are empty then the code is expected to produce the values in
            // the Expected columns, which corresponds with the test results from 1090-WP30-12, but if they contain values then these are the actual results after
            // the rounding error has had its wicked way. In most cases they are 1 out for latitude but that can move the resolved latitude into a different NL and produce
            // a large difference in longitude. There are very few of these anomalies, they represent errors of a few feet and as this isn't going into an aircraft I can't
            // say I'm too bothered about them. However I do want them to be obvious in the test data, hence the reason for adding new columns rather than just changing
            // the expected results.
            int? reLatitude = null;
            int? reLongitude = null;
            if(worksheet.String("RELatitude") != null) {
                reLatitude = Convert.ToInt32(worksheet.String("RELatitude"), 16);
                reLongitude = Convert.ToInt32(worksheet.String("RELongitude"), 16);
            }

            var coordinate = _Cpr.Encode(globalCoordinate, oddFormat, numberOfBits);
            Assert.AreEqual(reLatitude ?? expectedLatitude, coordinate.Latitude);
            Assert.AreEqual(reLongitude ?? expectedLongitude, coordinate.Longitude);
            Assert.AreEqual(numberOfBits, coordinate.NumberOfBits);
            Assert.AreEqual(oddFormat, coordinate.OddFormat);
        }
        public void BaseStationDatabase_UpdateAircraft_Correctly_Updates_Record()
        {
            _Database.WriteSupportEnabled = true;
            var worksheet = new ExcelWorksheetData(TestContext);

            var id = (int)AddAircraft(new BaseStationAircraft() { ModeS = "ZZZZZZ" });

            var update = _Database.GetAircraftById(id);
            LoadAircraftFromSpreadsheet(worksheet, 0, update);

            _Database.UpdateAircraft(update);

            var readBack = _Database.GetAircraftById(id);
            AssertAircraftAreEqual(update, readBack, id);
        }
        public void UniversalPlugAndPlayManager_PutServerOntoInternet_Adds_Correct_Mapping_To_Router()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            _Configuration.WebServerSettings.EnableUPnp = worksheet.Bool("CnfEnabled");
            _Configuration.WebServerSettings.UPnpPort = worksheet.Int("CnfUPnpPort");
            _WebServer.Setup(s => s.NetworkIPAddress).Returns(worksheet.String("SvrAddress"));
            _WebServer.Setup(s => s.Port).Returns(worksheet.Int("SvrPort"));

            _Manager.Initialise();

            if(worksheet.String("RtrDescription") != null) {
                AddPortMapping(worksheet.String("RtrDescription"),
                               worksheet.Int("RtrExtPort"),
                               worksheet.String("RtrIntClient"),
                               worksheet.Int("RtrIntPort"),
                               worksheet.String("RtrProtocol"));
            }

            _Manager.StateChanged += _StateChangedEvent.Handler;
            _Manager.PutServerOntoInternet();

            _Provider.Verify(p => p.AddMapping(worksheet.Int("CnfUPnpPort"), "TCP", worksheet.Int("SvrPort"), worksheet.String("SvrAddress"), true, _Description),
                worksheet.Bool("ExpectAdd") ? Times.Once() : Times.Never());

            Assert.AreEqual(worksheet.Bool("ExpectIsPresent"), _Manager.PortForwardingPresent);
            Assert.AreEqual(worksheet.Bool("ExpectStateChanged") ? 1 : 0, _StateChangedEvent.CallCount);
            if(_StateChangedEvent.CallCount > 0) {
                Assert.AreSame(_Manager, _StateChangedEvent.Sender);
                Assert.IsNotNull(_StateChangedEvent.Args);
            }
        }
        public void BaseStationDatabase_GetAircraftByCode_Returns_Aircraft_Object_For_ICAO24_Code()
        {
            var worksheet = new ExcelWorksheetData(TestContext);
            var mockAircraft = LoadAircraftFromSpreadsheet(worksheet);

            var id = AddAircraft(mockAircraft);

            var aircraft = _Database.GetAircraftByCode(mockAircraft.ModeS);
            Assert.AreNotSame(aircraft, mockAircraft);

            AssertAircraftAreEqual(mockAircraft, aircraft, id);
        }
        public void Aircraft_UpdateCoordinates_Resets_Coordinates_If_Aircraft_Looks_To_Be_Moving_Impossibly_Quickly()
        {
            // Some aircraft's transponders report the wrong position. Further, some radios misinterpret position updates at
            // extreme ranges. We can guess the position is wrong if the position and timing of two updates would require the
            // aircraft to be moving at incredibly high speeds. When this is detected we should reset the trails, otherwise the
            // user sees long lines drawn across the map, or a scribble effect if the transponder is just reporting nonsense.

            var worksheet = new ExcelWorksheetData(TestContext);

            var time = DateTime.UtcNow;
            var shortSeconds = 24 * 60 * 60; // seconds in a day

            _Aircraft.DataVersion = time.Ticks;
            _Aircraft.Latitude = worksheet.Float("Lat1");
            _Aircraft.Longitude = worksheet.Float("Lng1");
            _Aircraft.Track = 1;
            _Aircraft.UpdateCoordinates(time, shortSeconds);

            int milliseconds = worksheet.Int("Milliseconds");

            time = time.AddMilliseconds(milliseconds);
            _Aircraft.DataVersion = time.Ticks;
            _Aircraft.Latitude = worksheet.Float("Lat2");
            _Aircraft.Longitude = worksheet.Float("Lng2");
            _Aircraft.Track = 2;
            _Aircraft.UpdateCoordinates(time, shortSeconds);

            if(!worksheet.Bool("ResetTrail")) {
                if(milliseconds >= 1000) {
                    Assert.AreEqual(2, _Aircraft.FullCoordinates.Count);
                    Assert.AreEqual(2, _Aircraft.ShortCoordinates.Count);
                } else {
                    Assert.AreEqual(1, _Aircraft.FullCoordinates.Count);
                    Assert.AreEqual(1, _Aircraft.ShortCoordinates.Count);
                    Assert.AreEqual(1, _Aircraft.FullCoordinates[0].Heading);
                    Assert.AreEqual(1, _Aircraft.ShortCoordinates[0].Heading);
                }
            } else {
                if(milliseconds < 1000) {
                    Assert.AreEqual(0, _Aircraft.FullCoordinates.Count);
                    Assert.AreEqual(0, _Aircraft.ShortCoordinates.Count);
                } else {
                    Assert.AreEqual(1, _Aircraft.FullCoordinates.Count);
                    Assert.AreEqual(1, _Aircraft.ShortCoordinates.Count);
                    Assert.AreEqual(2, _Aircraft.FullCoordinates[0].Heading);
                    Assert.AreEqual(2, _Aircraft.ShortCoordinates[0].Heading);
                }
            }
        }
        public void Aircraft_UpdateCoordinates_Trims_Short_Coordinates_After_Time_Limit_Has_Passed()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var seconds = worksheet.Int("Seconds");
            var baseTime = DateTime.UtcNow;

            for(int i = 1;i <= 3;++i) {
                var secondsGapColumn = String.Format("SecondsGap{0}", i);
                var latitudeColumn = String.Format("Latitude{0}", i);
                var longitudeColumn = String.Format("Longitude{0}", i);
                var trackColumn = String.Format("Track{0}", i);

                if(worksheet.String(secondsGapColumn) != null) {
                    var utcNow = baseTime.AddSeconds(worksheet.Int(secondsGapColumn));
                    _Aircraft.DataVersion = utcNow.Ticks;
                    _Aircraft.Latitude = worksheet.NFloat(latitudeColumn);
                    _Aircraft.Longitude = worksheet.NFloat(longitudeColumn);
                    _Aircraft.Track = worksheet.NFloat(trackColumn);
                    _Aircraft.UpdateCoordinates(utcNow, seconds);
                }
            }

            Assert.AreEqual(worksheet.Int("ExpectedCount"), _Aircraft.ShortCoordinates.Count);
            for(int i = 0;i < _Aircraft.ShortCoordinates.Count;++i) {
                var expectedTrackColumn = String.Format("ExpectedTrack{0}", i);
                Assert.AreEqual(worksheet.NFloat(expectedTrackColumn), _Aircraft.ShortCoordinates[i].Heading, i.ToString());
            }
        }
        public void Aircraft_UpdateCoordinates_Replaces_Last_Full_Coordinate_If_Track_Hardly_Changes()
        {
            // If an update changes the position but the aircraft remains on the same ground track as the previous position
            // then there's no need to keep the previous position, it can be replaced with the current one.

            var worksheet = new ExcelWorksheetData(TestContext);

            var time = DateTime.Now;

            var expected = new List<Coordinate>();
            for(int i = 1;i <= 4;++i) {
                var latInColumn = String.Format("Lat{0}", i);
                var lngInColumn = String.Format("Lng{0}", i);
                var trkInColumn = String.Format("Trk{0}", i);

                var latOutColumn = String.Format("CLat{0}", i);
                var lngOutColumn = String.Format("CLng{0}", i);
                var trkOutColumn = String.Format("CTrk{0}", i);

                if(worksheet.String(latInColumn) != null) {
                    time = time.AddHours(1);
                    _Aircraft.DataVersion = time.Ticks;
                    _Aircraft.Latitude = worksheet.Float(latInColumn);
                    _Aircraft.Longitude = worksheet.Float(lngInColumn);
                    _Aircraft.Track = worksheet.NFloat(trkInColumn);
                    _Aircraft.UpdateCoordinates(time, 300 * 60 * 60);

                    Assert.AreEqual(i, _Aircraft.ShortCoordinates.Count);
                }

                if(worksheet.String(latOutColumn) != null) {
                    expected.Add(new Coordinate(0, 0, worksheet.Float(latOutColumn), worksheet.Float(lngOutColumn), worksheet.NFloat(trkOutColumn)));
                }
            }

            Assert.AreEqual(expected.Count, _Aircraft.FullCoordinates.Count);

            for(int i = 0;i < expected.Count;++i) {
                var expCoordinate = expected[i];
                var fullCoordinate = _Aircraft.FullCoordinates[i];

                Assert.AreEqual(expCoordinate, fullCoordinate, i.ToString());
                Assert.AreEqual(expCoordinate.Heading, fullCoordinate.Heading, i.ToString());
            }
        }
        public void Aircraft_IcaoCompliantRegistration_Correctly_Transforms_Registration_To_Comply_With_ICAO_Rules()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            var aircraft = Factory.Singleton.Resolve<IAircraft>();
            aircraft.Registration = worksheet.EString("Registration");

            Assert.AreEqual(worksheet.EString("IcaoCompliantRegistration"), aircraft.IcaoCompliantRegistration);
            Assert.AreEqual(worksheet.EString("Registration"), aircraft.Registration);
        }
        public void WebServer_Addresses_Are_Reported_Correctly()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            _WebServer.Root = worksheet.String("Root");
            _WebServer.Port = worksheet.NInt("Port") ?? 80;
            if(worksheet.String("IPAddresses") == null) _Provider.Setup(p => p.GetHostAddresses()).Returns((IPAddress[])null);
            else {
                var ipAddresses = new List<IPAddress>();
                foreach(var chunk in worksheet.EString("IPAddresses").Split(',')) {
                    if(chunk.Length > 0) ipAddresses.Add(IPAddress.Parse(chunk));
                }
                _Provider.Setup(p => p.GetHostAddresses()).Returns(ipAddresses.ToArray());
            }
            _WebServer.ExternalIPAddress = worksheet.EString("ExternalIPAddress");
            _WebServer.ExternalPort = worksheet.NInt("UPnPExternalPort") ?? 80;

            Assert.AreEqual(worksheet.String("LocalAddress"), _WebServer.LocalAddress);
            Assert.AreEqual(worksheet.String("NetworkAddress"), _WebServer.NetworkAddress);
            Assert.AreEqual(worksheet.String("NetworkIPAddress"), _WebServer.NetworkIPAddress);
            Assert.AreEqual(worksheet.String("ExternalAddress"), _WebServer.ExternalAddress);
        }
        public void UniversalPlugAndPlayManager_TakeServerOffInternet_Removes_Mapping_From_Router()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            _Configuration.WebServerSettings.EnableUPnp = worksheet.Bool("CnfEnabled");
            _Configuration.WebServerSettings.UPnpPort = worksheet.Int("CnfUPnpPort");
            _Configuration.WebServerSettings.IsOnlyInternetServerOnLan = worksheet.Bool("CnfOnlyVRSOnNetwork");
            _WebServer.Setup(s => s.NetworkIPAddress).Returns(worksheet.String("SvrAddress"));
            _WebServer.Setup(s => s.Port).Returns(worksheet.Int("SvrPort"));

            _Manager.Initialise();
            if(worksheet.String("RtrDescription") != null) {
                AddPortMapping(worksheet.String("RtrDescription"),
                               worksheet.Int("RtrExtPort"),
                               worksheet.String("RtrIntClient"),
                               worksheet.Int("RtrIntPort"),
                               worksheet.String("RtrProtocol"));
                if(_PortMappings[0].Description == _Description && _PortMappings[0].ExternalPort == _Configuration.WebServerSettings.UPnpPort &&
                   _PortMappings[0].InternalClient == _WebServer.Object.NetworkIPAddress && _PortMappings[0].InternalPort == _WebServer.Object.Port &&
                   _PortMappings[0].Protocol == "TCP") _Manager.PutServerOntoInternet();
            }

            _Manager.StateChanged += _StateChangedEvent.Handler;
            _Manager.TakeServerOffInternet();

            _Provider.Verify(p => p.RemoveMapping(worksheet.Int("CnfUPnpPort"), "TCP"),
                worksheet.Bool("ExpectRemove") ? Times.Once() : Times.Never());

            Assert.AreEqual(worksheet.Bool("ExpectIsPresent"), _Manager.PortForwardingPresent);
            Assert.AreEqual(worksheet.Bool("ExpectStateChanged") ? 1 : 0, _StateChangedEvent.CallCount);
            if(_StateChangedEvent.CallCount > 0) {
                Assert.AreSame(_Manager, _StateChangedEvent.Sender);
                Assert.IsNotNull(_StateChangedEvent.Args);
            }
        }
        public void BaseStationDatabase_UpdateAircraftModeSCountry_Updates_ModeSCountry_For_Existing_Record()
        {
            _Database.WriteSupportEnabled = true;
            var worksheet = new ExcelWorksheetData(TestContext);

            var id = (int)AddAircraft(new BaseStationAircraft() { ModeS = "ZZZZZZ" });

            var update = _Database.GetAircraftById(id);
            LoadAircraftFromSpreadsheet(worksheet, 0, update);

            _Database.UpdateAircraft(update);

            update.ModeSCountry = "Updated Mode-S Country";
            _Database.UpdateAircraftModeSCountry(update.AircraftID, update.ModeSCountry);

            var readBack = _Database.GetAircraftById(id);
            AssertAircraftAreEqual(update, readBack, id);

            update.ModeSCountry = null;
            _Database.UpdateAircraftModeSCountry(update.AircraftID, update.ModeSCountry);

            readBack = _Database.GetAircraftById(id);
            AssertAircraftAreEqual(update, readBack, id);
        }
        public void BaseStationDatabase_GetAircraftById_Returns_Aircraft_Object_For_Record_Identifier()
        {
            var worksheet = new ExcelWorksheetData(TestContext);
            var mockAircraft = LoadAircraftFromSpreadsheet(worksheet);

            var id = (int)AddAircraft(mockAircraft);

            var aircraft = _Database.GetAircraftById(id);
            Assert.AreNotSame(aircraft, mockAircraft);

            AssertAircraftAreEqual(mockAircraft, aircraft, id);
        }
        public void UniversalPlugAndPlayManager_TakeServerOffInternet_Disconnects_And_Reconnects_WebServer()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            _Configuration.WebServerSettings.EnableUPnp = true;
            _Configuration.WebServerSettings.UPnpPort = 8080;
            _Configuration.WebServerSettings.IsOnlyInternetServerOnLan = true;
            _WebServer.Setup(s => s.NetworkIPAddress).Returns("192.168.0.1");
            _WebServer.Setup(s => s.Port).Returns(80);

            var expectedStarts = 0;
            if(worksheet.Bool("StartOnline")) {
                _WebServer.Object.Online = true;
                ++expectedStarts;
            }

            _WebServer.SetupSet(s => s.Online = true).Callback(() => {
                Assert.IsFalse(_Manager.PortForwardingPresent);
            });

            var expectedStops = 0;
            if(worksheet.Bool("ExpectServerToggle")) {
                ++expectedStarts;
                ++expectedStops;
            }

            _Manager.Initialise();
            if(worksheet.Bool("StartPortForwarded")) {
                AddPortMapping(_Description, 8080, "192.168.0.1", 80, "TCP");
                _Manager.PutServerOntoInternet();
            }

            _Manager.StateChanged += _StateChangedEvent.Handler;
            _Manager.TakeServerOffInternet();

            _WebServer.VerifySet(v => v.Online = true, Times.Exactly(expectedStarts));
            _WebServer.VerifySet(v => v.Online = false, Times.Exactly(expectedStops));
        }
        public void BaseStationDatabase_InsertAircraft_Correctly_Inserts_Record()
        {
            _Database.WriteSupportEnabled = true;

            var worksheet = new ExcelWorksheetData(TestContext);
            var aircraft = LoadAircraftFromSpreadsheet(worksheet);

            _Database.InsertAircraft(aircraft);
            Assert.AreNotEqual(0, aircraft.AircraftID);

            var readBack = _Database.GetAircraftById(aircraft.AircraftID);
            AssertAircraftAreEqual(aircraft, readBack);
        }
        public void UniversalPlugAndPlayManager_Trash_Mappings_Removed_During_Initialise()
        {
            var worksheet = new ExcelWorksheetData(TestContext);

            if(worksheet.String("RtrDescription") != null) {
                AddPortMapping(worksheet.String("RtrDescription"),
                               worksheet.Int("RtrExtPort"),
                               worksheet.String("RtrIntClient"),
                               worksheet.Int("RtrIntPort"),
                               worksheet.String("RtrProtocol"));
            }

            _Configuration.WebServerSettings.EnableUPnp = worksheet.Bool("CnfEnabled");
            _Configuration.WebServerSettings.UPnpPort = worksheet.Int("CnfUPnpPort");
            _Configuration.WebServerSettings.IsOnlyInternetServerOnLan = worksheet.Bool("CnfOnlyVRSOnNetwork");
            _WebServer.Setup(s => s.NetworkIPAddress).Returns(worksheet.String("SvrAddress"));
            _WebServer.Setup(s => s.Port).Returns(worksheet.Int("SvrPort"));

            _Manager.Initialise();

            _Provider.Verify(p => p.RemoveMapping(worksheet.Int("RtrExtPort"), worksheet.String("RtrProtocol")),
                worksheet.Bool("ExpectRemove") ? Times.Once() : Times.Never());
        }