43 lines
2.4 KiB
TypeScript
43 lines
2.4 KiB
TypeScript
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" });
|
|
}
|
|
});
|
|
});
|