describe('pub sub', function(){ it('is able to provide a single event pubsub', function(){ var events = pubSub(); expect(events('somethingHappening').on).not.toBeUndefined(); }); it('is provides the same single when asked twice', function(){ var events = pubSub(); expect( events('somethingHappening')) .toBe( events('somethingHappening')); }); it('numeric event names are treated as equal', function(){ var events = pubSub(); expect( events(1)) .toBe( events(1)); }); it('different numeric event names are treated as equal', function(){ var events = pubSub(); expect( events(1)) .not.toBe( events(2)); }); it('is provides different singles for different event names', function(){ var events = pubSub(); expect( events('somethingHappening')) .not.toBe( events('somethingElseHappening')); }); it('doesn\'t notify a newListener listener of its own addition', function() { var events = pubSub(), listenerListener = jasmine.createSpy('listenerListener'); events('newListener').on(listenerListener); expect(listenerListener).not.toHaveBeenCalled(); }); it('notifies of new listeners when added without an id', function() { var events = pubSub(), listenerListener = jasmine.createSpy('listenerListener'); events('newListener').on(listenerListener); events('foo').on(noop); expect(listenerListener).toHaveBeenCalledWith('foo', noop, noop); }); it('should which multiple events notify of the right one', function(){ var events = pubSub(), listenerA = jasmine.createSpy('listenerA'), listenerB = jasmine.createSpy('listenerB'); events('eventA').on(listenerA); events('eventB').on(listenerB); events('eventA').emit(); expect(listenerA).toHaveBeenCalled(); expect(listenerB).not.toHaveBeenCalled(); events('eventB').emit(); expect(listenerB).toHaveBeenCalled(); }); it('does not fire removeListener if nothing is removed', function() { var events = pubSub(), removeListenerListener = jasmine.createSpy('removeListenerListener'), fooListener = jasmine.createSpy('fooListener'); events('removeListener').on(removeListenerListener); events('foo').on(fooListener); events('foo').un('wrong_item'); expect(removeListenerListener).not.toHaveBeenCalled(); }); it('fires removeListener when a listener is removed', function(){ var events = pubSub(), removeListenerListener = jasmine.createSpy('removeListenerListener'); events('removeListener').on(removeListenerListener); events('foo').on(noop); events('foo').un(noop); expect(removeListenerListener).toHaveBeenCalledWith('foo', noop, noop); }) describe('short-cut methods', function(){ it('has .emit', function(){ var events = pubSub(), callback = jasmine.createSpy('something happening callback'); events('somethingHappened').on(callback); events.emit('somethingHappened', 'it was', 'definitely something'); expect(callback).toHaveBeenCalledWith('it was', 'definitely something'); }); it('has .on', function(){ var events = pubSub(), callback = jasmine.createSpy('something happening callback'); events.on('somethingHappened', callback); events('somethingHappened').emit('it was', 'definitely something'); expect(callback).toHaveBeenCalledWith('it was', 'definitely something'); }); it('has .un', function(){ var events = pubSub(), callback = jasmine.createSpy('something happening callback'); events('somethingHappened').on(callback); events.un('somethingHappened', callback); events('somethingHappened').emit('it was', 'definitely something'); expect(callback).not.toHaveBeenCalled(); }); it('has .un that works with listener id', function(){ var events = pubSub(), callback = jasmine.createSpy('something happening callback'); events('somethingHappened').on(callback, 'id'); events.un('somethingHappened', 'id'); events('somethingHappened').emit('it was', 'definitely something'); expect(callback).not.toHaveBeenCalled(); }); }); });