import { expect, test } from "@playwright/test"; import { expectInfiniteCanvasObservation, expectToolcraftInfinityCanvasBackgroundEvidence, expectToolcraftInfinityCanvasVideoExportEvidence, observeInfinityCanvas, } from "./browser-infinity-canvas-evidence"; import { expectToolcraftInfinityCanvasSvgExportEvidence } from "./browser-infinity-canvas-svg-evidence"; import { createToolcraftSvgFixtureDownload } from "./svg-download-test-fixtures"; import { inspectToolcraftSvgDownload } from "./svg-artifact-inspection"; import { readToolcraftCanvasViewport, zoomToolcraftCanvasViewport, } from "./performance-canvas-helpers"; test("toolcraft Infinity canvas observation reads runtime-owned geometry", async ({ page, }) => { await page.setContent(`
`); expectInfiniteCanvasObservation( await observeInfinityCanvas(page), { height: 400, width: 640, x: -320, y: -200 }, ); }); test("toolcraft canvas viewport observation reads the runtime world transform", async ({ page, }) => { await page.setContent(`
`); await expect(readToolcraftCanvasViewport(page)).resolves.toEqual({ offsetX: 96, offsetY: -64, zoom: 125, }); }); test("toolcraft canvas zoom helper performs only the requested direction", async ({ page, }) => { await page.setContent(` `); await zoomToolcraftCanvasViewport(page, { direction: "in", repetitions: 2, }); await expect(page.locator("body")).toHaveAttribute("data-zoom-in", "2"); await expect(page.locator("body")).not.toHaveAttribute("data-zoom-out"); await zoomToolcraftCanvasViewport(page, { direction: "out" }); await expect(page.locator("body")).toHaveAttribute("data-zoom-out", "1"); }); test("toolcraft Infinity canvas video evidence compares decoded envelopes", async () => { await expectToolcraftInfinityCanvasVideoExportEvidence( { finite: { byteLength: 1024, durationMs: 1000, height: 1350, width: 1080, }, infinite: { byteLength: 768, durationMs: 1000, height: 640, width: 640, }, }, { expectedFiniteSize: { height: 1350, width: 1080 }, expectedInfiniteSize: { height: 640, width: 640 }, requirementId: "fixture.infinity.video", target: "canvas.infinity", }, ); }); test("toolcraft Infinity canvas SVG evidence compares inspected vector envelopes", async ({ page, }) => { const source = (width: number, height: number, x: number, y: number) => ``; const finite = await inspectToolcraftSvgDownload({ download: await createToolcraftSvgFixtureDownload( page, source(1080, 1350, 0, 0), "finite.svg", ), page, }); const infinite = await inspectToolcraftSvgDownload({ download: await createToolcraftSvgFixtureDownload( page, source(640, 400, -320, -200), "infinite.svg", ), page, }); await expectToolcraftInfinityCanvasSvgExportEvidence( { finite: finite.inspection, infinite: infinite.inspection, }, { expectedFiniteSize: { height: 1350, width: 1080 }, expectedInfiniteSize: { height: 400, width: 640 }, requirementId: "fixture.infinity.svg", target: "canvas.infinity", }, ); }); test("toolcraft Infinity canvas background evidence proves viewport color and dependency", async () => { await expectToolcraftInfinityCanvasBackgroundEvidence( { backgroundExcluded: { backgroundEnabled: false, canvasMode: "finite", infinityDisabled: true, runtimeBackgroundColor: null, viewportBackgroundColor: "rgb(20, 20, 20)", viewportMatchesRuntimeColor: false, }, backgroundRestored: { backgroundEnabled: true, canvasMode: "finite", infinityDisabled: false, runtimeBackgroundColor: null, viewportBackgroundColor: "rgb(20, 20, 20)", viewportMatchesRuntimeColor: false, }, infinite: { backgroundEnabled: true, canvasMode: "infinite", infinityDisabled: false, runtimeBackgroundColor: "#D4CECA", viewportBackgroundColor: "rgb(212, 206, 202)", viewportMatchesRuntimeColor: true, }, }, { expectedBackgroundColor: "#D4CECA", requirementId: "fixture.background", target: "export.includeBackground", }, ); });