import { describe, expect, it } from "vitest"; import { isCrossEngineRasterEquivalent, type PdfRasterMetrics, } from "../src/index.js"; function metrics( overrides: Partial = {}, ): PdfRasterMetrics { return { baselineWidthPx: 224, baselineHeightPx: 37, candidateWidthPx: 224, candidateHeightPx: 37, comparedWidthPx: 224, comparedHeightPx: 37, dimensionsMatch: true, geometryNormalized: true, spatialTolerancePx: 4, meanAbsoluteError: 14.5, changedPixelRatio: 0.27, inkIou: 0.942, edgeIou: 1, backgroundColorDelta: 0.02, foregroundColorDelta: 0, ...overrides, }; } describe("跨引擎字形栅格等价", () => { it("接受轮廓、颜色和几何一致的灰阶抗锯齿差异", () => { expect(isCrossEngineRasterEquivalent(metrics(), false)).toBe(true); expect( isCrossEngineRasterEquivalent( metrics({ candidateWidthPx: 222, inkIou: 0.88, foregroundColorDelta: 3.5, }), false, ), ).toBe(true); expect( isCrossEngineRasterEquivalent( metrics({ inkIou: 1, edgeIou: 0.946 }), false, "table-header", ), ).toBe(true); expect( isCrossEngineRasterEquivalent( metrics({ inkIou: 0.969, edgeIou: 0.983 }), false, "code-block", ), ).toBe(true); expect( isCrossEngineRasterEquivalent( metrics({ baselineWidthPx: 38, candidateWidthPx: 38, comparedWidthPx: 38, inkIou: 0.902, edgeIou: 0.904, }), false, "code-block", ), ).toBe(true); expect( isCrossEngineRasterEquivalent( metrics({ baselineWidthPx: 236, candidateWidthPx: 233, baselineHeightPx: 36, candidateHeightPx: 38, inkIou: 0.897, edgeIou: 0.9996, }), false, "paragraph", ), ).toBe(true); expect( isCrossEngineRasterEquivalent( metrics({ baselineWidthPx: 272, candidateWidthPx: 286, baselineHeightPx: 43, candidateHeightPx: 42, inkIou: 0.948, edgeIou: 0.958, foregroundColorDelta: 4.2, }), false, "list-item", ), ).toBe(true); expect( isCrossEngineRasterEquivalent( metrics({ candidateWidthPx: 209, inkIou: 0.974, edgeIou: 0.984, }), false, ), ).toBe(true); expect( isCrossEngineRasterEquivalent( metrics({ candidateWidthPx: 208, inkIou: 0.91, edgeIou: 0.94, }), false, "list-item", ), ).toBe(true); }); it("拒绝回流、颜色、几何或轮廓变化", () => { expect(isCrossEngineRasterEquivalent(metrics(), true)).toBe(false); expect( isCrossEngineRasterEquivalent( metrics({ foregroundColorDelta: 4.01 }), false, ), ).toBe(false); expect( isCrossEngineRasterEquivalent( metrics({ candidateWidthPx: 220 }), false, ), ).toBe(false); expect( isCrossEngineRasterEquivalent( metrics({ candidateWidthPx: 207, inkIou: 0.91, edgeIou: 0.94, }), false, "list-item", ), ).toBe(false); expect( isCrossEngineRasterEquivalent( metrics({ candidateWidthPx: 208, inkIou: 0.974, edgeIou: 0.984, }), false, ), ).toBe(false); expect( isCrossEngineRasterEquivalent( metrics({ candidateWidthPx: 209, inkIou: 0.91, edgeIou: 0.94, }), false, "paragraph", ), ).toBe(false); expect( isCrossEngineRasterEquivalent(metrics({ edgeIou: 0.96 }), false), ).toBe(false); expect( isCrossEngineRasterEquivalent( metrics({ baselineWidthPx: 38, candidateWidthPx: 38, comparedWidthPx: 38, inkIou: 0.89, edgeIou: 0.904, }), false, "code-block", ), ).toBe(false); expect( isCrossEngineRasterEquivalent( metrics({ baselineHeightPx: 37, candidateHeightPx: 40, inkIou: 0.95, edgeIou: 1, }), false, "paragraph", ), ).toBe(false); }); });