- src/test 迁移至根目录 tests/(16 测试 + fixtures/manual),导入改为 ../src/ - 新增 tsconfig.test.json 独立编译测试;.vscode-test.mjs / package.json / .gitignore 同步 - 新增 tests/test-execution-log.md、tests/test-cases.md(116 用例清单) - 新增 tests/measure/measure-review-time.mjs + performance-comparison.md(提效测量) - 重命名 3 个中文报告文件为 demo-*-coverage-report.md - git rm --cached 解除 vsix 跟踪;README 标注演示视频进行中
11 KiB
11 KiB
测试用例清单
来源:tests/*.test.ts 中 suite() / test() 声明。共 16 个测试文件、116 条用例。
1. adapter.test.ts — Adapter Tests(6)
| # | 用例 | 覆盖点 |
|---|---|---|
| 1 | ESLintAdapter has correct id and languages | 适配器标识与支持语言 |
| 2 | StylelintAdapter has correct id and languages | 适配器标识与支持语言 |
| 3 | ESLintAdapter check returns AdapterResult structure | 静态分析返回结构 |
| 4 | ESLintAdapter surfaces octal literal as eslint:parse-error | 八进制字面量解析错误上报 |
| 5 | ESLintAdapter surfaces \8 escape as eslint:parse-error | 非法转义解析错误上报 |
| 6 | ESLintAdapter parses JSX in .js without parse error | JSX 语法解析 |
2. ai-empty-response.test.ts — AI Empty Response Handling(6)
| # | 用例 | 覆盖点 |
|---|---|---|
| 7 | parseJsonResponse throws empty-response error on blank input | 空响应识别 |
| 8 | parseJsonResponse parses valid JSON normally | 正常 JSON 解析 |
| 9 | chatWithRetry retries once on EmptyContentError | 空内容自动重试 |
| 10 | chatWithRetry propagates error when retry also returns empty | 重试仍空则抛错 |
| 11 | chatWithRetry does not retry on non-empty-content errors | 非空内容错误不重试 |
| 12 | openai-compatible reports max_tokens truncation clearly | token 截断提示 |
3. ai-fix-engine.test.ts — AI FixEngine Tests(4)
| # | 用例 | 覆盖点 |
|---|---|---|
| 13 | aiFixDiagnostic applies AI fix and converges | AI 修复收敛 |
| 14 | aiFixDiagnostic returns ai-match-failed when originalText not found | 原文未匹配 |
| 15 | aiFixDiagnostic returns ai-no-fix when AI provides empty fix | AI 无修复 |
| 16 | aiFixDiagnostic retries until issue resolved within maxIterations | 迭代上限内收敛 |
4. config.test.ts — Config Tests(4)
| # | 用例 | 覆盖点 |
|---|---|---|
| 17 | getAIConfig returns default values | AI 配置默认值 |
| 18 | AI individual getters return defaults | 单项配置 getter |
| 19 | getLinterForLanguage returns configured linter | 语言→linter 映射 |
| 20 | getFixMaxIterations returns default | 修复迭代默认值 |
5. customFixEngine.test.ts — Custom FixEngine Tests(5)
| # | 用例 | 覆盖点 |
|---|---|---|
| 21 | aiFixReviewIssue applies AI fix and converges after verify | 自定义规则 AI 修复收敛 |
| 22 | aiFixReviewIssue returns ai-match-failed when originalText not found | 原文未匹配 |
| 23 | aiFixReviewIssue retries until verify passes within maxIterations | 验证驱动重试 |
| 24 | aiFixReviewIssue accepts last fix when verify never passes | 验证不过时接受最后修复 |
| 25 | aiFixReviewIssue retries empty fix once then fails with ai-no-fix | 空修复重试一次后失败 |
6. dedup-prompt.test.ts — Dedup Prompt Tests(3)
| # | 用例 | 覆盖点 |
|---|---|---|
| 26 | buildDedupOnlyPrompt 同时提供静态规则与自定义规则 | 去重 prompt 组装 |
| 27 | 自定义规则时包含静态规则 | 去重 prompt 规则合并 |
| 28 | buildKnownRulesSection 生成的规则包含全部 | 已知规则段完整性 |
7. diagnostics.test.ts — DiagnosticMarkers Tests(6)
| # | 用例 | 覆盖点 |
|---|---|---|
| 29 | toVscodeDiagnostics maps severity correctly | 严重级别映射 |
| 30 | toVscodeDiagnostics preserves range | 范围保留 |
| 31 | toVscodeDiagnostics prefixes message with plugin and linter | 消息前缀 |
| 32 | toVscodeDiagnostics handles ruleId without linter prefix | 无前缀 ruleId |
| 33 | toVscodeDiagnostics sets source and code for quick fix hover | hover 修复来源/代码 |
| 34 | toVscodeDiagnostics returns empty array for empty input | 空输入 |
8. fixEngine.test.ts — FixEngine Tests(5)
| # | 用例 | 覆盖点 |
|---|---|---|
| 35 | ESLint adapter attaches fix object for autofixable issues | 可自动修复诊断挂 fix |
| 36 | fixDiagnostic multi-round convergence produces applied fixes | 多轮修复收敛 |
| 37 | fixDiagnostic returns not-autofixable for non-fixable rule | 不可修复规则 |
| 38 | fixDiagnostic no-change returns no-change | 无变化场景 |
| 39 | fixDiagnostic fixes only the targeted issue, not adjacent same-rule instance | 定点修复不误伤相邻同类 |
9. fixSession.test.ts — FixSession Tests(6)
| # | 用例 | 覆盖点 |
|---|---|---|
| 40 | add/get/has roundtrip | 会话读写 |
| 41 | get returns undefined for missing key | 缺失键 |
| 42 | getEntries filters per uri | 按 uri 过滤 |
| 43 | clear removes entries for uri only | 按 uri 清理 |
| 44 | recordFixes merges multi-round fixes under same key | 多轮修复合并 |
| 45 | undo restores original text via workspace edit | 撤销恢复原文 |
10. import-dedup.test.ts — Import Dedup Tests(25)
| # | 用例 | 覆盖点 |
|---|---|---|
| 46 | 重复规则:全局检查并标注 | 全局重复检查 |
| 47 | 全局 exact:全部标注 | exact 去重 |
| 48 | 全局 overlap:全部检查并标注 | overlap 去重 |
| 49 | 跨规则 exact 标注(overlap 归 none) | 跨规则 exact 归属 |
| 50 | 用户指定 exact 后取消标注 | 用户决策 exact |
| 51 | 用户标注 overlap 将标注加 # 前缀 | overlap 标注头 |
| 52 | 用户标注 none 加 # 前缀 | none 标注头 |
| 53 | 已标注 duplicateLevel/duplicateOf/duplicateReason 剔出标注 | 已标注剔除 |
| 54 | 标注规则 duplicateReason 标注头回填原由 | 原因回填 |
| 55 | 编辑 description 确认 YAML 使用该值 | description 编辑 |
| 56 | 编辑 severity 确认 YAML 使用该 severity | severity 编辑 |
| 57 | 编辑 languages 确认 YAML 有 languages | languages 编辑 |
| 58 | 编辑切换为标注、标注转为编辑值 | 编辑/标注互转 |
| 59 | 无编辑时保留原始 yamlContent | 原始内容保留 |
| 60 | severity 缺失默认为 warning | severity 默认 |
| 61 | severity 非法值默认为 warning | severity 兜底 |
| 62 | id 缺失生成 rule-N | id 自动命名 |
| 63 | 多个 id 缺失依次 rule-1, rule-2... | 递增命名 |
| 64 | description 缺失时使用 message(中文存在) | 双语回退 |
| 65 | message 缺失时使用 description(中文存在) | 双语回退 |
| 66 | description 与 message 同时缺失时兜底 | 全缺失兜底 |
| 67 | 重复规则的重复校验回归 | 去重回归 |
| 68 | id 带引号、字段带引号保留 id | 引号 id |
| 69 | scalar 字段带引号、保留引号 | 引号 scalar |
11. merger.test.ts — Merger Tests(12)
| # | 用例 | 覆盖点 |
|---|---|---|
| 70 | mergeResults counts correctly | 计数正确 |
| 71 | mergeResults marks degraded when AI fails | AI 失败降级 |
| 72 | mergeResults sorts diagnostics by severity then line | 排序 |
| 73 | mergeResults marks fixable only diagnostics with fix object | 可修复标记 |
| 74 | mergeResults converts aiFindings line to 0-based | 行号 0 基化 |
| 75 | mergeResults pairs translations by originalRuleId not index | 按规则 id 配对翻译 |
| 76 | mergeResults handles duplicate ruleId translations in order | 重复 id 有序 |
| 77 | mergeResults matches translations by normalized ruleId when prefix missing | 缺前缀归一化匹配 |
| 78 | mergeResults matches translations by normalized ruleId with slash variant | 斜杠变体匹配 |
| 79 | mergeResults prefers exact ruleId match over normalized | 精确匹配优先 |
| 80 | mergeResults computes aiFixableLinterIndices excluding native fix and sqlfluff | AI 可修复索引 |
| 81 | mergeResults aiFixableLinterIndices empty when AI unavailable | AI 不可用置空 |
12. messages.test.ts — I18n Tests(9)
| # | 用例 | 覆盖点 |
|---|---|---|
| 82 | all message keys have values for all three languages | 三语 key 完整 |
| 83 | default language is zh-CN | 默认语言 |
| 84 | setLanguage changes current language | 语言切换 |
| 85 | t() falls back to key when key does not exist | 缺失 key 回退 |
| 86 | t() returns zh-CN string in zh-CN language | 中文翻译 |
| 87 | t() returns English string in en language | 英文翻译 |
| 88 | t() returns Japanese string in ja language | 日文翻译 |
| 89 | t() with template variables | 模板变量 |
| 90 | t() with multiple template variables | 多模板变量 |
13. pipeline.test.ts — Pipeline Tests(1)
| # | 用例 | 覆盖点 |
|---|---|---|
| 91 | Full pipeline: linter check + merge | 全链路(linter + 合并) |
14. rule-filter.test.ts — Rule Filter Tests(15)
| # | 用例 | 覆盖点 |
|---|---|---|
| 92 | 规则匹配当前语言 | 语言匹配 |
| 93 | 规则未匹配被过滤 | 不匹配过滤 |
| 94 | 规则为空:全部保留 | 空规则集 |
| 95 | 规则缺失:全部保留 | 缺失过滤 |
| 96 | 规则按语言匹配后去重 | 去重 |
| 97 | 规则未匹配语言则去除 | 语言不匹配去除 |
| 98 | 规则为空时去重 | 空集去重 |
| 99 | 规则 + 语言映射匹配时过滤结果优先 | 优先级 |
| 100 | typescriptreact 同源映射到 typescript | TSX 映射 |
| 101 | plsql 同源映射到 sql | PL/SQL 映射 |
| 102 | JSP 映射 java 规则 | JSP→Java |
| 103 | JSP 不映射 css 规则 | JSP→CSS 排除 |
| 104 | 普通 HTML 触发 JSP 过滤 java 规则 | HTML→JSP |
| 105 | 全部过滤触发 skippedRequestA=true | 全过滤标记 |
| 106 | 部分过滤触发 skippedRequestA=false | 部分过滤标记 |
15. sqlfluff-prs.test.ts — SqlFluff PRS Tests(4)
| # | 用例 | 覆盖点 |
|---|---|---|
| 107 | buildPRSMessage extracts fragment from description | PRS 片段提取 |
| 108 | buildPRSMessage flattens newlines in fragment | 换行压平 |
| 109 | buildPRSMessage truncates long fragments | 长片段截断 |
| 110 | buildPRSMessage falls back to description when pattern missing | 无匹配回退 |
16. sqlfluff-range.test.ts — SqlFluff Range Tests(6)
| # | 用例 | 覆盖点 |
|---|---|---|
| 111 | full positions convert to zero-based range | 完整位置 0 基化 |
| 112 | missing end positions fall back to start (comment JJ01 case) | 缺终点回退(JJ01) |
| 113 | legacy line_no/line_pos keys are honored | 旧版 key 兼容 |
| 114 | null positions fall back to defaults | null 兜底 |
| 115 | zero positions are clamped to valid values | 零值钳制 |
| 116 | missing all positions produce a safe zero range | 全缺失安全范围 |
统计
| 文件 | 用例数 |
|---|---|
| adapter.test.ts | 6 |
| ai-empty-response.test.ts | 6 |
| ai-fix-engine.test.ts | 4 |
| config.test.ts | 4 |
| customFixEngine.test.ts | 5 |
| dedup-prompt.test.ts | 3 |
| diagnostics.test.ts | 6 |
| fixEngine.test.ts | 5 |
| fixSession.test.ts | 6 |
| import-dedup.test.ts | 25 |
| merger.test.ts | 12 |
| messages.test.ts | 9 |
| pipeline.test.ts | 1 |
| rule-filter.test.ts | 15 |
| sqlfluff-prs.test.ts | 4 |
| sqlfluff-range.test.ts | 6 |
| 合计 | 116 |