# 测试用例清单 来源:`tests/*.test.ts` 中 `suite()` / `test()` 声明。共 **24 个测试文件、179 条用例**。 ## 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 | 全缺失安全范围 | ## 17. jsp-extractor.test.ts — JspExtractor Tests(9) | # | 用例 | 覆盖点 | |---|---|---| | 117 | extracts script block as javascript | script 块提取 | | 118 | extracts style block as css | style 块提取 | | 119 | extracts statement scriptlet with line offset | 语句型 scriptlet | | 120 | extracts declaration scriptlet | 声明型 scriptlet | | 121 | extracts expression scriptlet | 表达式型 scriptlet | | 122 | skips directives and comments | 指令/注释跳过 | | 123 | reports sourceStart/sourceEnd positions | 源区间定位 | | 124 | returns empty array for plain html | 纯 HTML 无段落 | | 125 | collects script, style and scriptlet sections | 多段落收集 | ## 18. report.test.ts — Report Tests(7) | # | 用例 | 覆盖点 | |---|---|---| | 126 | renders header metadata | 报告头元数据 | | 127 | renders empty report with no-problems banner | 空报告无问题提示 | | 128 | renders linter diagnostics with severity emoji and suggestion | 严重级 emoji 与建议 | | 129 | renders custom rule diagnostics | 自定义规则段 | | 130 | renders ai findings with category and suggestion | AI 发现段 | | 131 | renders degraded banner and errors section | 降级横幅与错误区 | | 132 | omits tools line when no adapters | 无工具时不显示 | ## 19. method-extractor.test.ts — MethodExtractor Tests(9) | # | 用例 | 覆盖点 | |---|---|---| | 133 | fallback regex finds js function declarations and arrow functions | JS 方法兜底正则 | | 134 | fallback regex finds java methods | Java 方法兜底正则 | | 135 | fallback regex returns empty for unsupported language | 不支持语言返回空 | | 136 | extractMethodScope returns code, signature and callers | 方法作用域+调用者 | | 137 | extractMethodScope identifies callees | 被调用者识别 | | 138 | expandToMethodBody ignores braces inside strings and comments | 括号配对(跳过字符串/注释) | | 139 | extractSignature strips leading comments | 签名去注释 | | 140 | inferRole maps getter, process and generic names | 角色推断 | | 141 | extractMethodScope returns null when range matches no method | 无命中返回 null | ## 20. fix-prompt.test.ts — FixPrompt Tests(10) | # | 用例 | 覆盖点 | |---|---|---| | 142 | buildFixSystemPrompt defaults to Chinese | 中文系统提示词 | | 143 | buildFixSystemPrompt returns English variant | 英文系统提示词 | | 144 | buildFixSystemPrompt returns Japanese variant | 日文系统提示词 | | 145 | buildFixUserPrompt includes issue, message and context | 用户提示词组装 | | 146 | buildFixUserPrompt includes suggestion when present | 建议追加 | | 147 | buildFixUserPrompt omits suggestion when blank | 空建议省略 | | 148 | buildFixContext windows around line with padding | 上下文窗口+对齐 | | 149 | buildFixContext clamps at document boundaries | 边界钳制 | | 150 | buildVerifySystemPrompt has language variants | 校验系统提示词 | | 151 | buildVerifyUserPrompt includes issue and code | 校验用户提示词 | ## 21. registry.test.ts — Provider Registry Tests(7) | # | 用例 | 覆盖点 | |---|---|---| | 152 | returns empty when no extension uri | 无 URI 返回空 | | 153 | loads builtin providers from extension providers.json | 内置 Provider 加载 | | 154 | caches providers across calls | 注册表缓存 | | 155 | invalidateProviderCache forces reload | 缓存失效 | | 156 | returns empty for missing or invalid providers.json | 缺失/非法文件 | | 157 | getProviderById finds or misses | 按 ID 查询 | | 158 | getAllProviderMeta returns name and models | Provider 元数据 | ## 22. provider-chat.test.ts — Provider Chat Tests(11) | # | 用例 | 覆盖点 | |---|---|---| | 159 | openai chat returns content with bearer auth | OpenAI 兼容协议成功 | | 160 | openai 401 throws invalid key error | 401 无效密钥 | | 161 | openai truncation raises EmptyContentError | token 截断空响应 | | 162 | openai empty content raises EmptyContentError | 空内容错误 | | 163 | openai other status throws | 其他状态报错 | | 164 | gemini chat returns text | Gemini 协议成功 | | 165 | gemini empty content raises EmptyContentError | Gemini 空响应 | | 166 | gemini non-ok throws | Gemini 报错 | | 167 | claude chat returns text with api key header | Claude 协议成功 | | 168 | claude 401 throws | Claude 401 | | 169 | claude empty content raises EmptyContentError | Claude 空响应 | ## 23. import-service.test.ts — ImportService Tests(7) | # | 用例 | 覆盖点 | |---|---|---| | 170 | parseImportableYaml handles arrays and quoted ids | YAML 数组/引号 | | 171 | parseImportableYaml fills message from description and vice versa | 字段互填 | | 172 | buildFinalYaml uses edited rules when present | 编辑规则分支 | | 173 | buildFinalYaml comments exact duplicates and strips duplicate metadata | 精确重复注释 | | 174 | buildFinalYaml keeps all when no overrides | 无覆盖全保留 | | 175 | applyConversion writes final yaml to nested target path | 写入目标文件 | | 176 | convert throws for unsupported extension | 不支持格式报错 | ## 24. yaml-parser.test.ts — YamlParser Tests(3) | # | 用例 | 覆盖点 | |---|---|---| | 177 | returns empty when rules dir missing | 目录缺失 | | 178 | loads rules from yaml files with severity normalization | 规则加载与严重级归一 | | 179 | skips incomplete rules and non-yaml files | 不完整规则/非 yaml 跳过 | ## 统计 | 文件 | 用例数 | |---|---| | 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 | | jsp-extractor.test.ts | 9 | | report.test.ts | 7 | | method-extractor.test.ts | 9 | | fix-prompt.test.ts | 10 | | registry.test.ts | 7 | | provider-chat.test.ts | 11 | | import-service.test.ts | 7 | | yaml-parser.test.ts | 3 | | **合计** | **179** |