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