diff options
Diffstat (limited to 'viewer/tests/riverlod.test.mjs')
| -rw-r--r-- | viewer/tests/riverlod.test.mjs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/viewer/tests/riverlod.test.mjs b/viewer/tests/riverlod.test.mjs new file mode 100644 index 0000000..6bc58cc --- /dev/null +++ b/viewer/tests/riverlod.test.mjs @@ -0,0 +1,37 @@ +import './_planet.mjs'; +import { test } from 'node:test'; +import assert from 'node:assert/strict'; + +const { riverStats, riverMinOrder, cellSpacingKm } = await import('../js/riverlod.js'); +// r5 reference world: total river length per Strahler order (km, from its rivers.geojson) and its cell spacing +const r5 = { length: { 1: 3177232, 2: 430077, 3: 141166, 4: 38607, 5: 8174, 6: 1273 } }; +const cell = cellSpacingKm(5, 6371); + +test('H3 res-5 cells on an Earth-sized planet lie ≈ 16 km apart', () => { + assert.ok(Math.abs(cell - 15.9) < 0.2, String(cell)); +}); + +test('a phone at 26 km/px (the view that merged into blue) draws orders ≥ 3', () => { + assert.equal(riverMinOrder(26, r5, cell), 3); // order 3 ≈ 358 km apart ≥ 208; order 2 ≈ 117 km is not +}); + +test('closer in, smaller rivers join; first-order ones only when a cell spans ≥ 8 px', () => { + assert.equal(riverMinOrder(14, r5, cell), 2); + assert.equal(riverMinOrder(cell / 8, r5, cell), 1); + assert.equal(riverMinOrder(cell / 7, r5, cell), 2); +}); + +test('far out: only the largest rivers; no scale yet: the largest; no data: all', () => { + assert.equal(riverMinOrder(1e4, r5, cell), 6); + assert.equal(riverMinOrder(null, r5, cell), 6); + assert.equal(riverMinOrder(5, { length: {} }, cell), 1); +}); + +test('riverStats sums each order\'s length', async () => { + const line = (o, ...lons) => ({ properties: { order: o }, geometry: { coordinates: lons.map(x => [x, 0]) } }); + const s = riverStats({ features: [line(1, 0, 1), line(1, 2, 3, 4), line(2, 0, 0.5)] }); + const { distanceKm } = await import('../js/geo.js'); + const deg = distanceKm({ lat: 0, lon: 0 }, { lat: 0, lon: 1 }); // km per degree on this planet's equator + assert.ok(Math.abs(s.length[1] - 3 * deg) < 1, String(s.length[1])); + assert.ok(Math.abs(s.length[2] - 0.5 * deg) < 1, String(s.length[2])); +}); |
