From 313cfab6316c2d8226c49c9272153bed919c6cd6 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Sun, 6 Sep 2026 06:00:59 +0200 Subject: [PATCH] test: close offline font diagnostic review gaps --- tests/e2e/fixtures/offline-font-diagnostic.ts | 5 ++ .../e2e/fixtures/offline-font-markers.test.ts | 31 ++++++++++- tests/e2e/fixtures/offline-font-markers.ts | 19 +++++++ tests/e2e/specs/offline-fonts.spec.ts | 54 +++++++++++-------- 4 files changed, 86 insertions(+), 23 deletions(-) create mode 100644 tests/e2e/fixtures/offline-font-diagnostic.ts diff --git a/tests/e2e/fixtures/offline-font-diagnostic.ts b/tests/e2e/fixtures/offline-font-diagnostic.ts new file mode 100644 index 000000000..04a94f711 --- /dev/null +++ b/tests/e2e/fixtures/offline-font-diagnostic.ts @@ -0,0 +1,5 @@ +export function assertPdfDownloadReceived(downloadStatus: string): asserts downloadStatus is "received" { + if (downloadStatus !== "received") { + throw new Error(`PDF download diagnostic did not receive a download: ${downloadStatus}`); + } +} diff --git a/tests/e2e/fixtures/offline-font-markers.test.ts b/tests/e2e/fixtures/offline-font-markers.test.ts index 3a0462dd5..c10611337 100644 --- a/tests/e2e/fixtures/offline-font-markers.test.ts +++ b/tests/e2e/fixtures/offline-font-markers.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest"; -import { classifyRasterInk, locatePdfMarkerBoxes } from "./offline-font-markers"; +import { assertPdfDownloadReceived } from "./offline-font-diagnostic"; +import { classifyRasterInk, classifyRasterMeasurements, locatePdfMarkerBoxes } from "./offline-font-markers"; const marker = { name: "cjk", marker: "简体中文" } as const; @@ -41,4 +42,32 @@ describe("classifyRasterInk", () => { "tofu-like", ); }); + + it("classifies raw browser measurements through shared raster classifier", () => { + expect( + classifyRasterMeasurements([ + { name: "blank", located: true, inkPixels: 0, interiorInk: 0, trimmedWidth: 0, trimmedHeight: 0 }, + { name: "tofu", located: true, inkPixels: 100, interiorInk: 0, trimmedWidth: 20, trimmedHeight: 20 }, + { name: "visible", located: true, inkPixels: 100, interiorInk: 20, trimmedWidth: 20, trimmedHeight: 20 }, + { name: "missing", located: false, inkPixels: 0, interiorInk: 0, trimmedWidth: 0, trimmedHeight: 0 }, + ]), + ).toEqual([ + { name: "blank", status: "blank", inkPixels: 0, trimmedWidth: 0, trimmedHeight: 0 }, + { name: "tofu", status: "tofu-like", inkPixels: 100, trimmedWidth: 20, trimmedHeight: 20 }, + { name: "visible", status: "visible", inkPixels: 100, trimmedWidth: 20, trimmedHeight: 20 }, + { name: "missing", status: "not-located", inkPixels: 0, trimmedWidth: 0, trimmedHeight: 0 }, + ]); + }); +}); + +describe("assertPdfDownloadReceived", () => { + it("fails diagnostic when browser PDF download errors", () => { + expect(() => assertPdfDownloadReceived("download-error")).toThrow( + "PDF download diagnostic did not receive a download", + ); + }); + + it("accepts received browser PDF download", () => { + expect(() => assertPdfDownloadReceived("received")).not.toThrow(); + }); }); diff --git a/tests/e2e/fixtures/offline-font-markers.ts b/tests/e2e/fixtures/offline-font-markers.ts index a1d6037e4..0a956e89f 100644 --- a/tests/e2e/fixtures/offline-font-markers.ts +++ b/tests/e2e/fixtures/offline-font-markers.ts @@ -31,6 +31,16 @@ export type RasterInkMeasurements = { export type RasterGlyphStatus = "visible" | "blank" | "tofu-like"; +export type RasterGlyphMeasurement = RasterInkMeasurements & { + name: TName; + located: boolean; +}; + +export type RasterGlyphEvidence = Omit & { + name: TName; + status: RasterGlyphStatus | "not-located"; +}; + type TextItemRange = PdfTextItem & { start: number; end: number; @@ -112,3 +122,12 @@ export const classifyRasterInk = ({ const interiorRatio = interiorInk / Math.max(inkPixels, 1); return interiorRatio < 0.08 && trimmedWidth >= 8 && trimmedHeight >= 8 ? "tofu-like" : "visible"; }; + +export const classifyRasterMeasurements = ( + measurements: readonly RasterGlyphMeasurement[], +): RasterGlyphEvidence[] => + measurements.map(({ name, located, interiorInk, ...measurements }) => ({ + ...measurements, + name, + status: located ? classifyRasterInk({ ...measurements, interiorInk }) : "not-located", + })); diff --git a/tests/e2e/specs/offline-fonts.spec.ts b/tests/e2e/specs/offline-fonts.spec.ts index faec317e5..b92661207 100644 --- a/tests/e2e/specs/offline-fonts.spec.ts +++ b/tests/e2e/specs/offline-fonts.spec.ts @@ -1,8 +1,13 @@ import type { Browser, BrowserContext, Page, TestInfo } from "@playwright/test"; +import type { + RasterGlyphEvidence as MarkerRasterGlyphEvidence, + RasterGlyphMeasurement as MarkerRasterGlyphMeasurement, +} from "../fixtures/offline-font-markers"; import { readFile, writeFile } from "node:fs/promises"; import { createRequire } from "node:module"; import { getDocument } from "pdfjs-dist/legacy/build/pdf.mjs"; -import { locatePdfMarkerBoxes } from "../fixtures/offline-font-markers"; +import { assertPdfDownloadReceived } from "../fixtures/offline-font-diagnostic"; +import { classifyRasterMeasurements, locatePdfMarkerBoxes } from "../fixtures/offline-font-markers"; import { offlineFontScriptSamples, seedOfflineFontResume } from "../fixtures/offline-fonts"; import { createSampleResumeFromDashboard, openSidebarSection } from "../fixtures/resume"; import { expect, test } from "../fixtures/test"; @@ -22,13 +27,8 @@ type ColdContext = { type PdfMarkers = Record<(typeof offlineFontScriptSamples)[number]["name"], boolean>; -type RasterGlyphEvidence = { - name: (typeof offlineFontScriptSamples)[number]["name"]; - status: "visible" | "blank" | "tofu-like" | "not-located"; - inkPixels: number; - trimmedWidth: number; - trimmedHeight: number; -}; +type RasterGlyphEvidence = MarkerRasterGlyphEvidence<(typeof offlineFontScriptSamples)[number]["name"]>; +type RasterGlyphMeasurement = MarkerRasterGlyphMeasurement<(typeof offlineFontScriptSamples)[number]["name"]>; type PdfRasterEvidence = { rasterDataUrl: string; @@ -177,12 +177,20 @@ test.describe("offline font diagnostic", () => { background: "white", }).promise; - function measure(canvas: HTMLCanvasElement, scale: number): RasterGlyphEvidence[] { + function measure(canvas: HTMLCanvasElement, scale: number): RasterGlyphMeasurement[] { const context = canvas.getContext("2d"); if (!context) throw new Error("Missing PDF preview raster context."); const pixels = context.getImageData(0, 0, canvas.width, canvas.height); return boxes.map(({ name, box }) => { - if (!box) return { name, status: "not-located", inkPixels: 0, trimmedWidth: 0, trimmedHeight: 0 }; + if (!box) + return { + name, + located: false, + inkPixels: 0, + interiorInk: 0, + trimmedWidth: 0, + trimmedHeight: 0, + }; const markerLeft = box.x * scale; const markerTop = box.y * scale; const markerRight = (box.x + box.width) * scale; @@ -215,7 +223,7 @@ test.describe("offline font diagnostic", () => { } } if (inkPixels === 0) { - return { name, status: "blank", inkPixels, trimmedWidth: 0, trimmedHeight: 0 }; + return { name, located: true, inkPixels, interiorInk: 0, trimmedWidth: 0, trimmedHeight: 0 }; } let interiorInk = 0; for ( @@ -239,9 +247,7 @@ test.describe("offline font diagnostic", () => { } const trimmedWidth = maxX - minX + 1; const trimmedHeight = maxY - minY + 1; - const interiorRatio = interiorInk / Math.max(inkPixels, 1); - const status = interiorRatio < 0.08 && trimmedWidth >= 8 && trimmedHeight >= 8 ? "tofu-like" : "visible"; - return { name, status, inkPixels, trimmedWidth, trimmedHeight }; + return { name, located: true, inkPixels, interiorInk, trimmedWidth, trimmedHeight }; }); } @@ -257,7 +263,12 @@ test.describe("offline font diagnostic", () => { }, { bytes: Array.from(bytes), boxes }, ); - return { ...rasterEvidence, textLayerMarkers }; + return { + ...rasterEvidence, + referenceGlyphs: classifyRasterMeasurements(rasterEvidence.referenceGlyphs), + previewGlyphs: classifyRasterMeasurements(rasterEvidence.previewGlyphs), + textLayerMarkers, + }; } async function report(testInfo: TestInfo, name: string, reportData: Record) { @@ -383,13 +394,12 @@ test.describe("offline font diagnostic", () => { }); await cold.context.close(); } - if (downloadStatus === "received") { - expect(rasterEvidenceStatus).toBe("received"); - expect(rasterEvidence).not.toBeNull(); - if (!rasterEvidence) return; - expect(rasterEvidence.referenceGlyphs).toHaveLength(offlineFontScriptSamples.length); - expect(rasterEvidence.referenceGlyphs.every(({ status }) => status === "visible")).toBe(true); - } + assertPdfDownloadReceived(downloadStatus); + expect(rasterEvidenceStatus).toBe("received"); + expect(rasterEvidence).not.toBeNull(); + if (!rasterEvidence) return; + expect(rasterEvidence.referenceGlyphs).toHaveLength(offlineFontScriptSamples.length); + expect(rasterEvidence.referenceGlyphs.every(({ status }) => status === "visible")).toBe(true); }); test("exercises restarted-server PDF and records server observability boundary", async ({