Example #1
0
        public void NewCoordinate_LatitudeTooLarge_ThrowsInvalidCoordinateException()
        {
            var latitude  = 1.5709;
            var longitude = 0;

            var coordinate = new RadianCoordinate(latitude, longitude);
        }
Example #2
0
        public void DetermineCustomersToInvite_ThreeCustomersWithinDistance_InvitesThreeCustomers()
        {
            var venue      = new RadianCoordinate(Calculator.ConvertDegreesToRadians(53.339428), Calculator.ConvertDegreesToRadians(-6.257664));
            var calculator = new Calculator();
            var customers  = new List <CustomerContract>
            {
                new CustomerContract {
                    Name = "1", UserId = 1, Latitude = 53.3334849, Longitude = -6.2612991
                },
                new CustomerContract {
                    Name = "3", UserId = 3, Latitude = 53.3334593, Longitude = -6.2646894
                },
                new CustomerContract {
                    Name = "2", UserId = 2, Latitude = 53.3334593, Longitude = -6.2646894
                },
                new CustomerContract {
                    Name = "5", UserId = 5, Latitude = 53.2487055, Longitude = -6.5992854
                },
                new CustomerContract {
                    Name = "4", UserId = 4, Latitude = 53.5061796, Longitude = -6.4699798
                },
                new CustomerContract {
                    Name = "6", UserId = 6, Latitude = 53.1970187, Longitude = -6.1308245
                },
            };

            var invitationManager = new InvitationManager(calculator, venue);
            var customersToInvite = invitationManager.DetermineCustomersToInvite(customers, 10);

            Assert.AreEqual(3, customersToInvite.Count());
            Assert.IsTrue(customersToInvite.ElementAt(0).UserId < customersToInvite.ElementAt(1).UserId);
            Assert.IsTrue(customersToInvite.ElementAt(1).UserId < customersToInvite.ElementAt(2).UserId);
        }
Example #3
0
        public void NewCoordinate_LongitudeTooSmall_ThrowsInvalidCoordinateException()
        {
            var latitude  = 0;
            var longitude = -3.1416;

            var coordinate = new RadianCoordinate(latitude, longitude);
        }
Example #4
0
        /// <summary>
        /// Determines which customers to invite for drinks.
        /// </summary>
        /// <param name="customers">A list of all customers.</param>
        /// <param name="distanceFromVenue">The maximum distance customers must be within to attend.</param>
        /// <returns>A list of customers to invite for food and drinks.</returns>
        public IEnumerable <CustomerContract> DetermineCustomersToInvite(IEnumerable <CustomerContract> customers, double distanceFromVenue)
        {
            if (customers is null)
            {
                throw new ArgumentNullException($"{nameof(customers)} may not be null.");
            }

            if (distanceFromVenue < 0)
            {
                throw new ArgumentException($"{nameof(distanceFromVenue)} may not be negative.");
            }

            var customersToInvite = new List <CustomerContract>();

            foreach (var customer in customers)
            {
                var customerLocation   = new RadianCoordinate(Calculator.ConvertDegreesToRadians(customer.Latitude), Calculator.ConvertDegreesToRadians(customer.Longitude));
                var distanceFromOffice = _calculator.CalculateArcLength(_venue, customerLocation, Calculator.EARTH_RADIUS_KM);

                if (distanceFromOffice < distanceFromVenue)
                {
                    customersToInvite.Add(customer);
                }
            }

            return(customersToInvite.OrderBy(c => c.UserId));
        }
Example #5
0
        public void DetermineCustomersToInvite_NullCustomers_ThrowsArgumentNullException()
        {
            var venueLocation     = new RadianCoordinate(Calculator.ConvertDegreesToRadians(53.339428), Calculator.ConvertDegreesToRadians(-6.257664));
            var calculator        = new Calculator();
            var invitationManager = new InvitationManager(calculator, venueLocation);

            var customersToInvite = invitationManager.DetermineCustomersToInvite(null, 100);
        }
