import test from 'node:test' import assert from 'node:assert/strict' import { existsSync } from 'node:fs' const moduleUrl = new URL('../src/views/m/crm/contract/print/sealPointerDrag.ts', import.meta.url) test('touch pointer drags a seal and remove detaches listeners', async () => { assert.ok(existsSync(moduleUrl), 'pointer seal adapter exists') const { setupSealPointerDrag } = await import(moduleUrl.href) const handlers = new Map() const removed = [] const doc = { addEventListener: (key, fn) => handlers.set(key, fn), removeEventListener: (key) => { removed.push(key) handlers.delete(key) } } const body = { ownerDocument: doc, contains: () => true } let changes = 0 let cleanup const editor = { getBody: () => body, mode: { get: () => 'design' }, fire: () => changes++, on: (name, fn) => (cleanup = fn) } setupSealPointerDrag(editor) const img = { tagName: 'IMG', hasAttribute: () => true, style: { left: '30px', top: '40px' }, offsetLeft: 30, offsetTop: 40, setPointerCapture() {}, releasePointerCapture() {} } const event = (x, y, id = 1) => ({ target: img, clientX: x, clientY: y, pointerId: id, pointerType: 'touch', button: 0, preventDefault() {} }) handlers.get('pointerdown')(event(50, 60)) handlers.get('pointermove')(event(80, 100, 2)) assert.equal(img.style.left, '30px') handlers.get('pointermove')(event(80, 100)) assert.equal(img.style.left, '60px') assert.equal(img.style.top, '80px') handlers.get('pointerup')(event(80, 100)) assert.equal(changes, 1) cleanup() assert.equal(handlers.size, 0) assert.equal(removed.length, 4) })