import EventManager from '../src/managers/event-manager'; interface Context{ type: Function } interface Sender{ name: Function } interface Data{ value: number } interface EventDataObject{ originalEvent: EventListenerObject, type: string, data: Data, sender: Sender } describe('Event manager basic testing', () => { let eventManager, globalContext:Context = { type: ()=>'global' }, explicitContext:Context = { type: ()=>'explicit' }; test('Event manager is intialized with predefined events', (done)=>{ let handleInitialize = ()=>{ done(); }; eventManager = new EventManager({ events: { 'initialized': handleInitialize }, context: globalContext }); eventManager.dispatchEvent('initialized', {}); }); test('Event handler is added via api', (done)=>{ let handleInitialize = ()=>{ done(); }; eventManager = new EventManager({ events: {}, context: globalContext }); eventManager.addEventListener('initialized', handleInitialize); eventManager.dispatchEvent('initialized', {}); }); test('Event handler is removed via api', (done)=>{ let handleInitialize = ()=>{ return; }; eventManager = new EventManager({ events: { 'initialized': handleInitialize }, context: globalContext }); eventManager.removeEventListener('initialized', handleInitialize); expect(eventManager.getAllListeners().initialized.length).toBe(0); done(); }); test('Event is dispatched with global context', (done)=>{ let handleInitialize = function(this:Context){ let context = this; expect(context.type()).toBe('global'); done(); }; eventManager = new EventManager({ events: { 'initialized': handleInitialize }, context: globalContext }); eventManager.dispatchEvent('initialized', {}); }); test('Event is dispatched with explicit context', (done)=>{ let handleInitialize = function(this:Context){ let context = this; expect(context.type()).toBe('explicit'); done(); }; eventManager = new EventManager({ events: { 'initialized': handleInitialize }, context: globalContext }); eventManager.dispatchEvent('initialized', {}, {}, explicitContext); }); test('Adding handlers of same event type stores reference of all the handlers', (done)=>{ let handleInitialize = function(){ return; }, handleInitialization = function(){ return; }; eventManager = new EventManager({ events: { 'initialized': handleInitialize }, context: globalContext }); eventManager.addEventListener('initialized', handleInitialization); expect(eventManager.getAllListeners().initialized.length).toBe(2); done(); }); }); describe('Event manager basic payload', () => { let eventManager, globalContext:Context = { type: ()=>'global' }, sender:Sender = { name: ()=>'sender' }; test('Event manager dipatches with proper event name', (done)=>{ let handleInitialize = (e: EventDataObject)=>{ expect(e.type).toBe('initialized'); done(); }; eventManager = new EventManager({ events: { 'initialized': handleInitialize }, context: globalContext }); eventManager.dispatchEvent('initialized', {}); }); test('Event manager dipatches with proper sender object', (done)=>{ let handleInitialize = (e: EventDataObject)=>{ expect(e.sender.name()).toBe('sender'); done(); }; eventManager = new EventManager({ events: { 'initialized': handleInitialize }, context: globalContext }); eventManager.dispatchEvent.call(sender, 'initialized', {}); }); test('Event manager dipatches with proper payload object', (done)=>{ let handleInitialize = (e: EventDataObject)=>{ expect(e.data.value).toBe(30); done(); }; eventManager = new EventManager({ events: { 'initialized': handleInitialize }, context: globalContext }); eventManager.dispatchEvent.call(sender, 'initialized', { value: 30 }); }); });