event-emitters
Version:
89 lines • 3.19 kB
JavaScript
import { EventEmitterWithCurrent } from './EventEmitterWithCurrent';
describe('EventEmitterWithCurrent', () => {
/* eslint-disable @typescript-eslint/explicit-function-return-type */
const defaultVal = 1;
const createEventEmitter = () => new EventEmitterWithCurrent(defaultVal);
let emitter = createEventEmitter();
beforeEach(() => {
emitter = createEventEmitter();
});
it('sends current status when listener first subscribes', () => {
let current;
emitter.subscribe((newVal) => {
current = newVal;
});
expect(current).toEqual(defaultVal);
});
it('updates subscribed listener with statuses as they change', () => {
let current;
emitter.subscribe((newVal) => {
current = newVal;
});
const secondVal = 2;
emitter.emit(secondVal);
expect(current).toEqual(secondVal);
});
it('supports multiple listeners', () => {
let current1;
let current2;
emitter.subscribe((newVal) => {
current1 = newVal;
});
emitter.subscribe((newVal) => {
current2 = newVal;
});
expect(current1).toEqual(defaultVal);
expect(current2).toEqual(defaultVal);
const secondVal = 2;
emitter.emit(secondVal);
expect(current1).toEqual(secondVal);
expect(current2).toEqual(secondVal);
});
it('stops updating a listener after `unsubscribe` is called', () => {
let current1;
let current2;
const secondListener = (newVal) => {
current2 = newVal;
};
emitter.subscribe((newVal) => {
current1 = newVal;
});
emitter.subscribe(secondListener);
expect(current1).toEqual(defaultVal);
expect(current2).toEqual(defaultVal);
const secondVal = 2;
emitter.emit(secondVal);
expect(current1).toEqual(secondVal);
expect(current2).toEqual(secondVal);
emitter.unsubscribe(secondListener);
const thirdVal = 3;
emitter.emit(thirdVal);
expect(current1).toEqual(thirdVal);
expect(current2).toEqual(secondVal);
});
describe('async iterator', () => {
it('includes current value as first value', async () => {
const allVals = [];
async function iterate(iterator) {
for await (const val of iterator) {
allVals.push(val);
if (val === 4)
break;
}
}
const promise = iterate(emitter);
emitter.emit(2);
emitter.emit(3);
emitter.emit(4);
expect(emitter.hasListeners()).toEqual(true);
await expect(promise).resolves.not.toThrow();
expect(allVals).toEqual([1, 2, 3, 4]);
expect(emitter.hasListeners()).toEqual(false);
allVals.splice(0);
await iterate(emitter);
expect(allVals).toEqual([4]);
expect(emitter.hasListeners()).toEqual(false);
});
});
});
//# sourceMappingURL=EventEmitterWithCurrent.spec.js.map