/* * 判据的共享 check/finish —— 让"漏打 marker"和"计数写错位置"这两类 * **在新文件上不可能发生**(pi 2026-09-14 的建议)。 * * 背景:`run-all.mjs` 用"自报条数 + 每文件期望条数"当棘轮(只增不减), * 但之前那是两条靠记性的约定 —— "记得在结尾打 `RESULT pass=N`"、 * "计数必须写在 `check()` 内部"。这两条各自都踩空过: * `narrow-layout` 当时只有 `failed` 计数、`markdown-xss` 根本没有计数器。 * * 用法(判据文件): * * import { check, finish } from './lib/checks.mjs'; * check('这条判据的名字', cond, '失败时给人看的细节'); * finish('主题'); // 打完汇总就退出(有失败则退出码 1) * * 计数只可能在这个模块里发生,所以只要用了它: * - marker 一定会有(`finish()` 打); * - `check()` 的实现不可能被"合并冲突改空"而看不见(空实现 → pass=0 → 棘轮红)。 * * ⚠️ 反过来也成立:**判据文件里不要自己再写一份 check/计数**(那正是本模块要消灭的东西)。 * 已有的 12 条判据不用回改(`run-all.mjs` 的 marker 检查已经覆盖它们)。 */ let pass = 0; let fail = 0; /** 一条判据。`ok` 为真记通过,否则记失败并打印细节 */ export function check(name, ok, detail = '') { if (ok) { pass++; console.log(` 通过 ${name}`); return true; } fail++; console.error(` 失败 ${name}${detail ? ' — ' + detail : ''}`); return false; } /** 汇总并退出。`label` 是给人看的名字(例:「主题」) */ export function finish(label) { console.log(`\n${label}:${pass} 通过${fail ? `,${fail} 失败` : ''}`); // 机器可读的契约行:run-all.mjs 只认这一行来判"这条判据到底跑了几条" console.log(`RESULT pass=${pass} fail=${fail}`); process.exit(fail ? 1 : 0); }