Skip to content

Commit

Permalink
chore: improvments
Browse files Browse the repository at this point in the history
  • Loading branch information
Shinigami92 committed Apr 26, 2022
1 parent d5420c6 commit 4535a6a
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 41 deletions.
11 changes: 6 additions & 5 deletions src/address.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
import type { Faker } from '.';

/**
* The distance in km per degree.
*/
const kmPerDegree = 40_000 / 360; // in km/°

/**
* Module to generate addresses and locations.
*/
Expand Down Expand Up @@ -452,6 +447,12 @@ export class Address {
precision: 0.001,
}) * errorCorrection; // in km

/**
* The distance in km per degree for earth.
*/
// TODO @Shinigami92 2022-04-26: Provide an option property to provide custom circumferences.
const kmPerDegree = 40_000 / 360; // in km/°

const distanceInDegree = distanceInKm / kmPerDegree; // in °

const newCoordinate: [latitude: number, longitude: number] = [
Expand Down
79 changes: 43 additions & 36 deletions test/address.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { afterEach, describe, expect, it } from 'vitest';
import { faker } from '../src';
import { times } from './support/times';

function degreesToRadians(degrees: number) {
return degrees * (Math.PI / 180.0);
Expand All @@ -9,14 +10,16 @@ function kilometersToMiles(miles: number) {
return miles * 0.621371;
}

// http://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html
const EQUATORIAL_EARTH_RADIUS = 6378.137;

function haversine(
latitude1: number,
longitude1: number,
latitude2: number,
longitude2: number,
isMetric: boolean
) {
const EQUATORIAL_EARTH_RADIUS = 6378.137;
const distanceLatitude = degreesToRadians(latitude2 - latitude1);
const distanceLongitude = degreesToRadians(longitude2 - longitude1);
const a =
Expand Down Expand Up @@ -124,7 +127,7 @@ const seededRuns = [
},
];

const NON_SEEDED_BASED_RUN = 1;
const NON_SEEDED_BASED_RUN = 5;

describe('address', () => {
afterEach(() => {
Expand Down Expand Up @@ -585,41 +588,45 @@ describe('address', () => {
});

describe('nearbyGPSCoordinate()', () => {
it('should return random gps coordinate within a distance of another one', () => {
for (let i = 0; i < 100; i++) {
const latitude1 = +faker.address.latitude();
const longitude1 = +faker.address.longitude();
const radius = faker.datatype.float({ min: 1, max: 100 });
const isMetric = faker.datatype.boolean();

const coordinate = faker.address.nearbyGPSCoordinate(
[latitude1, longitude1],
radius,
isMetric
);

expect(coordinate.length).toBe(2);
expect(coordinate[0]).toBeTypeOf('string');
expect(coordinate[1]).toBeTypeOf('string');

const latitude2 = +coordinate[0];
expect(latitude2).toBeGreaterThanOrEqual(-90.0);
expect(latitude2).toBeLessThanOrEqual(90.0);

const longitude2 = +coordinate[1];
expect(longitude2).toBeGreaterThanOrEqual(-180.0);
expect(longitude2).toBeLessThanOrEqual(180.0);

const actualDistance = haversine(
latitude1,
longitude1,
latitude2,
longitude2,
isMetric
);
expect(actualDistance).toBeLessThanOrEqual(radius);
for (const isMetric of [true, false]) {
for (const radius of times(100)) {
it(`should return random gps coordinate within a distance of another one (${JSON.stringify(
{ isMetric, radius }
)})`, () => {
for (let i = 0; i < 100; i++) {
const latitude1 = +faker.address.latitude();
const longitude1 = +faker.address.longitude();

const coordinate = faker.address.nearbyGPSCoordinate(
[latitude1, longitude1],
radius,
isMetric
);

expect(coordinate.length).toBe(2);
expect(coordinate[0]).toBeTypeOf('string');
expect(coordinate[1]).toBeTypeOf('string');

const latitude2 = +coordinate[0];
expect(latitude2).toBeGreaterThanOrEqual(-90.0);
expect(latitude2).toBeLessThanOrEqual(90.0);

const longitude2 = +coordinate[1];
expect(longitude2).toBeGreaterThanOrEqual(-180.0);
expect(longitude2).toBeLessThanOrEqual(180.0);

const actualDistance = haversine(
latitude1,
longitude1,
latitude2,
longitude2,
isMetric
);
expect(actualDistance).toBeLessThanOrEqual(radius);
}
});
}
});
}
});
}
});
Expand Down

0 comments on commit 4535a6a

Please sign in to comment.