Esempio n. 1
0
        public void TestFromValidRadians()
        {
            const int runs = 10;

            for (int i = 0; i < runs; ++i)
            {
                var radianLongitude = GenerateValidValue(GeographicalLocation.MAX_RADIAN_LONGITUDE);
                var radianLatitude  = GenerateValidValue(GeographicalLocation.MAX_RADIAN_LATITUDE);

                var degreeLongitude = Calculator.DegreesToRadians(radianLongitude);
                var degreeLatitude  = Calculator.DegreesToRadians(radianLatitude);

                var location = GeographicalLocation.FromRadians(radianLongitude, radianLatitude);
                Assert.IsTrue(location.RadianLongitude == radianLongitude,
                              String.Format("Location radian longitude is not equal to the expected radian longitude! Expected: {0}, got: {1}.",
                                            radianLongitude, location.RadianLongitude));
                Assert.IsTrue(location.RadianLatitude == radianLatitude,
                              String.Format("Location radian latitude is not equal to the expected radian latitude! Expected: {0}, got: {1}.",
                                            radianLatitude, location.RadianLatitude));
                Assert.IsTrue(location.RadianLongitude == radianLongitude,
                              String.Format("Location radian longitude is not equal to the expected radian longitude! Expected: {0}, got: {1}.",
                                            radianLongitude, location.RadianLongitude));
                Assert.IsTrue(location.RadianLatitude == radianLatitude,
                              String.Format("Location radian latitude is not equal to the expected radian latitude! Expected: {0}, got: {1}.",
                                            radianLatitude, location.RadianLatitude));
            }
        }
Esempio n. 2
0
        public void TestFromInvalidDegreeLatitude()
        {
            var degreeLongitude = GenerateValidValue(GeographicalLocation.MAX_DEGREE_LONGITUDE);
            var degreeLatitude  = GenerateInvalidValue(GeographicalLocation.MAX_DEGREE_LATITUDE);

            var location = GeographicalLocation.FromDegrees(degreeLongitude, degreeLatitude);
        }
Esempio n. 3
0
        public void TestFromInvalidRadianLatitude()
        {
            var radianLongitude = GenerateValidValue(GeographicalLocation.MAX_RADIAN_LONGITUDE);
            var radianLatitude  = GenerateInvalidValue(GeographicalLocation.MAX_RADIAN_LATITUDE);

            var location = GeographicalLocation.FromRadians(radianLongitude, radianLatitude);
        }
Esempio n. 4
0
        /// <summary>
        /// Method used to parse a single JSON object and return customer data.
        /// </summary>
        /// <param name="match">Regex match.</param>
        /// <returns>Customer data.</returns>
        /// <exception cref="IntercomTestException">Thrown if the JSON object is not properly formatted.</exception>
        private Customer ParseJsonObject(Match match)
        {
            if (ReferenceEquals(match, null))
            {
                throw new IntercomTestException("JSON text is in invalid format!");
            }

            var degreeLongitude = ReadDegreeLongitude(match);

            if (!GeographicalLocation.IsDegreeLongitudeValid(degreeLongitude))
            {
                throw new IntercomTestException(String.Format("Invalid geographical longitude read: {0}!", degreeLongitude));
            }

            var degreeLatitude = ReadDegreeLatitude(match);

            if (!GeographicalLocation.IsDegreeLatitudeValid(degreeLatitude))
            {
                throw new IntercomTestException(String.Format("Invalid geographical latitude read: {0}!", degreeLatitude));
            }

            var userId       = ReadUserId(match);
            var customerName = ReadCustomerName(match);

            var location = GeographicalLocation.FromDegrees(degreeLongitude, degreeLatitude);

            return(new Customer(userId, customerName, location));
        }
