atlas-iac/dockerfiles/hermes-terminal-resume-regression.js

34 lines
1.4 KiB
JavaScript
Raw Normal View History

/** 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");