mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-05 00:01:37 +08:00
feat: Test running overhaul, switch to Prettier & reformat everything (#1407)
* chore: Switch to Node 20 + Vitest * chore: migrate to vitest mock functions * chore: code style (switch to prettier) * test: re-enable long-running test Seems the switch to Node 20 and Vitest has vastly improved the code's and / or the test's runtime! see #1193 * chore: code style * chore: fix failing tests * Updated Documentation in README.md * Update contribution guidelines to state usage of Prettier * fix: set prettier printWidth back to 80 * chore: apply updated code style automatically * fix: set prettier line endings to lf again * chore: apply updated code style automatically --------- Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: Lars Müller <34514239+appgurueu@users.noreply.github.com>
This commit is contained in:
@ -8,24 +8,34 @@
|
||||
* @return {Integer} Haversine Distance.
|
||||
* @see [Haversine_Distance](https://pt.wikipedia.org/wiki/F%C3%B3rmula_de_Haversine)
|
||||
*/
|
||||
const haversineDistance = (latitude1 = 0, longitude1 = 0, latitude2 = 0, longitude2 = 0) => {
|
||||
const haversineDistance = (
|
||||
latitude1 = 0,
|
||||
longitude1 = 0,
|
||||
latitude2 = 0,
|
||||
longitude2 = 0
|
||||
) => {
|
||||
validateLatOrLong(latitude1)
|
||||
validateLatOrLong(latitude2)
|
||||
validateLatOrLong(longitude1)
|
||||
validateLatOrLong(longitude2)
|
||||
const earthRadius = 6371e3 // 6,371km
|
||||
const pi = Math.PI
|
||||
const cos1 = latitude1 * pi / 180.0
|
||||
const cos2 = latitude2 * pi / 180.0
|
||||
const deltaLatitude = (latitude2 - latitude1) * pi / 180.0
|
||||
const deltaLongitude = (longitude2 - longitude1) * pi / 180.0
|
||||
const cos1 = (latitude1 * pi) / 180.0
|
||||
const cos2 = (latitude2 * pi) / 180.0
|
||||
const deltaLatitude = ((latitude2 - latitude1) * pi) / 180.0
|
||||
const deltaLongitude = ((longitude2 - longitude1) * pi) / 180.0
|
||||
|
||||
const alpha = Math.sin(deltaLatitude / 2) * Math.sin(deltaLatitude / 2) + Math.cos(cos1) * Math.cos(cos2) * Math.sin(deltaLongitude / 2) * Math.sin(deltaLongitude / 2)
|
||||
const alpha =
|
||||
Math.sin(deltaLatitude / 2) * Math.sin(deltaLatitude / 2) +
|
||||
Math.cos(cos1) *
|
||||
Math.cos(cos2) *
|
||||
Math.sin(deltaLongitude / 2) *
|
||||
Math.sin(deltaLongitude / 2)
|
||||
const constant = 2 * Math.atan2(Math.sqrt(alpha), Math.sqrt(1 - alpha))
|
||||
return earthRadius * constant
|
||||
}
|
||||
|
||||
const validateLatOrLong = value => {
|
||||
const validateLatOrLong = (value) => {
|
||||
if (typeof value !== 'number') {
|
||||
throw new TypeError('The value of latitude or longitude should be a number')
|
||||
}
|
||||
|
@ -2,10 +2,12 @@ import { haversineDistance } from '../Haversine'
|
||||
|
||||
describe('Testing the haversine distance calculator', () => {
|
||||
it('Calculate distance', () => {
|
||||
const distance = haversineDistance(64.1265, -21.8174, 40.7128, -74.0060)
|
||||
const distance = haversineDistance(64.1265, -21.8174, 40.7128, -74.006)
|
||||
expect(distance).toBe(4208198.758424171)
|
||||
})
|
||||
it('Test validation, expect throw', () => {
|
||||
expect(() => haversineDistance(64.1265, -21.8174, 40.7128, '74.0060')).toThrow()
|
||||
expect(() =>
|
||||
haversineDistance(64.1265, -21.8174, 40.7128, '74.0060')
|
||||
).toThrow()
|
||||
})
|
||||
})
|
||||
|
Reference in New Issue
Block a user