Example #6
0
        public void DetermineCustomersToInvite_NegativeDistanceToVenue_ThrowsArgumentException()
        {
            var venueLocation     = new RadianCoordinate(Calculator.ConvertDegreesToRadians(53.339428), Calculator.ConvertDegreesToRadians(-6.257664));
            var calculator        = new Calculator();
            var customers         = new List <CustomerContract>();
            var invitationManager = new InvitationManager(calculator, venueLocation);

            var customersToInvite = invitationManager.DetermineCustomersToInvite(customers, -100);
        }
Example #7
0
        public void NewInvitationManager_ValidVenue_InstantiatesInvitationManager()
        {
            var venueLocation = new RadianCoordinate(Calculator.ConvertDegreesToRadians(53.339428), Calculator.ConvertDegreesToRadians(-6.257664));
            var calculator    = new Calculator();

            var invitationManager = new InvitationManager(calculator, venueLocation);

            Assert.IsNotNull(invitationManager);
        }
Example #8
0
        public void CalculateArcLength_SamePoint_ShouldBeZero()
        {
            var point1     = new RadianCoordinate(0.930115210104, -0.1093636224733);
            var point2     = new RadianCoordinate(0.930115210104, -0.1093636224733);
            var calculator = new Calculator();

            var arcLength = calculator.CalculateArcLength(point1, point2, Calculator.EARTH_RADIUS_KM);

            Assert.IsTrue(Math.Abs(arcLength) < TOLERANCE);
        }
Example #9
0
        public void CalculateCentralAngle_SamePoint_ShouldBeZero()
        {
            var point1     = new RadianCoordinate(0.930115210104, -0.1093636224733);
            var point2     = new RadianCoordinate(0.930115210104, -0.1093636224733);
            var calculator = new Calculator();

            var centralAngle = calculator.CalculateCentralAngle(point1, point2);

            Assert.IsTrue(Math.Abs(centralAngle) < TOLERANCE);
        }
Example #10
0
        public void NewCoordinate_ValidCoordinate_InstantiatesCorrectly()
        {
            var latitude  = 0.930948;
            var longitude = -0.109216;

            var coordinate = new RadianCoordinate(latitude, longitude);

            Assert.IsNotNull(coordinate);
            Assert.AreEqual(latitude, coordinate.Latitude);
            Assert.AreEqual(longitude, coordinate.Longitude);
        }
Example #11
0
        public void CalculateArcLength_PointsOnEarth()
        {
            var point1     = new RadianCoordinate(0.930115210104, -0.10936362247);
            var point2     = new RadianCoordinate(0.930948639728, -0.10921684028);
            var calculator = new Calculator();

            var expectedArcLength = 5.339089;

            var actualArcLength = calculator.CalculateArcLength(point1, point2, 6371);

            Assert.IsTrue(Math.Abs(actualArcLength - expectedArcLength) < TOLERANCE);
        }
Example #12
0
        /// <summary>
        /// Creates a new instance of the InvitationManager class.
        /// </summary>
        /// <param name="calculator">A calculator instance.</param>
        /// <param name="venue">The location of the venue.</param>
        public InvitationManager(Calculator calculator, RadianCoordinate venue)
        {
            if (calculator is null)
            {
                throw new ArgumentNullException($"{nameof(calculator)} may not be null.");
            }

            if (venue is null)
            {
                throw new ArgumentNullException($"{nameof(venue)} may not be null.");
            }

            _calculator = calculator;
            _venue      = venue;
        }
Example #13
0
        public void DetermineCustomersToInvite_NoCustomersWithinDistance_InvitesNobody()
        {
            var venue      = new RadianCoordinate(Calculator.ConvertDegreesToRadians(53.339428), Calculator.ConvertDegreesToRadians(-6.257664));
            var calculator = new Calculator();
            var customers  = new List <CustomerContract>
            {
                new CustomerContract {
                    Name = "1", UserId = 1, Latitude = 53.2487055, Longitude = -6.5992854
                },
                new CustomerContract {
                    Name = "3", UserId = 3, Latitude = 53.5061796, Longitude = -6.4699798
                },
                new CustomerContract {
                    Name = "2", UserId = 2, Latitude = 53.1970187, Longitude = -6.1308245
                },
            };

            var invitationManager = new InvitationManager(calculator, venue);
            var customersToInvite = invitationManager.DetermineCustomersToInvite(customers, 10);

            Assert.AreEqual(0, customersToInvite.Count());
        }
