// A finger on a chart, as pointer events. For the browser project, where // `PointerEvent` exists and carries `pointerType`; jsdom has neither. import { fireEvent } from "@testing-library/react"; const FINGER = { pointerType: "touch", isPrimary: true, pointerId: 7 }; /** Where an element's centre is, in client coordinates. */ export function centreOf(element: Element): { x: number; y: number } { const box = element.getBoundingClientRect(); return { x: box.left + box.width / 2, y: box.top + box.height / 2 }; } /** A finger going down at a point on `target`. */ export function fingerDown(target: Element, at: { x: number; y: number }) { fireEvent.pointerDown(target, { ...FINGER, clientX: at.x, clientY: at.y }); } /** A finger already down on `target`, moved to a point. */ export function fingerMove(target: Element, at: { x: number; y: number }) { fireEvent.pointerMove(target, { ...FINGER, clientX: at.x, clientY: at.y }); } /** The finger lifting at a point - pointer capture keeps it on `target`. */ export function fingerUp(target: Element, at: { x: number; y: number }) { fireEvent.pointerUp(target, { ...FINGER, clientX: at.x, clientY: at.y }); } /** A tap: down and up at one point, without moving. */ export function tap(target: Element, at: { x: number; y: number }) { fingerDown(target, at); fingerUp(target, at); } /** A finger pressing somewhere else on the page. */ export function pressElsewhere() { fireEvent.pointerDown(document.body, { ...FINGER, pointerId: 8 }); } const THUMB = { pointerType: "touch", isPrimary: false, pointerId: 9 }; /** * Two fingers on `target` moving from one pair of points to another and * lifting - the first is the primary finger the other helpers move. */ export function pinch( target: Element, from: [{ x: number; y: number }, { x: number; y: number }], to: [{ x: number; y: number }, { x: number; y: number }], ) { const at = ({ x, y }: { x: number; y: number }) => ({ clientX: x, clientY: y, }); fireEvent.pointerDown(target, { ...FINGER, ...at(from[0]) }); fireEvent.pointerDown(target, { ...THUMB, ...at(from[1]) }); fireEvent.pointerMove(target, { ...FINGER, ...at(to[0]) }); fireEvent.pointerMove(target, { ...THUMB, ...at(to[1]) }); fireEvent.pointerUp(target, { ...THUMB, ...at(to[1]) }); fireEvent.pointerUp(target, { ...FINGER, ...at(to[0]) }); }