84 lines
2.7 KiB
JavaScript
84 lines
2.7 KiB
JavaScript
// 跨脚本共享:统一的断言 / 计数 / 退出 helper。
|
||
//
|
||
// 之前散落在 ~25 个脚本里的断言模式有 3 种:
|
||
// 1) check(name, cond, detail='') + pass/fail 计数(大多数)
|
||
// 2) ok(name) / fail(name, msg) + failed 计数(少数)
|
||
// 3) 自定义 ok/bad + 自己的计数器(settings / backup / status-meta)
|
||
//
|
||
// 这里统一提供:
|
||
// - check(name, cond, detail?) —— 主流风格:条件断言,detail 是失败时的诊断
|
||
// - ok(name) / bad(name, msg) —— 风格 2 / 3 的兼容入口(适合「手动构造失败信息」)
|
||
// - printSummary(label) —— 打印「通过 X / 失败 Y」并按需 exit
|
||
// - summary 对象 —— 共享计数器,避免每个脚本各定义 pass/fail
|
||
//
|
||
// 用法:
|
||
// import { check, ok, bad, summary, printSummary } from './_lib/check.mjs';
|
||
// check('某断言', cond, '可选失败详情');
|
||
// ...
|
||
// printSummary('check-batch-ops');
|
||
|
||
export const summary = { pass: 0, fail: 0 };
|
||
|
||
/**
|
||
* 主流断言:cond 为真则通过,否则打印失败 + 可选详情。
|
||
* @param {string} name
|
||
* @param {boolean} cond
|
||
* @param {string} [detail]
|
||
*/
|
||
export function check(name, cond, detail = '') {
|
||
if (cond) {
|
||
summary.pass++;
|
||
console.log(` ✓ ${name}`);
|
||
} else {
|
||
summary.fail++;
|
||
const tail = detail ? ` — ${detail}` : '';
|
||
console.log(` ✗ ${name}${tail}`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 显式 ok:用于「不需要断言条件,直接报告通过」的场景。
|
||
* 兼容旧脚本里的 ok() 风格。
|
||
* @param {string} name
|
||
*/
|
||
export function ok(name) {
|
||
summary.pass++;
|
||
console.log(` ✓ ${name}`);
|
||
}
|
||
|
||
/**
|
||
* 显式 bad:用于「手动构造失败信息」的场景(错误细节比条件断言更复杂时)。
|
||
* 兼容旧脚本里的 fail()/bad() 风格。
|
||
* @param {string} name
|
||
* @param {string} [msg]
|
||
*/
|
||
export function bad(name, msg = '') {
|
||
summary.fail++;
|
||
const tail = msg ? `: ${msg}` : '';
|
||
console.log(` ✗ ${name}${tail}`);
|
||
}
|
||
|
||
/**
|
||
* 打印「通过 X / 失败 Y」总结行。
|
||
* exitOnFail=true 时若有失败则以 exit 1 退出(脚本默认应这么用)。
|
||
*
|
||
* @param {string} [label] - 总结行前的标签,例如脚本名
|
||
* @param {boolean} [exitOnFail=true]
|
||
*/
|
||
export function printSummary(label = '', exitOnFail = true) {
|
||
const head = label ? `${label} — ` : '';
|
||
console.log(`\n${head}通过 ${summary.pass} / 失败 ${summary.fail}`);
|
||
if (exitOnFail && summary.fail > 0) {
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 重置计数器 —— 脚本里想做多轮隔离断言时调用。
|
||
* 大多数脚本不需要:进程结束就 exit,counter 自然释放。
|
||
*/
|
||
export function resetSummary() {
|
||
summary.pass = 0;
|
||
summary.fail = 0;
|
||
}
|