Example #14
0
        public void DetermineCustomersToInvite_AllCustomersWithinDistance_InvitesAllCustomers()
        {
            var venue      = new RadianCoordinate(Calculator.ConvertDegreesToRadians(53.339428), Calculator.ConvertDegreesToRadians(-6.257664));
            var calculator = new Calculator();
            var customers  = new List <CustomerContract>
            {
                new CustomerContract {
                    Name = "1", UserId = 1, Latitude = 53.3334849, Longitude = -6.2612991
                },
                new CustomerContract {
                    Name = "3", UserId = 3, Latitude = 53.3334593, Longitude = -6.2646894
                },
                new CustomerContract {
                    Name = "2", UserId = 2, Latitude = 53.3334593, Longitude = -6.2646894
                },
            };

            var invitationManager = new InvitationManager(calculator, venue);
            var customersToInvite = invitationManager.DetermineCustomersToInvite(customers, 10);

            Assert.AreEqual(customers.Count, customersToInvite.Count());
            Assert.IsTrue(customersToInvite.ElementAt(0).UserId < customersToInvite.ElementAt(1).UserId);
            Assert.IsTrue(customersToInvite.ElementAt(1).UserId < customersToInvite.ElementAt(2).UserId);
        }
Example #15
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Please specify the path to the input file in the command line arguments.");
                return;
            }

            if (string.IsNullOrWhiteSpace(args[0]) || !File.Exists(args[0]))
            {
                Console.WriteLine("Input file not found.");
                return;
            }

            try
            {
                var lines      = File.ReadAllLines(args[0]);
                var customers  = new List <CustomerContract>();
                var calculator = new Calculator();

                var dublinOfficeLocation = new RadianCoordinate(Calculator.ConvertDegreesToRadians(53.339428), Calculator.ConvertDegreesToRadians(-6.257664));

                foreach (var line in lines)
                {
                    try
                    {
                        var customer = CustomerContract.Deserialize(line);

                        if (customer.IsValid())
                        {
                            customers.Add(customer);
                        }
                    }
                    catch (JsonSerializationException e)
                    {
                        continue;
                    }
                    catch (ArgumentNullException e)
                    {
                        continue;
                    }
                    catch (ArgumentException e)
                    {
                        continue;
                    }
                }

                var invitationManager = new InvitationManager(calculator, dublinOfficeLocation);
                var customersToInvite = invitationManager.DetermineCustomersToInvite(customers, 100d);

                Console.WriteLine("The following customers should be invited:");

                foreach (var customer in customersToInvite)
                {
                    Console.WriteLine($"{customer.Name} ({customer.UserId})");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"An unexpected error occurred: {e.Message}");
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
Example #16
0
        /// <summary>
        /// Calculates the central angle between two points on the surface of the Earth.
        /// This method has been made virtual to allow it to be overridden in sub-classes with other formulas for calculating the central angle.
        /// </summary>
        /// <returns>The central angle</returns>
        public virtual double CalculateCentralAngle(RadianCoordinate point1, RadianCoordinate point2)
        {
            double centralAngle = Math.Acos(Math.Sin(point1.Latitude) * Math.Sin(point2.Latitude) + Math.Cos(point1.Latitude) * Math.Cos(point2.Latitude) * Math.Cos(point1.Longitude - point2.Longitude));

            return(centralAngle);
        }
Example #17
0
 /// <summary>
 /// Calculates the the lenght of an arc on the surface of a shere between two points.
 /// </summary>
 /// <returns>The length of the arc.</returns>
 public double CalculateArcLength(RadianCoordinate point1, RadianCoordinate point2, double radius)
 {
     return(radius * CalculateCentralAngle(point1, point2));
 }