57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
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)
|
|
})
|