拆分编辑器高级生成提交模型
抽出图标素材生成校验和请求参数组装 抽出角色动画生成请求参数组装 补充高级生成提交模型单测 更新 TRACKING.md 记录第三十八阶段验证
This commit is contained in:
@@ -1,7 +1,11 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import type { CanvasLayer } from './ImageCanvasEditorTypes';
|
||||
import { buildImageGenerationSubmissionPlan } from './ImageCanvasGenerationSubmissionModel';
|
||||
import {
|
||||
buildCharacterAnimationSubmissionPlan,
|
||||
buildIconSpritesheetGenerationSubmissionPlan,
|
||||
buildImageGenerationSubmissionPlan,
|
||||
} from './ImageCanvasGenerationSubmissionModel';
|
||||
|
||||
function createLayer(overrides: Partial<CanvasLayer> = {}): CanvasLayer {
|
||||
return {
|
||||
@@ -209,4 +213,121 @@ describe('ImageCanvasGenerationSubmissionModel', () => {
|
||||
}),
|
||||
).toThrow('未找到要修改的图片');
|
||||
});
|
||||
|
||||
it('returns an icon spritesheet error when the spec reference is missing', () => {
|
||||
const plan = buildIconSpritesheetGenerationSubmissionPlan({
|
||||
mode: 'icon',
|
||||
prompt: '',
|
||||
status: 'idle',
|
||||
iconDescriptions: ['返回按钮'],
|
||||
});
|
||||
|
||||
expect(plan).toEqual({
|
||||
ok: false,
|
||||
errorMessage: '请选择图标素材规范',
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an icon spritesheet error when descriptions are empty', () => {
|
||||
const plan = buildIconSpritesheetGenerationSubmissionPlan({
|
||||
mode: 'icon',
|
||||
prompt: '',
|
||||
status: 'idle',
|
||||
iconSpecReference: {
|
||||
id: 'icon-spec',
|
||||
label: '图标规范',
|
||||
src: 'data:image/png;base64,spec',
|
||||
},
|
||||
iconDescriptions: [' ', '\n'],
|
||||
});
|
||||
|
||||
expect(plan).toEqual({
|
||||
ok: false,
|
||||
errorMessage: '请填写素材描述',
|
||||
});
|
||||
});
|
||||
|
||||
it('builds icon spritesheet plans with trimmed descriptions and references', () => {
|
||||
const plan = buildIconSpritesheetGenerationSubmissionPlan({
|
||||
mode: 'icon',
|
||||
prompt: '',
|
||||
status: 'idle',
|
||||
imageModel: 'gpt-image-2',
|
||||
aspectRatio: '3:2',
|
||||
imageSize: '2K',
|
||||
iconSpecReference: {
|
||||
id: 'icon-spec',
|
||||
label: '图标规范',
|
||||
src: 'data:image/png;base64,spec',
|
||||
},
|
||||
iconDescriptions: [' 返回按钮 ', '', '设置按钮'],
|
||||
});
|
||||
|
||||
expect(plan).toEqual({
|
||||
ok: true,
|
||||
iconDescriptions: ['返回按钮', '设置按钮'],
|
||||
input: {
|
||||
referenceImageSrc: 'data:image/png;base64,spec',
|
||||
iconDescriptions: ['返回按钮', '设置按钮'],
|
||||
model: 'gpt-image-2',
|
||||
aspectRatio: '3:2',
|
||||
imageSize: '2K',
|
||||
},
|
||||
generationInputs: {
|
||||
fields: [
|
||||
{ title: '素材描述 1', value: '返回按钮' },
|
||||
{ title: '素材描述 2', value: '设置按钮' },
|
||||
],
|
||||
references: [
|
||||
{
|
||||
title: '图标素材规范',
|
||||
label: '图标规范',
|
||||
src: 'data:image/png;base64,spec',
|
||||
},
|
||||
],
|
||||
},
|
||||
rememberImageModel: 'gpt-image-2',
|
||||
});
|
||||
});
|
||||
|
||||
it('builds character animation plans with trimmed prompt and object key source', () => {
|
||||
const sourceLayer = createLayer({
|
||||
id: 'character-layer',
|
||||
title: '角色图',
|
||||
objectKey: 'generated/character.png',
|
||||
assetKind: 'character',
|
||||
originalWidth: 960,
|
||||
originalHeight: 1280,
|
||||
});
|
||||
|
||||
const plan = buildCharacterAnimationSubmissionPlan({
|
||||
panel: {
|
||||
sourceLayerId: 'character-layer',
|
||||
promptText: ' 循环奔跑动作 ',
|
||||
resolution: '720p',
|
||||
ratio: 'same',
|
||||
frameCount: 48,
|
||||
durationSeconds: 6,
|
||||
status: 'idle',
|
||||
},
|
||||
sourceLayer,
|
||||
});
|
||||
|
||||
expect(plan).toEqual({
|
||||
promptText: '循环奔跑动作',
|
||||
input: {
|
||||
sourceLayerId: 'character-layer',
|
||||
sourceImageSrc: 'generated/character.png',
|
||||
sourceWidth: 960,
|
||||
sourceHeight: 1280,
|
||||
promptText: '循环奔跑动作',
|
||||
resolution: '720p',
|
||||
ratio: 'same',
|
||||
frameCount: 48,
|
||||
durationSeconds: 6,
|
||||
priceMudPoints: 120,
|
||||
model: 'seedance2.0',
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user