worldmap-viewer

git clone https://git.godosa.eu/worldmap-viewer

master

raw · 2440 bytes

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);
  }
});