修复 PR375 的 Rust 契约与资源预览测试

补齐 Direct 回合事件新增字段的测试构造

将 JSON 资源恢复为文档预览分支

按当前工具条动作组逻辑更新分隔线回归测试
This commit is contained in:
2026-09-16 05:34:37 +08:00
parent 6ad3adbbfe
commit c2a5a655e6
3 changed files with 15 additions and 32 deletions
@@ -5721,6 +5721,8 @@ mod tests {
activity: None,
accumulated_text: Some("partial".to_string()),
tool_calls: None,
reasoning_text: None,
stream_items: None,
updated_at: 42,
})
.expect("serialize direct update");
@@ -218,11 +218,11 @@ const markdownExtension = /\.(md|markdown|mdx)$/iu;
*
* 与 `resourceProjectionModel` 的 `gameCodeExtension` 是两份口径,刻意不复用:
* 那份用于**筛选与归属**,改动会波及画布栏目与计数;这份只决定**卡面怎么画**。
* 这里按用户口径把 `.json` / `.yaml` / `.toml` / `.xml` / `.html` / `.css` / `.sql`
* 一并算代码 —— 它们在上游被登记成「文档」,但卡面当代码画更干净
* 这里按用户口径把 `.yaml` / `.toml` / `.xml` / `.html` / `.css` / `.sql`
* 一并算代码JSON 规格属于文档预览
*/
const cardCodeExtension =
/\.(ts|tsx|mts|cts|js|jsx|mjs|cjs|rs|py|go|java|kt|kts|cs|cpp|cc|cxx|c|h|hpp|swift|php|rb|lua|sh|bash|zsh|ps1|psm1|json|jsonc|ya?ml|toml|xml|html?|css|scss|less|sql|graphql|gql|vue|svelte)$/iu;
/\.(ts|tsx|mts|cts|js|jsx|mjs|cjs|rs|py|go|java|kt|kts|cs|cpp|cc|cxx|c|h|hpp|swift|php|rb|lua|sh|bash|zsh|ps1|psm1|ya?ml|toml|xml|html?|css|scss|less|sql|graphql|gql|vue|svelte)$/iu;
/** 纯文本:按纯文本处理,显示前几行但不做标记清理。 */
const plainTextExtension =
/\.(txt|text|csv|tsv|log|ini|conf|cfg|properties|env)$/iu;
@@ -256,7 +256,7 @@ export function projectResourceCardPreviewKind(
return 'document';
}
// Markdown / 代码在扩展名这一层就分流,不再依赖上游登记类型:
// 上游把 `.json` / `.tsx` 这类文件登记成「文档」,卡面却该按代码画
// 上游把 JSON 规格登记成「文档」,卡面按文档预览;代码文件按扩展名分流
if (markdownExtension.test(resource.path)) {
return 'document';
}
@@ -3,21 +3,17 @@ import { readFileSync } from 'node:fs';
import { describe, expect, it } from 'vitest';
/**
* 选中资源工具条上的「两条分隔线回归钉子。
* 选中资源工具条上的分隔线分组回归钉子。
*
* 成因:共享工具条 `ImageCanvasSelectedLayerToolbarView.tsx` 会在 `showQuickEdit` 时于
* 「快速编辑」之后输出一条分隔线,同时为 `extraActions` 自动生成一条前置分隔线
* `const extraActionDivider = extraActions ? … : null`)。AGC 资源卡是"快速编辑可用 +
* 中间那些动作未接通不渲染"的组合,两条于是直接相邻,用户看到两条竖线。
*
* 修法是样式层去重(相邻的两条只显示一条)。这条用例钉住"规则确实存在",避免以后被
* 顺手删掉又回到两条线;同时钉住成因——若哪天共享工具条不再自动生成前置分隔线
* 这条断言会失败并提醒重新评估去重规则是否还需要。
* 当前实现直接按动作组是否存在输出分隔线,避免相邻分隔线产生。这条用例钉住当前
* 条件分组,避免后续重构时再次出现空动作组之间的重复分隔线
*/
describe('选中资源工具条的分隔线去重', () => {
const repoRootCss = () =>
readFileSync(new URL('../../../src/index.css', import.meta.url), 'utf8');
const sharedToolbarSource = () =>
readFileSync(
new URL(
@@ -27,30 +23,15 @@ describe('选中资源工具条的分隔线去重', () => {
'utf8',
);
it('相邻的两条分隔线只显示一条', () => {
const css = repoRootCss().replace(/\s+/g, ' ');
expect(css).toContain(
'.image-canvas-editor__floating-toolbar-divider + .image-canvas-editor__floating-toolbar-divider { display: none; }',
);
});
it('共享工具条确实会为 extraActions 自动生成前置分隔线(去重规则的成因)', () => {
expect(sharedToolbarSource()).toContain(
'const extraActionDivider = extraActions ?',
);
});
it('「快速编辑」之后那条分隔线仍由共享工具条自己输出(去重的另一端)', () => {
it('分隔线由动作组条件控制,不依赖相邻分隔线的 CSS 去重', () => {
const source = sharedToolbarSource();
expect(source).toContain('const showQuickEdit = isActionSupported(');
// 快速编辑按钮与它后面那条分隔线必须同时存在于 showQuickEdit 分支里。
const quickEditBlock = source.slice(
source.indexOf('{showQuickEdit ? ('),
source.indexOf('{canRasterEdit && isActionSupported('),
expect(source).toContain('const hasEditingActions =');
expect(source).toContain(
'{showQuickEdit && hasEditingActions ? divider : null}',
);
expect(quickEditBlock).toContain('label="快速编辑"');
expect(quickEditBlock).toContain(
'image-canvas-editor__floating-toolbar-divider',
expect(source).toContain(
'{(showQuickEdit || hasEditingActions || canRedraw || hasExtraActions) &&',
);
});
});