UNPKG

svgedit

Version:

Powerful SVG-Editor for your browser

125 lines (107 loc) 3.32 kB
import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' import { init as initTouch } from '../../packages/svgcanvas/core/touch.js' const createSvgRoot = () => { const listeners = {} return { listeners, addEventListener (type, handler) { listeners[type] = handler }, dispatch (type, event) { listeners[type]?.(event) } } } const OriginalMouseEvent = global.MouseEvent beforeAll(() => { // JSDOM's MouseEvent requires a real Window; a lightweight stub keeps the adapter logic testable. global.MouseEvent = class extends Event { constructor (type, init = {}) { super(type, init) this.clientX = init.clientX this.clientY = init.clientY this.screenX = init.screenX this.screenY = init.screenY this.button = init.button ?? 0 this.relatedTarget = init.relatedTarget ?? null } } }) afterAll(() => { global.MouseEvent = OriginalMouseEvent }) describe('touch adapter', () => { it('translates single touch to mouse event on target', () => { const svgroot = createSvgRoot() const svgCanvas = { svgroot } initTouch(svgCanvas) const target = document.createElement('div') const received = [] target.addEventListener('mousedown', (ev) => { received.push({ type: ev.type, clientX: ev.clientX, clientY: ev.clientY, screenX: ev.screenX, screenY: ev.screenY }) }) const preventDefault = vi.fn() svgroot.dispatch('touchstart', { type: 'touchstart', changedTouches: [{ target, clientX: 12, clientY: 34, screenX: 56, screenY: 78 }], preventDefault }) expect(preventDefault).toHaveBeenCalled() expect(received).toEqual([{ type: 'mousedown', clientX: 12, clientY: 34, screenX: 56, screenY: 78 }]) }) it('maps move events and ignores multi-touch gestures', () => { const svgroot = createSvgRoot() initTouch({ svgroot }) const target = document.createElement('div') let mouseDown = 0 let mouseMove = 0 target.addEventListener('mousedown', () => { mouseDown++ }) target.addEventListener('mousemove', () => { mouseMove++ }) svgroot.dispatch('touchstart', { type: 'touchstart', changedTouches: [ { target, clientX: 1, clientY: 2, screenX: 3, screenY: 4 }, { target, clientX: 5, clientY: 6, screenX: 7, screenY: 8 } ], preventDefault: vi.fn() }) expect(mouseDown).toBe(0) svgroot.dispatch('touchmove', { type: 'touchmove', changedTouches: [ { target, clientX: 9, clientY: 10, screenX: 11, screenY: 12 } ], preventDefault: vi.fn() }) expect(mouseMove).toBe(1) }) it('returns early on unknown event types', () => { const svgroot = createSvgRoot() initTouch({ svgroot }) const target = document.createElement('div') let mouseCount = 0 target.addEventListener('mousedown', () => { mouseCount++ }) const preventDefault = vi.fn() svgroot.dispatch('touchcancel', { type: 'touchcancel', changedTouches: [{ target, clientX: 0, clientY: 0, screenX: 0, screenY: 0 }], preventDefault }) expect(preventDefault).toHaveBeenCalled() expect(mouseCount).toBe(0) }) })