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