import { describe, expect, it } from "vitest"; import { buildSeedreamInteractivePrompt, buildSeedreamLayerPrompt, missingSeedreamAnnotationTokens, seedreamAnnotationReferences, type SeedreamAnnotation } from "@/lib/seedream/creation"; const annotations: SeedreamAnnotation[] = [ { id: "box", index: 1, kind: "box", box: { left: 100, top: 200, right: 700, bottom: 800 } }, { id: "point", index: 3, kind: "point", point: { x: 456, y: 321 } } ]; describe("Seedream interactive prompt", () => { it("offers existing canvas annotations as @ input references", () => { expect(seedreamAnnotationReferences([ ...annotations, { id: "mark", index: 4, kind: "stroke", points: [{ x: 1, y: 1 }, { x: 2, y: 2 }] } ], "标")).toEqual([ { token: "@标注1", label: "框选区域 1", caption: "画布标注" }, { token: "@标注3", label: "点选位置 3", caption: "画布标注" }, { token: "@标记4", label: "蓝色标记 4", caption: "画布标注" } ]); }); it("replaces visible annotation tokens with normalized provider tags", () => { expect(buildSeedreamInteractivePrompt("把 @标注1 改成蓝色", annotations)).toBe( "把 图1100 200 700 800 改成蓝色\n编辑位置:标注3 图1456 321。" ); }); it("supports cross-image coordinates and visible mark references", () => { const crossImageAnnotations: SeedreamAnnotation[] = [ { id: "subject", index: 1, kind: "box", sourceKey: "image-a", box: { left: 50, top: 60, right: 400, bottom: 500 } }, { id: "target", index: 2, kind: "point", sourceKey: "image-b", point: { x: 720, y: 310 } }, { id: "mark", index: 4, kind: "stroke", sourceKey: "image-b", points: [{ x: 500, y: 500 }, { x: 650, y: 610 }] } ]; expect(buildSeedreamInteractivePrompt("把 @标注1 移到 @标注2,并清除 @标记4", crossImageAnnotations, ["image-a", "image-b"])).toBe( "把 图150 60 400 500 移到 图2720 310,并清除 图2中的蓝色标记区域" ); }); it("detects references to annotations that were removed", () => { expect(missingSeedreamAnnotationTokens("修改 @标注3 和 @标注2", annotations)).toEqual(["@标注2"]); }); }); describe("Seedream layer prompt", () => { it("supports optional region instructions for layer decomposition", () => { expect(buildSeedreamLayerPrompt("拆出 @标注1 内的标题", annotations)).toBe( "拆出 100 200 700 800 内的标题\n需拆分区域:456 321。" ); }); it("can describe a blue mark when the prompt is left empty", () => { const marks: SeedreamAnnotation[] = [ { id: "mark", index: 1, kind: "stroke", points: [{ x: 100, y: 100 }, { x: 200, y: 250 }] } ]; expect(buildSeedreamLayerPrompt("", marks)).toBe("需拆分区域:图片中的蓝色标记区域。"); }); });