// 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 };` },
];