diff --git a/apps/ai-game-creator-shell/tests/resourceReferences.test.ts b/apps/ai-game-creator-shell/tests/resourceReferences.test.ts new file mode 100644 index 000000000..ebcdf8794 --- /dev/null +++ b/apps/ai-game-creator-shell/tests/resourceReferences.test.ts @@ -0,0 +1,71 @@ +import { describe, expect, it } from 'vitest'; + +import { + type ChatComposerDraft, + chatComposerDraftToDirectCodexUserItem, +} from '../src/features/project-workspace/resourceReferences'; + +describe('DirectProject user Response item', () => { + it('保留 Lexical content 的文本与引用交错顺序', () => { + const draft: ChatComposerDraft = { + text: '忽略的扁平摘要', + references: [], + content: [ + { type: 'input_text', text: '先看 ' }, + { type: 'agc_resource_reference', resourceId: 'asset-hero' }, + { type: 'input_text', text: ' 再看 ' }, + { + type: 'agc_runtime_region_reference', + label: '主画面', + runId: 'run-1', + versionId: 'version-1', + elementTag: 'canvas', + elementRole: 'playfield', + text: '可试玩区域', + width: 320, + height: 180, + resourceIds: ['asset-hero'], + }, + ], + }; + + expect( + chatComposerDraftToDirectCodexUserItem(draft, 'turn-1:user'), + ).toEqual({ + type: 'message', + role: 'user', + id: 'turn-1:user', + content: draft.content, + }); + }); + + it('资源引用只投影稳定 resourceId,不携带展示字段', () => { + const draft: ChatComposerDraft = { + text: '请使用素材', + references: [ + { + type: 'resource', + resourceId: 'asset-hero', + kind: 'character', + mediaType: 'image/png', + label: '主角', + category: 'character', + tags: ['hero'], + source: 'asset-picker', + }, + ], + }; + + expect( + chatComposerDraftToDirectCodexUserItem(draft, 'turn-2:user'), + ).toEqual({ + type: 'message', + role: 'user', + id: 'turn-2:user', + content: [ + { type: 'input_text', text: '请使用素材' }, + { type: 'agc_resource_reference', resourceId: 'asset-hero' }, + ], + }); + }); +});