import { describe, expect, test } from 'vitest'; import { resourceCanvasGestureExceededDragThreshold } from '../src/features/resource-canvas/resourceCanvasCardGestureModel'; import { RESOURCE_CANVAS_DRAG_THRESHOLD } from '../src/view/project-development/resourceCanvasLayoutModel'; describe('画布卡片手势:拖动 / 点击的唯一判据', () => { const gesture = (deltaX: number, deltaY: number) => resourceCanvasGestureExceededDragThreshold({ startClientX: 100, startClientY: 100, clientX: 100 + deltaX, clientY: 100 + deltaY, }); test('正好到阈值算拖动,差一点点仍算点击(与资源卡同一个阈值)', () => { expect(RESOURCE_CANVAS_DRAG_THRESHOLD).toBe(5); expect(gesture(RESOURCE_CANVAS_DRAG_THRESHOLD, 0)).toBe(true); expect(gesture(RESOURCE_CANVAS_DRAG_THRESHOLD - 0.1, 0)).toBe(false); expect(gesture(0, 0)).toBe(false); }); test('位移按欧氏距离算:斜向 3/4 就是 5', () => { expect(gesture(3, 4)).toBe(true); expect(gesture(2, 3)).toBe(false); }); test('阈值可覆盖(各档手势需要更紧或更松时只改参数,不改判据)', () => { expect( resourceCanvasGestureExceededDragThreshold({ startClientX: 0, startClientY: 0, clientX: 1, clientY: 0, threshold: 1, }), ).toBe(true); }); test('几何非法时按「没有拖动」算:宁可把拖动当点击,也不能把点击误判成拖动', () => { expect( resourceCanvasGestureExceededDragThreshold({ startClientX: Number.NaN, startClientY: 100, clientX: 200, clientY: 100, }), ).toBe(false); }); });