Esempio n. 5
0
        public void TestLocationNull()
        {
            var userId = 0;
            var name   = "John Doe";
            GeographicalLocation location = null;

            var customer = new Customer(userId, name, location);
        }
 public void UpdateGeographicalLocation(GeographicalLocation geographicalLocation)
 {
     using (var db = new DataContext(_connectionString))
     {
         db.GeographicalLocations.Update(geographicalLocation);
         db.SaveChanges();
     }
 }
Esempio n. 7
0
        public void TestCustomerNameEmpty()
        {
            var    userId   = 0;
            var    location = GeographicalLocation.FromDegrees(0.0d, 0.0d);
            string name     = string.Empty;

            var customer = new Customer(userId, name, location);
        }
 public int AddGeographicalLocation(GeographicalLocation geographicalLocation)
 {
     using (var db = new DataContext(_connectionString))
     {
         db.GeographicalLocations.Add(geographicalLocation);
         db.SaveChanges();
         return(geographicalLocation.Id);
     }
 }
Esempio n. 9
0
        public void TestValidRadianLatitude()
        {
            double[] radianLatitudes = { -PI / 2, 00.0d, PI / 2, -PI * 0.32, PI / 4, -PI / 4, -PI * 0.426, PI * 0.001, PI * 0.499, -PI * 0.499, -PI / 3, PI / 3 };

            foreach (var radianLatitude in radianLatitudes)
            {
                Assert.IsTrue(GeographicalLocation.IsRadianLatitudeValid(radianLatitude),
                              String.Format("Radian latitude {0} declared invalid, even though it is valid!", radianLatitude));
            }
        }
Esempio n. 10
0
        public void TestValidRadianLongitude()
        {
            double[] radianLongitudes = { -PI, PI, 0.0d, PI / 2, -PI / 2, -PI / 4, PI / 4, PI * 0.23, PI * 0.753, -PI * 0.3421, -PI * 0.6831, PI * 0.89123 };

            foreach (var radianLongitude in radianLongitudes)
            {
                Assert.IsTrue(GeographicalLocation.IsRadianLongitudeValid(radianLongitude),
                              String.Format("Radian longitude {0} declared invalid, even though it is valid!", radianLongitude));
            }
        }
Esempio n. 11
0
        public void TestValidDegreeLatitude()
        {
            double[] degreeLatitudes = { -90.0d, 00.0d, 0.0d, -19.0d, -45.0d, 45.0d, 23.0d, 47.0d, -20.43d, 60.0d, -60.0d, 34.23d, -86.0d };

            foreach (var degreeLatitude in degreeLatitudes)
            {
                Assert.IsTrue(GeographicalLocation.IsDegreeLatitudeValid(degreeLatitude),
                              String.Format("Degree latitude {0} declared invalid, even though it is valid!", degreeLatitude));
            }
        }
Esempio n. 12
0
        public void TestInvalidDegreeLatitude()
        {
            double[] degreeLatitudes = { -91.0d, 91.0d, 190.0d, -190.0d, 270.0, -270.0d, 360.0d, 360.0d, 200.0d, -300.0d };

            foreach (var degreeLatitude in degreeLatitudes)
            {
                Assert.IsFalse(GeographicalLocation.IsDegreeLatitudeValid(degreeLatitude),
                               String.Format("Degree latitude {0} declared valid, even though it is invalid!", degreeLatitude));
            }
        }
Esempio n. 13
0
        public void TestInvalidRadianLatitude()
        {
            double[] radianLatitudes = { -PI - 0.001, PI + 0.001, PI * 0.52, -PI * 0.52, 3 * PI, -3 * PI, 2 * PI, -2 * PI, -3.232 * PI, 4.52 * PI };

            foreach (var radianLatitude in radianLatitudes)
            {
                Assert.IsFalse(GeographicalLocation.IsRadianLatitudeValid(radianLatitude),
                               String.Format("Radian latitude {0} declared valid, even though it is invalid!", radianLatitude));
            }
        }
