mirror of
https://github.com/tenrok/OverlayScrollbars.git
synced 2026-06-15 09:22:28 +03:00
153 lines
5.1 KiB
TypeScript
153 lines
5.1 KiB
TypeScript
import { off, preventDefault, stopPropagation, stopAndPrevent, OnOptions } from 'support/dom/events';
|
|
|
|
const testElm = document.body;
|
|
const mockEventListener = (passive?: boolean, add?: (...args: any) => any, remove?: (...args: any) => any) => {
|
|
const originalAdd = testElm.addEventListener;
|
|
const originalRemove = testElm.removeEventListener;
|
|
const originalWindow = window.addEventListener;
|
|
|
|
if (add) {
|
|
testElm.addEventListener = add;
|
|
}
|
|
if (remove) {
|
|
testElm.removeEventListener = remove;
|
|
}
|
|
if (!passive) {
|
|
window.addEventListener = () => {};
|
|
}
|
|
return () => {
|
|
testElm.addEventListener = originalAdd;
|
|
testElm.removeEventListener = originalRemove;
|
|
window.addEventListener = originalWindow;
|
|
};
|
|
};
|
|
|
|
describe('dom events', () => {
|
|
describe('on', () => {
|
|
let eventsModule: any;
|
|
const onOffTest = (passive: boolean, eventNames: string, options?: OnOptions) => {
|
|
const once = options?._once;
|
|
const expectObjAdd = passive
|
|
? {
|
|
passive: (options && options._passive) || false,
|
|
capture: (options && options._capture) || false,
|
|
}
|
|
: options?._capture || false;
|
|
const expectObjRemove = options?._capture || false;
|
|
const onceListeners: (() => void)[] = [];
|
|
const mockFnRemove = jest.fn();
|
|
const mockFnAdd = jest.fn();
|
|
const eventListener = () => {};
|
|
|
|
const revert = mockEventListener(
|
|
passive,
|
|
(name: string, listener: any, ...args: any) => {
|
|
if (once) {
|
|
const onceRemoveMockFn = jest.fn();
|
|
const revertOnceMock = mockEventListener(passive, jest.fn(), onceRemoveMockFn);
|
|
|
|
listener();
|
|
expect(onceRemoveMockFn).toHaveBeenCalledWith(name, listener, expectObjRemove);
|
|
|
|
revertOnceMock();
|
|
onceListeners.push(listener);
|
|
}
|
|
mockFnAdd(name, listener, ...args);
|
|
},
|
|
mockFnRemove
|
|
);
|
|
const removeFn = eventsModule.on(testElm, eventNames, eventListener, options);
|
|
|
|
eventNames.split(' ').forEach((eventName, index) => {
|
|
expect(mockFnAdd).toHaveBeenCalledWith(eventName, once ? onceListeners[index] : eventListener, expectObjAdd);
|
|
});
|
|
|
|
removeFn();
|
|
eventNames.split(' ').forEach((eventName, index) => {
|
|
expect(mockFnRemove).toHaveBeenCalledWith(eventName, once ? onceListeners[index] : eventListener, expectObjRemove);
|
|
});
|
|
|
|
revert();
|
|
};
|
|
|
|
beforeEach(() => {
|
|
return import('support/dom/events').then((module) => {
|
|
eventsModule = module;
|
|
jest.resetModules();
|
|
});
|
|
});
|
|
|
|
[true, false].forEach((passiveSupport) => {
|
|
describe(`passive event listeners support: ${passiveSupport}`, () => {
|
|
['testEventName', 'testEventName testEventName2 testEventName3'].forEach((eventNames) => {
|
|
const title = eventNames.split(' ').length === 1 ? 'single' : 'multiple';
|
|
test(title, () => {
|
|
onOffTest(passiveSupport, eventNames);
|
|
onOffTest(passiveSupport, eventNames, { _capture: true });
|
|
onOffTest(passiveSupport, eventNames, { _capture: false });
|
|
onOffTest(passiveSupport, eventNames, { _capture: true, _passive: true });
|
|
onOffTest(passiveSupport, eventNames, { _capture: false, _passive: false });
|
|
onOffTest(passiveSupport, eventNames, { _capture: true, _passive: false });
|
|
onOffTest(passiveSupport, eventNames, { _capture: false, _passive: true });
|
|
|
|
onOffTest(passiveSupport, eventNames, { _once: true });
|
|
onOffTest(passiveSupport, eventNames, { _once: false });
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('off', () => {
|
|
const offTest = (eventNames: string, options?: boolean) => {
|
|
const mockFnRemove = jest.fn();
|
|
const listener = () => {};
|
|
const revert = mockEventListener(false, jest.fn(), mockFnRemove);
|
|
|
|
off(testElm, eventNames, listener, options);
|
|
eventNames.split(' ').forEach((eventName) => {
|
|
expect(mockFnRemove).toHaveBeenCalledWith(eventName, listener, options);
|
|
});
|
|
|
|
revert();
|
|
};
|
|
|
|
['testEventName', 'testEventName testEventName2 testEventName3'].forEach((eventNames) => {
|
|
const title = eventNames.split(' ').length === 1 ? 'single' : 'multiple';
|
|
test(title, () => {
|
|
offTest(eventNames, false);
|
|
offTest(eventNames, true);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('preventDefault', () => {
|
|
// @ts-ignore
|
|
const fakeEvent: Event = {
|
|
preventDefault: jest.fn(),
|
|
};
|
|
preventDefault(fakeEvent);
|
|
expect(fakeEvent.preventDefault).toHaveBeenCalled();
|
|
});
|
|
|
|
test('stopPropagation', () => {
|
|
// @ts-ignore
|
|
const fakeEvent: Event = {
|
|
stopPropagation: jest.fn(),
|
|
};
|
|
stopPropagation(fakeEvent);
|
|
expect(fakeEvent.stopPropagation).toHaveBeenCalled();
|
|
});
|
|
|
|
test('stopAndPrevent', () => {
|
|
// @ts-ignore
|
|
const fakeEvent: Event = {
|
|
stopPropagation: jest.fn(),
|
|
preventDefault: jest.fn(),
|
|
};
|
|
stopAndPrevent(fakeEvent);
|
|
expect(fakeEvent.stopPropagation).toHaveBeenCalled();
|
|
expect(fakeEvent.preventDefault).toHaveBeenCalled();
|
|
});
|
|
});
|