baseline: 薪酬逻辑收口到 shared/payroll.js 后的当前全量状态
这是第一个包含完整工作区的提交,也是后续「拆 SFC / 上 Vite」的回滚基线。 此前的提交均为 index.html 单文件历史快照,由 .bak 文件重建。 当前状态(提交前已实测): - index.html 内联薪酬算法已删除,改调 WHTPayroll - shared/payroll.js 为唯一薪酬实现,浏览器与 Node 共用 - 对外接口未变:aggregateMonth / isCutEdge / payDayKind 等保留同名薄包装 未入库内容见 .gitignore:依赖、Chrome 验证 profile、验证截图、 运行时 sqlite 数据与日志、时间戳备份、.trash。
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
// 生成/校验基准快照:把**当前** index.html 的薪酬输出固化成 JSON。
|
||||
//
|
||||
// 这是整张测试网的锚点。重构(抽模块、上 Vite、拆 SFC)之后再跑一遍对照,
|
||||
// 任何一个数字变了都会被 test/app-parity.test.js 抓出来。
|
||||
//
|
||||
// node tools/gen-baseline.js # 只校验,不写(默认,安全)
|
||||
// node tools/gen-baseline.js --check # 同上,显式写法
|
||||
// node tools/gen-baseline.js --write # 真的重写基准(需要明确意图)
|
||||
//
|
||||
// ⚠️ 为什么这个文件不能放在 test/ 目录里:
|
||||
// Node 的 test runner 在不给路径时会按 `**/test/**/*.?(c|m)js` 收集文件,
|
||||
// 于是 `test/gen-baseline.js` 会被当成一个测试文件**直接执行**(实测确认)。
|
||||
// 它当年的默认行为是「写基准」,等于 `node --test` 一跑就把安全网重新描一遍——
|
||||
// 哪怕代码算错了钱,基准也会被改成错的然后「测试全绿」。
|
||||
// 双重保险:① 挪出 test/,runner 收集不到;② 默认只校验,写要带 --write。
|
||||
//
|
||||
// 什么时候才允许重写基准:业务规则真的变了,而且你能逐条说清每个差异为什么该变。
|
||||
// 「重构后测试红了就重新生成基准」等于把安全网剪断,那还不如没有。
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { loadApp } = require('../test/lib/app-harness.js');
|
||||
const { probeApp } = require('../test/lib/probe.js');
|
||||
const { SCENARIOS, NOW } = require('../test/lib/scenarios.js');
|
||||
|
||||
const OUT_DIR = path.join(__dirname, '..', 'test', 'baseline');
|
||||
const OUT = path.join(OUT_DIR, 'payroll-baseline.json');
|
||||
|
||||
function build() {
|
||||
const cases = SCENARIOS.map((sc) => {
|
||||
const { app } = loadApp({
|
||||
records: sc.records, year: sc.year, month: sc.month,
|
||||
settings: sc.settings, adjust: sc.adjust, now: NOW
|
||||
});
|
||||
return { name: sc.name, probe: probeApp(app) };
|
||||
});
|
||||
return { frozenNow: NOW, scenarioCount: cases.length, cases };
|
||||
}
|
||||
|
||||
const write = process.argv.includes('--write');
|
||||
const data = build();
|
||||
const json = JSON.stringify(data, null, 2) + '\n';
|
||||
|
||||
if (!write) {
|
||||
if (!fs.existsSync(OUT)) {
|
||||
console.error('基准文件不存在:' + OUT + '\n首次生成请跑 node tools/gen-baseline.js --write');
|
||||
process.exit(1);
|
||||
}
|
||||
const old = fs.readFileSync(OUT, 'utf8');
|
||||
if (old === json) {
|
||||
console.log(`基准一致,${data.scenarioCount} 个场景无差异`);
|
||||
process.exit(0);
|
||||
}
|
||||
console.error('基准与当前 index.html 输出不一致。跑 npm test 看具体差在哪。');
|
||||
console.error('确认每处差异都该变之后,再 node tools/gen-baseline.js --write');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
fs.mkdirSync(OUT_DIR, { recursive: true });
|
||||
fs.writeFileSync(OUT, json);
|
||||
console.log(`已写入基准:${OUT}`);
|
||||
console.log(` 场景数 ${data.scenarioCount}`);
|
||||
console.log(` 冻结时刻 ${data.frozenNow}`);
|
||||
Reference in New Issue
Block a user