worldmap-viewer

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

master

raw · 2480 bytes

import './_planet.mjs';
import { test } from 'node:test';
import assert from 'node:assert/strict';
import './importmap.mjs';
import { FakeEl, installFakeDom } from './fakedom.mjs';

installFakeDom();
const { renderLegend } = await import('../js/layers.js');

test('legend shows readable units (degC → °C)', () => {
  const box = new FakeEl('div');
  renderLegend(box, { name: 'T', legend: { type: 'continuous', unit: 'degC', stops: [[-40, '#000000'], [40, '#ffffff']] } });
  assert.match(box.textContent, /°C/);
  assert.doesNotMatch(box.textContent, /degC/);
});

test('the base and over-layer textures in use are never evicted', async () => {
  const { LayerStore } = await import('../js/layers.js');
  const ids = ['relief', 'biomes', 'a', 'b', 'c', 'd'], disposed = [];
  const store = new LayerStore(ids.map(id => ({ id, file: id })), 8192, 1, async l => ({ id: l.id, dispose() { disposed.push(l.id); } }));
  store.pin(['relief', 'biomes']);
  for (const id of ids) await store.texture(id);
  await new Promise(r => setTimeout(r, 0));
  assert.ok(!disposed.includes('relief') && !disposed.includes('biomes'), disposed.join());
  assert.ok(disposed.includes('a'));
});

test('textures still on screen are never evicted while newer ones load', async () => {
  const { LayerStore } = await import('../js/layers.js');
  const ids = ['relief', 'a', 'b', 'c', 'd', 'e'], disposed = [];
  const store = new LayerStore(ids.map(id => ({ id, file: id })), 8192, 1, async l => ({ id: l.id, dispose() { disposed.push(l.id); } }));
  await store.texture('relief');
  store.showing(['relief']);                                   // drawn now
  for (const id of ids.slice(1)) { store.pin([id]); store.texture(id); }   // rapid layer switches, none shown yet
  await new Promise(r => setTimeout(r, 0));
  assert.ok(!disposed.includes('relief'), disposed.join());
});

test('dispose frees every cached texture except those still drawn (another era took over)', async () => {
  const { LayerStore } = await import('../js/layers.js');
  const ids = ['relief', 'a', 'b'], disposed = [];
  const store = new LayerStore(ids.map(id => ({ id, file: id })), 8192, 1, async l => ({ id: l.id, dispose() { disposed.push(l.id); } }));
  const drawn = await store.texture('relief');
  await store.texture('a');
  await store.texture('b');
  store.dispose([drawn]);
  await new Promise(r => setTimeout(r, 0));
  assert.deepEqual(disposed.sort(), ['a', 'b']);
  assert.equal(store.cache.size, 0);
});