Esempio n. 14
0
        public Dictionary <int, double> CalculateTravelDistances(GeographicalLocation input, List <Suggestion> suggestions)
        {
            var dict = new Dictionary <int, double>();

            for (int i = 0; i < suggestions.Count; i++)
            {
                dict[i] = CalculateDistanceWithHaversineDistanceFormula(input, suggestions.ElementAt(i));
            }

            return(dict);
        }
Esempio n. 15
0
        public void AreCoordinatesValid_ShouldReturnFalse_ForNotValidCoordinates(double latitude, double longitude)
        {
            // Arrange
            var coords = new GeographicalLocation(latitude, longitude);

            //Act
            var result = coords.AreCoordinatesValid();

            //Assert
            result.ShouldSatisfyAllConditions(
                () => result.ShouldBeFalse()
                );
        }
Esempio n. 16
0
        public void AreCoordinatesValid_ShouldReturnTrue_ForValidCoordinates()
        {
            // Arrange
            var coords = new GeographicalLocation(43.70011, -79.4163);

            //Act
            var result = coords.AreCoordinatesValid();

            //Assert
            result.ShouldSatisfyAllConditions(
                () => result.ShouldBeTrue()
                );
        }
Esempio n. 17
0
        public void TestCustomerNameWhitespace()
        {
            const char whitespaceCharacter = ' ';

            var userId   = 0;
            var location = GeographicalLocation.FromDegrees(0.0d, 0.0d);

            var random = new Random(Environment.TickCount);
            var numberOfWhitespaces = random.Next(1, 20);
            var name = new string(whitespaceCharacter, numberOfWhitespaces);

            var customer = new Customer(userId, name, location);
        }
Esempio n. 18
0
        private double CalculateDistanceWithHaversineDistanceFormula(GeographicalLocation input, Suggestion suggestion, DistanceUnit unit = DistanceUnit.Kilometers)
        {
            double radius = (unit == DistanceUnit.Kilometers) ? EARTH_RADIUS_KM : EARTH_RADIUS_MILES;

            var latitudeInRadians  = (suggestion.Latitude.Value - input.Latitude.Value).ToRadians();
            var longitudeInRadians = (suggestion.Longitude.Value - input.Longitude.Value).ToRadians();

            var h1 = Math.Sin(latitudeInRadians / 2) * Math.Sin(latitudeInRadians / 2) +
                     Math.Cos(input.Latitude.Value.ToRadians()) * Math.Cos(suggestion.Latitude.Value.ToRadians()) *
                     Math.Sin(longitudeInRadians / 2) * Math.Sin(longitudeInRadians / 2);

            var h2 = 2 * Math.Asin(Math.Min(1, Math.Sqrt(h1)));

            return(radius * h2);
        }
Esempio n. 19
0
        public void GeographicalLocation_ShouldInitializeProperly()
        {
            // Arrange
            const double lat = 43.70011;
            const double lon = -79.4163;

            //Act
            var coords = new GeographicalLocation(lat, lon);

            //Assert
            coords.ShouldSatisfyAllConditions(
                () => coords.Latitude.ShouldBe(lat),
                () => coords.Longitude.ShouldBe(lon)
                );
        }
Esempio n. 20
0
        public void TestCustomerValidInstantiation()
        {
            var userId   = 0;
            var name     = "John Doe";
            var location = GeographicalLocation.FromDegrees(0.0d, 0.0d);

            var customer = new Customer(userId, name, location);

            Assert.AreNotEqual(customer, null, "IntercomTest.Customer class has not been instantiated, even though all parameters are valid!");
            Assert.AreEqual(customer.UserId, userId,
                            string.Format("IntercomTest.Customer class instance contains invalid data! Expected user ID: {0}, got {1}", userId, customer.UserId));
            Assert.AreEqual(customer.Name, name.Trim(),
                            string.Format("IntercomTest.Customer class instance contains invalid data! Expected name: {0}, got {1}", name, customer.Name));
            Assert.AreEqual(customer.Location, location, "IntercomTest.Customer class instance contains invalid data. Location references do not match.");
        }
