import { useEffect, useRef, useState } from "react"; import type { CartesianSpace } from "@/types"; import { valueToPosition } from "@/util"; import { useCrosshair } from "../crosshair"; // Test Fixtures function TestSquare() { const [origin, setOrigin] = useState({ x: 0, y: 0 }); const [dimensions, setDimensions] = useState({ x: 0, y: 0 }); const [xValue, setXValue] = useState(0); const [yValue, setYValue] = useState(0); const xValueRange = { min: 0, max: 100 }; const yValueRange = { min: 0, max: 100 }; const [xPosition, setXPosition] = useState(0); const [yPosition, setYPosition] = useState(0); const { crosshairRef, isDragging } = useCrosshair({ origin, dimensions, setXValue, setYValue, xValueRange, yValueRange, }); const boundaryRef = useRef(null); const xCrosshairRef = useRef(null); const yCrosshairRef = useRef(null); useEffect(() => { const element = boundaryRef.current; if (element) { const rect = element.getBoundingClientRect(); setOrigin({ x: rect.left, y: rect.top }); setDimensions({ x: rect.width, y: rect.height }); } }, []); useEffect(() => { const newXPos = valueToPosition(xValue, dimensions.x - 1, xValueRange); const newYPos = valueToPosition(yValue, dimensions.y - 1, yValueRange); setXPosition(newXPos); setYPosition(newYPos); }, [xValue, yValue]); return ( <>

X Position: {xPosition}px
Y Position: {yPosition} px

Is Dragging:{" "} {isDragging ? "True" : "False"}

X Value: {xValue}
Y Value: {yValue}

); } // Tests const assertPosition = ( expectedXPosition: number, expectedYPosition: number, ) => { cy.dataCy("x-position-display").should("contain", expectedXPosition); cy.dataCy("y-position-display").should("contain", expectedYPosition); cy.dataCy("x-crosshair").should("have.css", "left", `${expectedXPosition}px`); cy.dataCy("y-crosshair").should("have.css", "top", `${expectedYPosition}px`); }; const triggerMouseEvent = (eventType: string, x: number, y: number) => { cy.dataCy("crosshair-container").trigger(eventType, { clientX: x, clientY: y, buttons: 1, eventConstructor: "MouseEvent", }); }; const triggerTouchEvent = (eventType: string, x: number, y: number) => { cy.dataCy("crosshair-container").trigger(eventType, { clientX: x, clientY: y, touches: [{ clientX: x, clientY: y }], eventConstructor: "TouchEvent", }); }; describe("crosshair tests", () => { beforeEach(() => { cy.mount(); }); it("moves the crosshairs with mouse events", () => { assertPosition(0, 0); triggerMouseEvent("mousedown", 70, 60); assertPosition(0, 0); triggerMouseEvent("mousemove", 180, 180); assertPosition(107, 115); triggerMouseEvent("mousemove", 500, 500); assertPosition(225, 225); triggerMouseEvent("mousemove", 0, 250); assertPosition(0, 185); triggerMouseEvent("mouseup", 0, 250); assertPosition(0, 185); }); it("moves the crosshairs with touch events", () => { assertPosition(0, 0); triggerTouchEvent("touchstart", 70, 60); assertPosition(0, 0); triggerTouchEvent("touchmove", 180, 180); assertPosition(107, 115); triggerTouchEvent("touchmove", 500, 500); assertPosition(225, 225); triggerTouchEvent("touchmove", 0, 250); assertPosition(0, 185); triggerTouchEvent("touchend", 0, 250); assertPosition(0, 185); }); });