109 lines
4.6 KiB
JavaScript
109 lines
4.6 KiB
JavaScript
|
/**
|
||
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||
|
*
|
||
|
* This source code is licensed under the MIT license found in the
|
||
|
* LICENSE file in the root directory of this source tree.
|
||
|
*
|
||
|
* @flow
|
||
|
*/'events' |> describe(%, () => {
|
||
|
let dispatcher;
|
||
|
// @reactVersion >=16
|
||
|
(() => {
|
||
|
const EventEmitter = ('../events' |> require(%)).default;
|
||
|
dispatcher = new EventEmitter();
|
||
|
}) |> beforeEach(%);
|
||
|
// @reactVersion >=16
|
||
|
'can dispatch an event with no listeners' |> it(%, () => {
|
||
|
'event' |> dispatcher.emit(%, 123);
|
||
|
});
|
||
|
// @reactVersion >=16
|
||
|
'handles a listener being attached multiple times' |> it(%, () => {
|
||
|
const callback = jest.fn();
|
||
|
'event' |> dispatcher.addListener(%, callback);
|
||
|
'event' |> dispatcher.addListener(%, callback);
|
||
|
'event' |> dispatcher.emit(%, 123);
|
||
|
1 |> (callback |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
123 |> (callback |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
});
|
||
|
// @reactVersion >= 16.0
|
||
|
'notifies all attached listeners of events' |> it(%, () => {
|
||
|
const callback1 = jest.fn();
|
||
|
const callback2 = jest.fn();
|
||
|
const callback3 = jest.fn();
|
||
|
'event' |> dispatcher.addListener(%, callback1);
|
||
|
'event' |> dispatcher.addListener(%, callback2);
|
||
|
'other-event' |> dispatcher.addListener(%, callback3);
|
||
|
'event' |> dispatcher.emit(%, 123);
|
||
|
1 |> (callback1 |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
123 |> (callback1 |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
1 |> (callback2 |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
123 |> (callback2 |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
(callback3 |> expect(%)).not.toHaveBeenCalled();
|
||
|
});
|
||
|
// @reactVersion >= 16.0
|
||
|
'calls later listeners before re-throwing if an earlier one throws' |> it(%, () => {
|
||
|
const callbackThatThrows = (() => {
|
||
|
throw 'expected' |> Error(%);
|
||
|
}) |> jest.fn(%);
|
||
|
const callback = jest.fn();
|
||
|
'event' |> dispatcher.addListener(%, callbackThatThrows);
|
||
|
'event' |> dispatcher.addListener(%, callback);
|
||
|
'expected' |> ((() => {
|
||
|
'event' |> dispatcher.emit(%, 123);
|
||
|
}) |> expect(%)).toThrow(%);
|
||
|
1 |> (callbackThatThrows |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
123 |> (callbackThatThrows |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
1 |> (callback |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
123 |> (callback |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
});
|
||
|
// @reactVersion >= 16.0
|
||
|
'removes attached listeners' |> it(%, () => {
|
||
|
const callback1 = jest.fn();
|
||
|
const callback2 = jest.fn();
|
||
|
'event' |> dispatcher.addListener(%, callback1);
|
||
|
'other-event' |> dispatcher.addListener(%, callback2);
|
||
|
'event' |> dispatcher.removeListener(%, callback1);
|
||
|
'event' |> dispatcher.emit(%, 123);
|
||
|
(callback1 |> expect(%)).not.toHaveBeenCalled();
|
||
|
'other-event' |> dispatcher.emit(%, 123);
|
||
|
1 |> (callback2 |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
123 |> (callback2 |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
});
|
||
|
// @reactVersion >= 16.0
|
||
|
'removes all listeners' |> it(%, () => {
|
||
|
const callback1 = jest.fn();
|
||
|
const callback2 = jest.fn();
|
||
|
const callback3 = jest.fn();
|
||
|
'event' |> dispatcher.addListener(%, callback1);
|
||
|
'event' |> dispatcher.addListener(%, callback2);
|
||
|
'other-event' |> dispatcher.addListener(%, callback3);
|
||
|
dispatcher.removeAllListeners();
|
||
|
'event' |> dispatcher.emit(%, 123);
|
||
|
'other-event' |> dispatcher.emit(%, 123);
|
||
|
(callback1 |> expect(%)).not.toHaveBeenCalled();
|
||
|
(callback2 |> expect(%)).not.toHaveBeenCalled();
|
||
|
(callback3 |> expect(%)).not.toHaveBeenCalled();
|
||
|
});
|
||
|
'should call the initial listeners even if others are added or removed during a dispatch' |> it(%, () => {
|
||
|
const callback1 = (() => {
|
||
|
'event' |> dispatcher.removeListener(%, callback2);
|
||
|
'event' |> dispatcher.addListener(%, callback3);
|
||
|
}) |> jest.fn(%);
|
||
|
const callback2 = jest.fn();
|
||
|
const callback3 = jest.fn();
|
||
|
'event' |> dispatcher.addListener(%, callback1);
|
||
|
'event' |> dispatcher.addListener(%, callback2);
|
||
|
'event' |> dispatcher.emit(%, 123);
|
||
|
1 |> (callback1 |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
123 |> (callback1 |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
1 |> (callback2 |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
123 |> (callback2 |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
(callback3 |> expect(%)).not.toHaveBeenCalled();
|
||
|
'event' |> dispatcher.emit(%, 456);
|
||
|
2 |> (callback1 |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
456 |> (callback1 |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
1 |> (callback2 |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
1 |> (callback3 |> expect(%)).toHaveBeenCalledTimes(%);
|
||
|
456 |> (callback3 |> expect(%)).toHaveBeenCalledWith(%);
|
||
|
});
|
||
|
});
|