const fs = require("node:fs"); const path = require("node:path"); const assert = require("node:assert/strict"); const root = path.resolve(__dirname, ".."); const modulePath = path.join(root, "utils", "discard-confirmation.js"); const loadModule = async () => { const source = fs.readFileSync(modulePath, "utf8"); return import(`data:text/javascript;base64,${Buffer.from(source).toString("base64")}`); }; const run = async () => { const { createDiscardConfirmation } = await loadModule(); const visibility = []; const controller = createDiscardConfirmation((visible) => { visibility.push(visible); }); const first = controller.request(); const repeated = controller.request(); assert.strictEqual(repeated, first, "重复请求必须复用同一个等待 Promise"); assert.deepEqual(visibility, [true], "重复请求不得重复打开确认框"); controller.cancel(); assert.equal(await first, false, "取消必须让等待者得到 false"); assert.deepEqual(visibility, [true, false], "取消必须关闭确认框"); const confirmed = controller.request(); controller.confirm(); assert.equal(await confirmed, true, "确认必须让等待者得到 true"); const disposed = controller.request(); controller.dispose(); assert.equal(await disposed, false, "页面卸载必须释放等待者并返回 false"); const afterDispose = controller.request(); assert.notStrictEqual(afterDispose, disposed, "释放后必须能建立新的确认周期"); controller.cancel(); assert.equal(await afterDispose, false); assert.throws( () => createDiscardConfirmation(null), /setVisible 必须是函数/, "必须拒绝无法同步可见状态的消费者", ); console.log("DISCARD-CONFIRMATION-RUNTIME-SMOKE PASS"); }; run().catch((error) => { console.error(error); process.exitCode = 1; });