const assert = require('assert'); const { haversineDistance, bearing, bearingDiff } = require('../src/utils/geo'); describe('geo utilities', () => { describe('haversineDistance', () => { it('returns 0 for same point', () => { assert.strictEqual(haversineDistance(51.5, -0.1, 51.5, -0.1), 0); }); it('calculates distance between London and Paris (~340 km)', () => { const d = haversineDistance(51.5074, -0.1278, 48.8566, 2.3522); assert.ok(d > 340000 && d < 345000, `Expected ~342 km, got ${(d/1000).toFixed(1)} km`); }); it('calculates short distance accurately (~1 m steps)', () => { // 0.00001 degrees lat ≈ 1.11 m const d = haversineDistance(51.5000, 0, 51.5001, 0); assert.ok(d > 10 && d < 12, `Expected ~11 m, got ${d.toFixed(2)} m`); }); }); describe('bearing', () => { it('returns 0 for due north', () => { const b = bearing(51.0, 0.0, 52.0, 0.0); assert.ok(Math.abs(b) < 1, `Expected ~0°, got ${b.toFixed(1)}°`); }); it('returns 90 for due east', () => { const b = bearing(51.0, 0.0, 51.0, 1.0); assert.ok(Math.abs(b - 90) < 2, `Expected ~90°, got ${b.toFixed(1)}°`); }); it('returns 180 for due south', () => { const b = bearing(52.0, 0.0, 51.0, 0.0); assert.ok(Math.abs(b - 180) < 1, `Expected ~180°, got ${b.toFixed(1)}°`); }); it('returns 270 for due west', () => { const b = bearing(51.0, 1.0, 51.0, 0.0); assert.ok(Math.abs(b - 270) < 2, `Expected ~270°, got ${b.toFixed(1)}°`); }); }); describe('bearingDiff', () => { it('returns 0 for same bearing', () => { assert.strictEqual(bearingDiff(90, 90), 0); }); it('returns 90 for perpendicular bearings', () => { assert.strictEqual(bearingDiff(0, 90), 90); assert.strictEqual(bearingDiff(90, 0), 90); }); it('returns 180 for opposite bearings', () => { assert.strictEqual(bearingDiff(0, 180), 180); }); it('wraps around 360', () => { assert.strictEqual(bearingDiff(350, 10), 20); assert.strictEqual(bearingDiff(10, 350), 20); }); }); });