67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
|
|
import { describe, it, expect } from 'vitest';
|
||
|
|
import {
|
||
|
|
distanceMeters,
|
||
|
|
bearingDegrees,
|
||
|
|
formatDistance,
|
||
|
|
} from '../src/util/distance-utils';
|
||
|
|
|
||
|
|
describe('distanceMeters', () => {
|
||
|
|
it('returns 0 for same point', () => {
|
||
|
|
expect(distanceMeters(59.9, 10.7, 59.9, 10.7)).toBe(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('calculates Oslo to Bergen distance (~305km)', () => {
|
||
|
|
// Oslo: 59.9139, 10.7522 — Bergen: 60.3913, 5.3221
|
||
|
|
const d = distanceMeters(59.9139, 10.7522, 60.3913, 5.3221);
|
||
|
|
expect(d).toBeGreaterThan(300_000);
|
||
|
|
expect(d).toBeLessThan(310_000);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('calculates short distance (~1.1km)', () => {
|
||
|
|
// ~1km apart in Oslo
|
||
|
|
const d = distanceMeters(59.91, 10.75, 59.92, 10.75);
|
||
|
|
expect(d).toBeGreaterThan(1000);
|
||
|
|
expect(d).toBeLessThan(1200);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('bearingDegrees', () => {
|
||
|
|
it('north bearing is ~0', () => {
|
||
|
|
const b = bearingDegrees(59.9, 10.7, 60.9, 10.7);
|
||
|
|
expect(b).toBeCloseTo(0, 0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('east bearing is ~90', () => {
|
||
|
|
const b = bearingDegrees(59.9, 10.0, 59.9, 11.0);
|
||
|
|
expect(b).toBeGreaterThan(85);
|
||
|
|
expect(b).toBeLessThan(95);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('south bearing is ~180', () => {
|
||
|
|
const b = bearingDegrees(60.0, 10.7, 59.0, 10.7);
|
||
|
|
expect(b).toBeCloseTo(180, 0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('west bearing is ~270', () => {
|
||
|
|
const b = bearingDegrees(59.9, 11.0, 59.9, 10.0);
|
||
|
|
expect(b).toBeGreaterThan(265);
|
||
|
|
expect(b).toBeLessThan(275);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('formatDistance', () => {
|
||
|
|
it('formats short distance in meters', () => {
|
||
|
|
expect(formatDistance(42)).toBe('42 m');
|
||
|
|
expect(formatDistance(999)).toBe('999 m');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('formats long distance in km', () => {
|
||
|
|
expect(formatDistance(1000)).toBe('1.0 km');
|
||
|
|
expect(formatDistance(1500)).toBe('1.5 km');
|
||
|
|
expect(formatDistance(12345)).toBe('12.3 km');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('rounds meters to nearest integer', () => {
|
||
|
|
expect(formatDistance(42.7)).toBe('43 m');
|
||
|
|
});
|
||
|
|
});
|