Files
MailUI4Agents/client/electron/test/lib/checks.mjs
JianFeeeee ec90cba129 test(criteria): 抽出共享 check/finish(marker 不再靠记性)+ 失败信息自带修法
pi 的三条增量,前两条落地:

1. **错误信息自带修法**:受众不只是读过规范的人 —— 并发写 WebUI 的 agent 新加判据时不会打开
   CRITERIA.md,看到红的第一反应可能是"套件坏了"。所以把可照抄的修法写进那条错误本身
   (共享 helper 的用法 + 样板文件路径),并说明 node:test 的判据不用管。
   **red 是 ta 一定会看到的,文档不一定被打开。**

2. **marker 由共享 helper 打印**:新增 test/lib/checks.mjs(导出 check/finish),
   计数只可能在该模块内发生 → "漏打 marker"与"计数写错位置"这两类在新文件上不可能发生。
   为避免"写了没人用"(本仓踩过的坑),同时把两个手工计数的判据改用它:
   narrow-layout(原来只有 failed 计数)与 markdown-xss(原来根本没有计数器)——
   条数不变(52 / 9),套件仍全绿。

未回改其余 10 个文件:run-all 的 marker 检查已经覆盖它们。
2026-09-14 15:11:47 +08:00

45 lines
1.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 判据的共享 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);
}