// @vitest-environment jsdom import { cleanup, render } from "@testing-library/react"; import { afterEach, describe, expect, it } from "vitest"; import { CanvasDotPattern } from "./canvas-dot-pattern"; afterEach(cleanup); describe("CanvasDotPattern", () => { it.each([ [0.5, 12, 0.75, "translate(-6, -18)"], [1, 24, 1.5, "translate(0, -36)"], [4, 96, 6, "translate(-36, -72)"], ])("scales dot geometry at scale %s and signed pan", (scale, gap, radius, transform) => { const { container } = render(); const pattern = container.querySelector("pattern")!; expect(pattern.getAttribute("width")).toBe(String(gap)); expect(pattern.getAttribute("height")).toBe(String(gap)); expect(pattern.getAttribute("patternTransform")).toBe(transform); expect(pattern.getAttribute("x")).toBe("50%"); expect(pattern.getAttribute("y")).toBe("50%"); expect(container.querySelector("circle")?.getAttribute("r")).toBe(String(radius)); expect(container.querySelector("circle")?.getAttribute("fill")).toBe("var(--foreground)"); expect(container.querySelector("circle")?.getAttribute("fill-opacity")).toBe("0.1"); expect(container.querySelectorAll("circle")).toHaveLength(1); expect(container.querySelectorAll("image, canvas")).toHaveLength(0); }); it("keeps pattern references unique and invalid transforms finite", () => { const { container } = render(<> ); const patterns = [...container.querySelectorAll("pattern")]; expect(new Set(patterns.map((node) => node.id)).size).toBe(2); for (const [index, pattern] of patterns.entries()) { expect(pattern.getAttribute("width")).toBe("24"); expect(pattern.getAttribute("patternTransform")).toBe("translate(-13, -13)"); expect(container.querySelectorAll("rect")[index]?.getAttribute("fill")).toBe(`url(#${pattern.id})`); } }); });