aboutsummaryrefslogtreecommitdiffziptar.gz
path: root/viewer/tools/smoke/core.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'viewer/tools/smoke/core.mjs')
-rw-r--r--viewer/tools/smoke/core.mjs18
1 files changed, 18 insertions, 0 deletions
diff --git a/viewer/tools/smoke/core.mjs b/viewer/tools/smoke/core.mjs
new file mode 100644
index 0000000..000215c
--- /dev/null
+++ b/viewer/tools/smoke/core.mjs
@@ -0,0 +1,18 @@
+// core.mjs — the viewer boots, renders the globe, switches views and layers without console errors.
+export const steps = [
+ { name: 'boots', wait: 4000, expect: v => v.ok && !v.toast,
+ js: `const a = window.mapViewer; return { ok: !!a && !!a.texture, toast: document.getElementById('toast').textContent };` },
+ { name: 'globe drawn (centre pixel is not background)', expect: v => Math.abs(v[0] - 16) + Math.abs(v[1] - 18) + Math.abs(v[2] - 26) > 20,
+ js: `const a = window.mapViewer, gl = a.renderer.getContext(); a.view.render(); const p = new Uint8Array(4);
+ gl.readPixels(gl.drawingBufferWidth >> 1, gl.drawingBufferHeight >> 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, p); return [...p.slice(0, 3)];` },
+ { name: 'views switch', expect: v => v.join() === 'equal_earth,plate_carree,globe',
+ js: `const a = window.mapViewer, out = []; for (const k of ['equal_earth', 'plate_carree', 'globe']) { a.setView(k); out.push(a.view.kind); } return out;` },
+ { name: 'flat views render (their shaders compile)', expect: v => v.every(p => Math.abs(p[0] - 16) + Math.abs(p[1] - 18) + Math.abs(p[2] - 26) > 20),
+ js: `const a = window.mapViewer, gl = a.renderer.getContext(), out = [];
+ for (const k of ['equal_earth', 'plate_carree']) { a.setView(k); a.view.setState({ lat: 0, lon: 0, zoom: 1 }); a.view.render();
+ const p = new Uint8Array(4); gl.readPixels(gl.drawingBufferWidth >> 1, gl.drawingBufferHeight >> 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, p); out.push([...p.slice(0, 3)]); }
+ a.setView('globe'); return out;` },
+ { name: 'layers load', expect: v => v.n >= 19 && !v.toast,
+ js: `const s = document.getElementById('layer'); for (const o of s.options) { s.value = o.value; s.dispatchEvent(new Event('change')); await new Promise(r => setTimeout(r, 400)); }
+ return { n: s.options.length, toast: document.getElementById('toast').textContent };` },
+];