import { describe, expect, it } from "vitest"; import { imageDimensionsForEngine, imageSizePresets, imageSizePresetFromDimensions } from "@/lib/image-size-presets"; import { buildEvolinkImagePayload } from "@/lib/evolink/image-client"; import { validateBailianImageSize } from "@/lib/bailian/client"; describe("A4 generation presets", () => { it("retains the five existing presets unchanged", () => { expect(imageSizePresets.slice(0, 5)).toEqual([ { label: "1:1", width: 2048, height: 2048 }, { label: "4:3", width: 2304, height: 1728 }, { label: "3:4", width: 1728, height: 2304 }, { label: "16:9", width: 2560, height: 1440 }, { label: "9:16", width: 1440, height: 2560 } ]); }); it.each(imageSizePresets.filter((size) => size.paper === "a4"))("round trips $label through template dimensions for every regular engine", (size) => { expect(Math.min(size.width, size.height) / Math.max(size.width, size.height)).toBeCloseTo(210 / 297, 8); for (const engine of ["jimeng", "bailian", "evolink"]) { const dimensions = imageDimensionsForEngine(size, engine); expect(imageSizePresetFromDimensions(dimensions.width, dimensions.height)).toEqual(size); if (engine === "bailian") { expect(() => validateBailianImageSize(dimensions.width, dimensions.height, true)).not.toThrow(); } } }); it.each(imageSizePresets.filter((size) => size.paper === "a4"))("keeps $label on EvoLink's 1K budget rather than sending 4MP custom pixels", (size) => { const dimensions = imageDimensionsForEngine(size, "evolink"); expect(dimensions.width % 16).toBe(0); expect(dimensions.height % 16).toBe(0); expect(dimensions.width * dimensions.height).toBeGreaterThanOrEqual(655360); expect(dimensions.width * dimensions.height).toBeLessThanOrEqual(1024 ** 2); expect(Math.min(dimensions.width, dimensions.height) / Math.max(dimensions.width, dimensions.height)).toBeCloseTo(210 / 297, 3); // Both a new frontend payload and an older template's canonical dimensions // are adapted before sending to the upstream. for (const input of [size, dimensions]) { const payload = buildEvolinkImagePayload("image.generate", { prompt: "A4 行程单", ...input }, { baseUrl: "https://api.evolink.ai", model: "gpt-image-2" }); expect(payload).toMatchObject({ size: `${dimensions.width}x${dimensions.height}`, resolution: "1K" }); } }); });