Plan 11 — 加强 ACCEPTABLE 评分测试
优先级:中 | ~15 个文件 | 预估新增 ~80 个测试用例
本计划对 ACCEPTABLE 评分文件中的具体缺陷进行定向加强。每个条目只列出需要改动的部分,不做全量重写。
11.1 src/utils/__tests__/diff.test.ts
| 改动 |
当前 |
改为 |
getPatchFromContents 断言 |
hunks.length > 0 |
验证具体 +/- 行内容 |
$ 字符转义 |
未测试 |
新增含 $ 的内容测试 |
ignoreWhitespace 选项 |
未测试 |
新增 ignoreWhitespace: true 用例 |
| 删除全部内容 |
未测试 |
newContent: "" |
| 多 hunk 偏移 |
adjustHunkLineNumbers 仅单 hunk |
新增多 hunk 同数组测试 |
11.2 src/utils/__tests__/path.test.ts
当前仅覆盖 2/5+ 导出函数。新增:
| 函数 |
最少用例 |
关键边界 |
expandPath |
6 |
~/ 展开、绝对路径直通、相对路径、空串、含 null 字节、~user 格式 |
toRelativePath |
3 |
同级文件、子目录、父目录 |
sanitizePath |
3 |
正常路径、含 .. 段、空串 |
containsPathTraversal 补充:
- URL 编码
%2e%2e%2f(确认不匹配,记录为非需求)
- 混合分隔符
foo/..\bar
normalizePathForConfigKey 补充:
- 混合分隔符
foo/bar\baz
- 冗余分隔符
foo//bar
- Windows 盘符
C:\foo\bar
11.3 src/utils/__tests__/uuid.test.ts
| 改动 |
说明 |
| 大写测试断言强化 |
not.toBeNull() → 验证标准化输出(小写+连字符格式) |
新增 createAgentId |
3 用例:无 label / 有 label / 输出格式正则 /^a[a-z]*-[a-f0-9]{16}$/ |
| 前后空白 |
" 550e8400-... " 期望 null |
11.4 src/utils/__tests__/semver.test.ts
| 用例 |
输入 |
期望 |
| pre-release 比较 |
gt("1.0.0", "1.0.0-alpha") |
true |
| pre-release 间比较 |
order("1.0.0-alpha", "1.0.0-beta") |
-1 |
| tilde range |
satisfies("1.2.5", "~1.2.3") |
true |
* 通配符 |
satisfies("2.0.0", "*") |
true |
| 畸形版本 |
order("abc", "1.0.0") |
确认不抛错 |
0.0.0 |
gt("0.0.0", "0.0.0") |
false |
11.5 src/utils/__tests__/hash.test.ts
| 改动 |
当前 |
改为 |
| djb2 32 位检查 |
hash | 0(恒 true) |
Number.isSafeInteger(hash) && Math.abs(hash) <= 0x7FFFFFFF |
| hashContent 空串 |
未测试 |
新增 |
| hashContent 格式 |
未验证输出为数字串 |
toMatch(/^\d+$/) |
| hashPair 空串 |
未测试 |
hashPair("", "b"), hashPair("", "") |
| 已知答案 |
无 |
断言 djb2Hash("hello") 为特定值(需先在控制台运行一次确定) |
11.6 src/utils/__tests__/claudemd.test.ts
当前仅覆盖 3 个辅助函数。新增:
| 用例 |
函数 |
说明 |
| 未闭合注释 |
stripHtmlComments |
"<!-- no close some text" → 原样返回 |
| 跨行注释 |
stripHtmlComments |
"<!--\nmulti\nline\n-->text" → "text" |
| 同行注释+内容 |
stripHtmlComments |
"<!-- note -->some text" → "some text" |
| 内联代码中的注释 |
stripHtmlComments |
`<!-- kept -->` → 保留 |
| 大小写不敏感 |
isMemoryFilePath |
"claude.md", "CLAUDE.MD" |
| 非 .md 规则文件 |
isMemoryFilePath |
.claude/rules/foo.txt → false |
| 空数组 |
getLargeMemoryFiles |
[] → [] |
11.7 src/tools/FileEditTool/__tests__/utils.test.ts
| 函数 |
新增用例 |
normalizeQuotes |
混合引号 "she said 'hello'"` |
stripTrailingWhitespace |
CR-only \r、无尾部换行、全空白串 |
findActualString |
空 content、Unicode content |
preserveQuoteStyle |
单引号、缩写中的撇号(如 it's)、空串 |
applyEditToFile |
replaceAll=true 零匹配、oldString 无尾部 \n、多行内容 |
11.8 src/utils/model/__tests__/providers.test.ts
| 改动 |
说明 |
删除 originalEnv |
未使用,消除死代码 |
| env 恢复改为快照 |
beforeEach 保存 process.env,afterEach 恢复 |
| 新增三变量同时设置 |
bedrock + vertex + foundry 全部为 "1",验证优先级 |
新增非 "1" 值 |
"true", "0", "" |
isFirstPartyAnthropicBaseUrl |
URL 含路径 /v1、含尾斜杠、非 HTTPS |
11.9 src/utils/__tests__/hyperlink.test.ts
| 用例 |
说明 |
| 空 URL |
createHyperlink("http://x.com", "", { supported: true }) 不抛错 |
| undefined supportsHyperlinks |
选项未传时走默认检测 |
| 非 ant staging URL |
USER_TYPE !== "ant" 时 staging 返回 false |
11.10 src/utils/__tests__/objectGroupBy.test.ts
| 用例 |
说明 |
| key 返回 undefined |
(_, i) => undefined → 全部归入 undefined 组 |
| key 为特殊字符 |
({ name }) => name 含空格/中文 |
11.11 src/utils/__tests__/CircularBuffer.test.ts
| 用例 |
说明 |
| capacity=1 |
添加 2 个元素,仅保留最后一个 |
| 空 buffer 调用 getRecent |
返回空数组 |
| getRecent(0) |
返回空数组 |
11.12 src/utils/__tests__/contentArray.test.ts
| 用例 |
说明 |
| 混合交替 |
[tool_result, text, tool_result] — 验证插入到正确位置 |
11.13 src/utils/__tests__/argumentSubstitution.test.ts
| 用例 |
说明 |
| 转义引号 |
"he said \"hello\"" |
| 越界索引 |
$ARGUMENTS[99](参数不够时) |
| 多占位符 |
"cmd $0 $1 $0" |
11.14 src/utils/__tests__/messages.test.ts
| 改动 |
说明 |
normalizeMessages 断言加强 |
验证拆分后的消息内容,不只是长度 |
isNotEmptyMessage 空白 |
[{ type: "text", text: " " }] |
验收标准