Esempio n. 21
0
        public IActionResult GetSuggestions(string q, double?latitude, double?longitude, int?n)
        {
            List <SuggestionDto> weightedResults;
            var defaultResultSize = 10;

            // Make sure q does not equal "", ", '', ' and empty
            if (!q.IsValidInput())
            {
                return(BadRequest(new BadRequestError("The q paramter is mandatory")));
            }

            if (_trie.Trie.IsEmpty())
            {
                _seedDomainService.ResetPrefixTree();
            }

            if (n.HasValue && n >= 0)
            {
                defaultResultSize = n.Value;
            }

            var coords = new GeographicalLocation(latitude, longitude);

            if (coords.Latitude.HasValue || coords.Longitude.HasValue)
            {
                if (!coords.AreCoordinatesValid())
                {
                    return(BadRequest(new BadRequestError("Latitude and logitude are not proper format")));
                }
            }

            //Fetch suggestions
            var results = _trie.Trie.GetSuggestionsForPrefix(q.SanitizeInput()).ToList();

            //Add score to values
            if (coords.AreCoordinatesValid())
            {
                weightedResults = _scoringDomainService.WeightedSuggestionsWithCoordinates(results, defaultResultSize, coords);
            }
            else
            {
                weightedResults = _scoringDomainService.WeightedSuggestions(results, defaultResultSize);
            }

            return(Ok(weightedResults));
        }
Esempio n. 22
0
        public void TestStaticCalculateDistance()
        {
            var fromDegreeLongitude = -6.257664d;
            var fromDegreeLatitude  = 53.339428d;

            double[] toDegreeLongitudes = { -6.043701d, -10.27699d, -10.4240951d };
            double[] toDegreeLatitudes  = { 52.986375d, 51.92893d, 51.8856167d };
            double[] expectedDistances  = { 41.77d, 313.24d, 324.36d };

            var fromLocation = GeographicalLocation.FromDegrees(fromDegreeLongitude, fromDegreeLatitude);

            for (int i = 0; i < toDegreeLongitudes.Length; ++i)
            {
                var toLocation = GeographicalLocation.FromDegrees(toDegreeLongitudes[i], toDegreeLatitudes[i]);

                var distance = GeographicalLocation.CalculateDistance(fromLocation, toLocation);
                Assert.IsTrue(distance - expectedDistances[i] < DISTANCE_EPSILON,
                              string.Format("Wrong distance calculated! Expected: {0}, got: {1}.", expectedDistances[i], distance));
            }
        }
Esempio n. 23
0
        /// <summary>
        /// Generates weighted scores for list of auto complete suggestions.
        /// It takes into account the coordinates supplied in the query
        /// </summary>
        public List <SuggestionDto> WeightedSuggestionsWithCoordinates(List <Suggestion> suggestions, int maxValues, GeographicalLocation location)
        {
            var weightedSuggestions = new List <SuggestionDto>();
            var maxPopularity       = suggestions.Select(x => x.Popularity).DefaultIfEmpty(0).Max();

            var distances       = _travelDistanceScoreFactory.CalculateTravelDistances(location, suggestions);
            var maximumDistance = distances.Values.Max();

            for (var i = 0; i < suggestions.Count; i++)
            {
                var suggestion = suggestions.ElementAt(i);
                suggestions.ElementAt(i).WeightedScore =
                    _popularityScoreFactory.ComputeLogarithmicPopularityScore(maxPopularity, suggestion.Popularity) +
                    _populationScoreFactory.ComputeLogarithmicPopulationScore(suggestion.Population) +
                    _editDistanceFactory.ComputeLogarithmicEditDistance(suggestion, true) +
                    _travelDistanceScoreFactory.CalculateDistanceScore(distances[i], maximumDistance);

                weightedSuggestions.Add(_mapper.Map <SuggestionDto>(suggestion));
            }

            return(weightedSuggestions.OrderByDescending(q =>  q.Score).Take(maxValues).ToList());
        }
