Files
NianAIGC/tests/image-size-presets.test.ts
2026-09-11 15:33:18 +08:00

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" });
}
});
});