UNPKG

maplibre-gl

Version:

BSD licensed community fork of mapbox-gl, a WebGL interactive maps library

153 lines (108 loc) 4.45 kB
import {describe, beforeEach, test, expect, vi} from 'vitest'; import simulate from '../../../test/unit/lib/simulate_interaction'; import {beforeMapTest, sleep} from '../../util/test/util'; import {Map, type MapOptions} from '../map'; function createMap() { return new Map({container: window.document.createElement('div')} as any as MapOptions); } async function simulateDoubleTap(map, delay = 100) { const canvas = map.getCanvas(); simulate.touchstart(canvas, {touches: [{target: canvas, clientX: 0, clientY: 0}]}); simulate.touchend(canvas); await sleep(delay); simulate.touchstart(canvas, {touches: [{target: canvas, clientX: 0, clientY: 0}]}); simulate.touchend(canvas); map._renderTaskQueue.run(); } beforeEach(() => { beforeMapTest(); }); describe('dbclick_zoom', () => { test('DoubleClickZoomHandler zooms on dblclick event', () => { const map = createMap(); const zoom = vi.fn(); map.on('zoomstart', zoom); simulate.dblclick(map.getCanvas()); map._renderTaskQueue.run(); expect(zoom).toHaveBeenCalled(); map.remove(); }); test('DoubleClickZoomHandler does not zoom if preventDefault is called on the dblclick event', () => { const map = createMap(); map.on('dblclick', e => e.preventDefault()); const zoom = vi.fn(); map.on('zoomstart', zoom); simulate.dblclick(map.getCanvas()); map._renderTaskQueue.run(); expect(zoom).not.toHaveBeenCalled(); map.remove(); }); test('DoubleClickZoomHandler zooms on double tap if touchstart events are < 300ms apart', async () => { const map = createMap(); const zoom = vi.fn(); map.on('zoomstart', zoom); await simulateDoubleTap(map, 100); expect(zoom).toHaveBeenCalled(); map.remove(); }); test('DoubleClickZoomHandler does not zoom on double tap if touchstart events are > 500ms apart', async () => { const map = createMap(); const zoom = vi.fn(); map.on('zoom', zoom); await simulateDoubleTap(map, 500); expect(zoom).not.toHaveBeenCalled(); map.remove(); }); test('DoubleClickZoomHandler does not zoom on double tap if touchstart events are in different locations', async () => { const map = createMap(); const zoom = vi.fn(); map.on('zoom', zoom); const canvas = map.getCanvas(); simulate.touchstart(canvas, {touches: [{clientX: 0, clientY: 0}]}); simulate.touchend(canvas); await sleep(100); simulate.touchstart(canvas, {touches: [{clientX: 30.5, clientY: 30.5}]}); simulate.touchend(canvas); map._renderTaskQueue.run(); expect(zoom).not.toHaveBeenCalled(); map.remove(); }); test('DoubleClickZoomHandler zooms on the second touchend event of a double tap', () => { const map = createMap(); const zoom = vi.fn(); map.on('zoomstart', zoom); const canvas = map.getCanvas(); const touchOptions = {touches: [{target: canvas, clientX: 0.5, clientY: 0.5}]}; simulate.touchstart(canvas, touchOptions); simulate.touchend(canvas); simulate.touchstart(canvas, touchOptions); map._renderTaskQueue.run(); map._renderTaskQueue.run(); expect(zoom).not.toHaveBeenCalled(); simulate.touchcancel(canvas); simulate.touchend(canvas); map._renderTaskQueue.run(); expect(zoom).not.toHaveBeenCalled(); simulate.touchstart(canvas, touchOptions); simulate.touchend(canvas); simulate.touchstart(canvas, touchOptions); map._renderTaskQueue.run(); expect(zoom).not.toHaveBeenCalled(); simulate.touchend(canvas); map._renderTaskQueue.run(); expect(zoom).toHaveBeenCalled(); }); test('DoubleClickZoomHandler does not zoom on double tap if second touchend is >300ms after first touchstart', async () => { const map = createMap(); const zoom = vi.fn(); map.on('zoom', zoom); const canvas = map.getCanvas(); simulate.touchstart(canvas); simulate.touchend(canvas); simulate.touchstart(canvas); await sleep(300); simulate.touchend(canvas); map._renderTaskQueue.run(); expect(zoom).not.toHaveBeenCalled(); }); });