diff options
| author | godosa <godosa@godosa.eu> | 2026-10-07 00:14:38 +0200 |
|---|---|---|
| committer | godosa <godosa@godosa.eu> | 2026-10-07 00:14:38 +0200 |
| commit | 3443c1c65e9f1753e1e656b35d08416c1fa298f2 (patch) | |
| tree | 4e43236f460145a4d75d1b4616dcb7aa6ef08f51 /viewer/tests/layers.test.mjs | |
| download | worldmap-viewer-3443c1c65e9f1753e1e656b35d08416c1fa298f2.tar.gz worldmap-viewer-3443c1c65e9f1753e1e656b35d08416c1fa298f2.zip | |
worldmap-viewer: initial public history
Diffstat (limited to 'viewer/tests/layers.test.mjs')
| -rw-r--r-- | viewer/tests/layers.test.mjs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/viewer/tests/layers.test.mjs b/viewer/tests/layers.test.mjs new file mode 100644 index 0000000..229606b --- /dev/null +++ b/viewer/tests/layers.test.mjs @@ -0,0 +1,50 @@ +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); +}); |
