UNPKG

event-emitters

Version:
153 lines 6.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _1 = require("."); describe('EventEmitterWithCurrent', function () { /* eslint-disable @typescript-eslint/explicit-function-return-type */ var defaultVal = 'first'; var createEventEmitter = function () { return new _1.EventEmitterWithCurrent(defaultVal); }; var emitter = createEventEmitter(); beforeEach(function () { emitter = createEventEmitter(); }); it('sends current status when listener first subscribes', function () { var current = ''; emitter.subscribe(function (newVal) { current = newVal; }); expect(current).toEqual(defaultVal); }); it('updates subscribed listener with statuses as they change', function () { var current = ''; emitter.subscribe(function (newVal) { current = newVal; }); var secondVal = 'second'; emitter.emit(secondVal); expect(current).toEqual(secondVal); }); it('supports multiple listeners', function () { var current1 = ''; var current2 = ''; emitter.subscribe(function (newVal) { current1 = newVal; }); emitter.subscribe(function (newVal) { current2 = newVal; }); expect(current1).toEqual(defaultVal); expect(current2).toEqual(defaultVal); var secondVal = 'second'; emitter.emit(secondVal); expect(current1).toEqual(secondVal); expect(current2).toEqual(secondVal); }); it('stops updating a listener after `unsubscribe` is called', function () { var current1 = ''; var current2 = ''; var secondListener = function (newVal) { current2 = newVal; }; emitter.subscribe(function (newVal) { current1 = newVal; }); emitter.subscribe(secondListener); expect(current1).toEqual(defaultVal); expect(current2).toEqual(defaultVal); var secondVal = 'second'; emitter.emit(secondVal); expect(current1).toEqual(secondVal); expect(current2).toEqual(secondVal); emitter.unsubscribe(secondListener); var thirdVal = 'third'; emitter.emit(thirdVal); expect(current1).toEqual(thirdVal); expect(current2).toEqual(secondVal); }); it('throws an error when trying to subscribe the same listener twice', function () { // eslint-disable-next-line @typescript-eslint/no-empty-function var listener = function () { }; emitter.subscribe(listener); expect(function () { emitter.subscribe(listener); }).toThrow(); }); it('throws an error when trying to unsubscribe a listener that is not listening', function () { // eslint-disable-next-line @typescript-eslint/no-empty-function var listener1 = function () { }; // eslint-disable-next-line @typescript-eslint/no-empty-function var listener2 = function () { }; emitter.subscribe(listener1); expect(function () { emitter.unsubscribe(listener2); }).toThrow(); }); }); describe('QueueingEventEmitter', function () { var createEventEmitter = function () { return new _1.QueueingEventEmitter(); }; var emitter = createEventEmitter(); beforeEach(function () { emitter = createEventEmitter(); }); it('queues messages when there are no subscribers and emits them to first subscriber', function () { var subscriber = jest.fn(); emitter.emit('one'); emitter.emit('two'); emitter.subscribe(subscriber); expect(subscriber.mock.calls).toEqual([['one'], ['two']]); }); it('stops queueing messages when there is a subscriber', function () { var subscriber = jest.fn(); emitter.emit('one'); emitter.emit('two'); emitter.subscribe(subscriber); expect(subscriber.mock.calls).toEqual([['one'], ['two']]); emitter.emit('three'); expect(subscriber.mock.calls).toEqual([['one'], ['two'], ['three']]); }); it('resumes queueing message when it loses all subscribers', function () { var subscriber1 = jest.fn(); var subscriber2 = jest.fn(); emitter.emit('one'); emitter.emit('two'); emitter.subscribe(subscriber1); emitter.subscribe(subscriber2); expect(subscriber1.mock.calls).toEqual([['one'], ['two']]); expect(subscriber2).toHaveBeenCalledTimes(0); emitter.emit('three'); expect(subscriber1.mock.calls).toEqual([['one'], ['two'], ['three']]); expect(subscriber2.mock.calls).toEqual([['three']]); emitter.unsubscribe(subscriber1); emitter.emit('four'); expect(subscriber1).toHaveBeenCalledTimes(3); expect(subscriber2.mock.calls).toEqual([['three'], ['four']]); emitter.unsubscribe(subscriber2); emitter.emit('five'); emitter.emit('six'); var subscriber3 = jest.fn(); emitter.subscribe(subscriber3); expect(subscriber3.mock.calls).toEqual([['five'], ['six']]); emitter.emit('seven'); expect(subscriber3.mock.calls).toEqual([['five'], ['six'], ['seven']]); }); it('re-throws the final error when the subscriber throws during queue drain', function () { var subscriber1 = jest .fn() .mockImplementationOnce(function () { throw new Error('1'); }) .mockImplementationOnce(function () { throw new Error('2'); }); emitter.emit('one'); emitter.emit('two'); emitter.emit('three'); expect(function () { emitter.subscribe(subscriber1); }).toThrow('2'); // make sure the queue is drained var subscriber2 = jest.fn(); emitter.subscribe(subscriber2); expect(subscriber2).toHaveBeenCalledTimes(0); }); }); //# sourceMappingURL=index.spec.js.map