Files
hyperframes/packages/engine/src/services/drawElementService.test.ts
T
Vance IngallsandClaude Fable 5 795934adba feat(engine): drawElementImage capture service (#1917)
* feat(engine): drawElementImage capture service

* chore(ci): ignore drawElementService exports pending upstack consumers

Fallow's per-PR audit diffs against the merge base, so the bottom of the
fast-capture stack (#1917) sees drawElementService's exports as unused —
their consumers (frameCapture) land in #1919, two PRs upstack. ignoreExports
entry documents this and can be dropped once #1919 merges.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:19:17 -07:00

59 lines
2.3 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import type { Page } from "puppeteer-core";
import { detectSwiftShader, resolveDrawElementCaptureMode } from "./drawElementService.js";
// ── detectSwiftShader ──────────────────────────────────────────────────────────
describe("detectSwiftShader", () => {
function makePage(evaluateResult: unknown): Page {
return {
evaluate: vi.fn().mockResolvedValue(evaluateResult),
} as unknown as Page;
}
it("returns true when renderer includes 'swiftshader'", async () => {
const page = makePage(true);
expect(await detectSwiftShader(page)).toBe(true);
});
it("returns false for a standard GPU renderer string", async () => {
const page = makePage(false);
expect(await detectSwiftShader(page)).toBe(false);
});
it("returns false when WebGL is unavailable", async () => {
const page = makePage(false);
expect(await detectSwiftShader(page)).toBe(false);
});
it("passes a function to page.evaluate", async () => {
const page = makePage(false);
await detectSwiftShader(page);
expect(page.evaluate).toHaveBeenCalledWith(expect.any(Function));
});
});
// ── resolveDrawElementCaptureMode ──────────────────────────────────────────────
describe("resolveDrawElementCaptureMode", () => {
// signature: (isSwiftShader, transparent)
it("opaque + SwiftShader → screenshot (no GPU egress to skip — parity at best)", () => {
expect(resolveDrawElementCaptureMode(true, false)).toBe("screenshot");
});
it("transparent + SwiftShader → screenshot (also drops sub-layers; crbug 521434899)", () => {
expect(resolveDrawElementCaptureMode(true, true)).toBe("screenshot");
});
it("transparent + GPU → drawelement (GPU handles transparent correctly)", () => {
expect(resolveDrawElementCaptureMode(false, true)).toBe("drawelement");
});
it("opaque + GPU → drawelement", () => {
expect(resolveDrawElementCaptureMode(false, false)).toBe("drawelement");
});
// The <video> gate (proxy for the caption-pattern bug, crbug 521861819) was
// removed once Chrome 151 fixed it — video comps now take the drawElement path.
});