53 lines
1.8 KiB
JavaScript
53 lines
1.8 KiB
JavaScript
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;
|
|
});
|