Ctrl K
ComunidadGuías…

src/test/touch.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// 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]) });
}