50 lines
1.8 KiB
JavaScript
50 lines
1.8 KiB
JavaScript
// Interactive smoke test: verify click -> navigate flow works.
|
|
const fs = require('fs');
|
|
const html = fs.readFileSync(process.argv[2], 'utf-8');
|
|
const m = html.match(/<script>\s*(window\.QUX_MODEL.*?)<\/script>/s);
|
|
if (!m) { console.error('no engine'); process.exit(1); }
|
|
|
|
function makeEl() {
|
|
const el = {
|
|
style: {}, dataset: {}, children: [], _listeners: {},
|
|
classList: { add() {}, remove() {} },
|
|
appendChild(c) { el.children.push(c); return c; },
|
|
addEventListener(t, fn) { (el._listeners[t] = el._listeners[t] || []).push(fn); },
|
|
set textContent(v) { el._text = v; }, get textContent() { return el._text || ''; },
|
|
set innerHTML(v) { el._html = v; }, get innerHTML() { return el._html || ''; },
|
|
};
|
|
return el;
|
|
}
|
|
const stage = makeEl();
|
|
const nameEl = makeEl();
|
|
global.window = { innerWidth: 1920, innerHeight: 1080, addEventListener() {} };
|
|
global.document = {
|
|
getElementById(id) { return id === 'stage' ? stage : (id === 'screenName' ? nameEl : makeEl()); },
|
|
createElement() { return makeEl(); },
|
|
};
|
|
|
|
eval(m[1]);
|
|
|
|
const firstScreenName = nameEl._text;
|
|
const wired = [];
|
|
(function collect(el) {
|
|
if (el._listeners.click && el._listeners.click.length) wired.push(el);
|
|
el.children.forEach(collect);
|
|
})(stage);
|
|
|
|
console.log('start screen:', firstScreenName);
|
|
console.log('clickable (wired) widgets on screen:', wired.length);
|
|
|
|
if (wired.length) {
|
|
wired[0]._listeners.click[0](); // simulate click
|
|
const after = nameEl._text;
|
|
console.log('after click screen:', after);
|
|
if (after && after !== firstScreenName) {
|
|
console.log('INTERACTION OK: navigated', firstScreenName, '->', after);
|
|
} else {
|
|
console.log('note: click stayed on same screen (or target is same screen) -', after);
|
|
}
|
|
} else {
|
|
console.log('no wired widgets on start screen (no interactions starting here)');
|
|
}
|