aboutsummaryrefslogtreecommitdiffziptar.gz
path: root/viewer/tests/profile.test.mjs
blob: 9418565f74290d31f156903c07ee9e3d18db03b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import './_planet.mjs';
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { profileModel, sampleAt } from '../js/profile.js';

const S = [{ d_km: 0, z_m: -200, water: true }, { d_km: 50, z_m: 300, water: false }, { d_km: 100, z_m: 1200, water: false },
  { d_km: 150, z_m: -50, water: true }];

test('model spans distance and elevation incl. sea level', () => {
  const m = profileModel(S, 320, 130);
  assert.ok(m.line.startsWith('M'));
  assert.equal(m.L, 150);
  assert.ok(m.lo <= -200 && m.hi >= 1200);
  assert.ok(m.Y(0) > m.Y(1200) && m.Y(0) < m.Y(-200));
  assert.ok(Math.abs(m.xAt(m.X(75)) - 75) < 1e-9);
  assert.equal(m.seaY, m.Y(0));
});

test('water runs cover the water samples, half a step either side', () => {
  const m = profileModel(S, 320, 130);
  assert.equal(m.water.length, 2);
  assert.ok(Math.abs(m.water[0][0] - m.X(0)) < 1e-9 && Math.abs(m.water[0][1] - m.X(25)) < 1e-9);
  assert.ok(Math.abs(m.water[1][0] - m.X(125)) < 1e-9 && Math.abs(m.water[1][1] - m.X(150)) < 1e-9);
});

test('flat land still gets a usable vertical range', () => {
  const m = profileModel([{ d_km: 0, z_m: 10, water: false }, { d_km: 5, z_m: 10, water: false }], 320, 130);
  assert.ok(m.hi - m.lo >= 100);
});

test('nearest sample by distance', () => {
  assert.equal(sampleAt(S, -5), 0);
  assert.equal(sampleAt(S, 74), 1);
  assert.equal(sampleAt(S, 76), 2);
  assert.equal(sampleAt(S, 999), 3);
});