Esempio n. 24
0
        static void Main(string[] args)
        {
            if (args.Length == 1)
            {
                if (string.IsNullOrWhiteSpace(args[0]))
                {
                    PrintHelp();
                }
                Console.WriteLine();
                Console.WriteLine("Closing the program. Press any key to continue...");
                Console.ReadKey();
                return;
            }

            if (args.Length > 1)
            {
                PrintHelp();
                Console.WriteLine();
                Console.WriteLine("Closing the program. Press any key to continue...");
                Console.ReadKey();
                return;
            }

            try
            {
                var dublinOfficeLocation = GeographicalLocation.FromDegrees(
                    ConfigurationReader.DublinOfficeDegreeLongitude, ConfigurationReader.DublinOfficeDegreeLatitude);

                var reader     = CreateReader();
                var customers1 = reader.ReadCustomers();

                var customers2 = customers1?.Where(customer => dublinOfficeLocation.DistanceFrom(customer.Location) < ConfigurationReader.InvitationDistanceKilometers);
                var customers  = customers2?.OrderBy(customer => customer.UserId);

                if (ReferenceEquals(customers, null))
                {
                    Console.WriteLine("An error has occurred! Customer info was note read.");
                    return;
                }

                Console.WriteLine("Customers to invite:");
                foreach (var customer in customers)
                {
                    Console.WriteLine("Name: {0}, user ID: {1}, distance: {2:0.00} km", customer.Name, customer.UserId,
                                      customer.Location.DistanceFrom(dublinOfficeLocation));
                }
            }
            catch (IntercomTestException ite)
            {
                Console.WriteLine(string.Format("An error has ocurred while trying to read user information! Detailed information: {0}",
                                                ite.IntercomTestErrorMessage));
                if (ite.HasInnerException)
                {
                    Console.WriteLine("Inner exception: " + ite.InnerException.Message);
                }
                Console.WriteLine();
                PrintHelp();
            }
            catch (ArgumentNullException ane)
            {
                Console.WriteLine("An internal erro has occurred!");
                Console.WriteLine(ane.Message);
                Console.WriteLine();
                PrintHelp();
            }
            catch (ArgumentException ae)
            {
                Console.WriteLine("An internal erro has occurred!");
                Console.WriteLine(ae.Message);
                Console.WriteLine();
                PrintHelp();
            }
            catch (DirectoryNotFoundException dnfe)
            {
                Console.WriteLine("Customer file directory not found!");
                Console.WriteLine(dnfe.Message);
                Console.WriteLine();
                PrintHelp();
            }
            catch (FileNotFoundException fnfe)
            {
                Console.WriteLine("Customer file not found!");
                Console.WriteLine(fnfe.Message);
                Console.WriteLine();
                PrintHelp();
            }
            catch (PathTooLongException ptle)
            {
                Console.WriteLine("Customer file path is too long!");
                Console.WriteLine(ptle.Message);
                Console.WriteLine();
                PrintHelp();
            }
            catch (UnauthorizedAccessException uae)
            {
                Console.WriteLine("The current user does not have the perrmission to access the customer file" +
                                  "or the operation is not supported beacuse the file is read-only!");
                Console.WriteLine(uae.Message);
                Console.WriteLine();
                PrintHelp();
            }
            catch (NotSupportedException nse)
            {
                Console.WriteLine("Reading the customer file is not supported!. This may happen path is in invalid format.");
                Console.WriteLine(nse.Message);
                Console.WriteLine();
                PrintHelp();
            }
            catch (SecurityException se)
            {
                Console.WriteLine("The current user does not have the perrmission to access the customer file!");
                Console.WriteLine(se.Message);
                Console.WriteLine();
                PrintHelp();
            }
            finally
            {
                Console.WriteLine();
                Console.WriteLine("Closing the program. Press any key to continue...");
                Console.ReadKey();
            }
        }