import { expect, test, type Page } from "playwright/test"; import { crcBadAncillaryPng, crcBadIdatPng, garbageTailPng, idatCutPng, palette4Png, palette256Png, sixteenBitPng, truncatedHeaderPng, truncatedNoIendPng, type SourceFile, } from "./helpers/fixtures"; import { errorAlert, expectNoErrorAlert, expectNoErrors, openTool, resultImage, trackErrors, uploadImage, } from "./helpers/page"; async function expectRejected(page: Page, file: SourceFile): Promise { const sink = trackErrors(page); await openTool(page, "flip-png"); await uploadImage(page, file); await expect(errorAlert(page)).toBeVisible(); await expect(resultImage(page)).toHaveCount(0); expectNoErrors(sink); } async function expectAccepted(page: Page, file: SourceFile): Promise { const sink = trackErrors(page); await openTool(page, "flip-png"); await uploadImage(page, file); await expect(resultImage(page)).toBeVisible(); await expectNoErrorAlert(page); expectNoErrors(sink); } type DecodeContract = { file: SourceFile; rejectedIn: readonly string[]; }; const decodeContracts: readonly DecodeContract[] = [ { file: crcBadIdatPng, rejectedIn: ["chromium", "firefox"] }, { file: truncatedHeaderPng, rejectedIn: ["chromium", "firefox", "webkit"] }, { file: truncatedNoIendPng, rejectedIn: ["chromium"] }, { file: idatCutPng, rejectedIn: ["chromium"] }, { file: crcBadAncillaryPng, rejectedIn: [] }, { file: garbageTailPng, rejectedIn: [] }, { file: palette4Png, rejectedIn: [] }, { file: palette256Png, rejectedIn: [] }, { file: sixteenBitPng, rejectedIn: [] }, ]; test.describe("PNG special fixtures", () => { for (const { file, rejectedIn } of decodeContracts) { test(`${file.name}: matches the engine decode contract`, async ({ browserName, page, }) => { if (rejectedIn.includes(browserName)) { await expectRejected(page, file); } else { await expectAccepted(page, file); } }); } });