public void it_should_calculate_the_correct_distance(double latitude, double longitude, double expectedDistance) { var destination = new TerraLocation(latitude, longitude); double actualDistance = _source.CalculateDistanceInKmTo(destination); Assert.AreEqual(expectedDistance, actualDistance); }
private IEnumerable<CustomerRecord> SelectCustomersWithinRange(TerraLocation officeLocation, double distanceFromOfficeInKm) { Dictionary<int, CustomerRecord> invitees = new Dictionary<int, CustomerRecord>(); List<CustomerRecord> customerRecords = _customerRecordsProvider.GetCustomerRecords(); foreach (var customerRecord in customerRecords) { if (CustomerIsWithinRange(officeLocation, distanceFromOfficeInKm, customerRecord)) { invitees.Add(customerRecord.UserId, customerRecord); } } return invitees.Values.OrderBy(c=> c.UserId); }
public double CalculateDistanceInKmTo(TerraLocation location) { double latitude1Rad = Latitude.ConvertToRadians(); double longitude1Rad = Longitude.ConvertToRadians(); double latititude2Rad = location.Latitude.ConvertToRadians(); double longitude2Rad = location.Longitude.ConvertToRadians(); double logitudeDiff = Math.Abs(longitude1Rad - longitude2Rad); double centralAngle = Math.Acos( Math.Sin(latititude2Rad) * Math.Sin(latitude1Rad) + Math.Cos(latititude2Rad) * Math.Cos(latitude1Rad) * Math.Cos(logitudeDiff)); return Math.Round(TerraRadiusInKm * centralAngle, 3, MidpointRounding.AwayFromZero); }
public void Generate(TerraLocation officeLocation, double distanceFromOfficeInKm) { if (officeLocation == null) { throw new ArgumentNullException("officeLocation"); } if (distanceFromOfficeInKm <= 0) { throw new ArgumentOutOfRangeException("distanceFromOffice", "Value should be greater than zero"); } IEnumerable<CustomerRecord> invitees = SelectCustomersWithinRange(officeLocation, distanceFromOfficeInKm); WriteInvitations(invitees); }
private bool CustomerIsWithinRange(TerraLocation officeLocation, double distanceFromOfficeInKm, CustomerRecord customerRecord) { double distanceToCustomer = officeLocation.CalculateDistanceInKmTo(customerRecord.Location); return distanceToCustomer <= distanceFromOfficeInKm; }
public void SetUp() { _source = new TerraLocation(53.3472, -6.259); }