/** Exercise the pinned source and shipped SIGCONT handlers without starting Hermes. */ const assert = require("node:assert/strict"); const fs = require("node:fs"); const path = require("node:path"); const root = process.env.HERMES_SOURCE_ROOT || "/opt/hermes"; const handlers = [ ["ui-tui/packages/hermes-ink/src/ink/ink.tsx", /^ private handleResume = \(\) => \{[\s\S]*?^ }/m], ["ui-tui/dist/entry.js", /^ handleResume = \(\) => \{[\s\S]*?^ };/m], ]; for (const [file, pattern] of handlers) { const source = fs.readFileSync(path.join(root, file), "utf8"); const match = source.match(pattern); assert.ok(match, `missing pinned SIGCONT handler: ${file}`); // Evaluate only the reviewed handler, with renderer effects replaced by spies. const Renderer = new Function(`return class { ${match[0].replace("private ", "")} }`)(); for (const [isTTY, isPaused, expected] of [ [true, false, 1], [true, true, 0], [false, false, 0], ]) { const renderer = new Renderer(); let repaints = 0; renderer.options = { stdout: { isTTY } }; renderer.isPaused = isPaused; renderer.altScreenActive = true; renderer.reenterAltScreen = () => { repaints++; }; renderer.handleResume(); assert.equal(repaints, expected, `${file}: TTY=${isTTY}, paused=${isPaused}`); } } console.log("dashboard SIGCONT source and shipped handlers passed");