aboutsummaryrefslogtreecommitdiffziptar.gz
path: root/viewer/tests/layers.test.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'viewer/tests/layers.test.mjs')
-rw-r--r--viewer/tests/layers.test.mjs50
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);
+});