import './_planet.mjs';
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { parseCoords, isCellId, suggest } from '../js/search.js';
const near = (a, b, eps) => assert.ok(Math.abs(a - b) <= eps, `${a} vs ${b}`);
test('coordinate formats', () => {
const cases = [['40N 10W', 40, -10], ['40.5, -10.25', 40.5, -10.25], ['-12 170', -12, 170], ["40°30'N 10°15'W", 40.5, -10.25],
['10W 40N', 40, -10], ['N40 E10', 40, 10], ['40.5 N, 10.25 E', 40.5, 10.25], ['12°30\'15"S 45°E', -(12 + 30 / 60 + 15 / 3600), 45]];
for (const [q, lat, lon] of cases) {
const c = parseCoords(q);
assert.ok(c, q);
near(c.lat, lat, 1e-9);
near(c.lon, lon, 1e-9);
}
});
test('junk is rejected', () => {
for (const q of ['', 'hello', '40', '95 10', '10 200', '40N 10N', "40°75'N 10W", '40N 10W 5', 'Cell Am Zee', 'NEWS', '4O 10']) {
assert.equal(parseCoords(q), null, q);
}
});
test('H3 cell ids', () => {
assert.equal(isCellId('8528308ffffffff'), true);
assert.equal(isCellId(' 8528308FFFFFFFF '), true);
assert.equal(isCellId('0528308ffffffff'), false);
assert.equal(isCellId('8528308fffffff'), false);
});
test('suggestions: coordinates, cells, then pins', () => {
const pins = [{ id: 'pin-1', name: 'Zeta ford', lat: 1, lon: 2, lore: null, note: '' },
{ id: 'pin-2', name: 'Alpha peak', lat: 3, lon: 4, lore: 'physical-world', note: '' }];
assert.deepEqual(suggest('40N 10W', pins).map(s => [s.kind, s.lat, s.lon]), [['coords', 40, -10]]);
assert.deepEqual(suggest('8528308ffffffff', pins).map(s => [s.kind, s.cell]), [['cell', '8528308ffffffff']]);
assert.deepEqual(suggest('a', pins).map(s => s.label), ['Alpha peak', 'Zeta ford']);
assert.deepEqual(suggest(' ', pins), []);
});
test('decimal commas in a two-number entry', () => {
const a = parseCoords('40,5 10,25'), b = parseCoords('40,5N 10,25W'), c = parseCoords('40,5');
assert.deepEqual([a.lat, a.lon], [40.5, 10.25]);
assert.deepEqual([b.lat, b.lon], [40.5, -10.25]);
assert.deepEqual([c.lat, c.lon], [40, 5]); // no space: still "lat,lon"
});
test('decimal commas anywhere, and "lat,lon" still wins when it parses', () => {
for (const [q, lat, lon] of [['40 10,5', 40, 10.5], ['40.5 10,25', 40.5, 10.25], ['40N 10,5E', 40, 10.5],
['40,5 10', 40.5, 10], ['40,5 E', 40, 5]]) {
const c = parseCoords(q);
assert.ok(c, q);
assert.deepEqual([c.lat, c.lon], [lat, lon], q);
}
});