public void NewCoordinate_LatitudeTooLarge_ThrowsInvalidCoordinateException() { var latitude = 1.5709; var longitude = 0; var coordinate = new RadianCoordinate(latitude, longitude); }
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); }
public void NewCoordinate_LongitudeTooSmall_ThrowsInvalidCoordinateException() { var latitude = 0; var longitude = -3.1416; var coordinate = new RadianCoordinate(latitude, longitude); }
/// <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)); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
/// <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; }
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()); }
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); }
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(); }
/// <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); }
/// <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)); }