UNPKG

raptor

Version:

RaptorJS provides an AMD module loader that works in Node, Rhino and the web browser. It also includes various sub-modules to support building optimized web applications.

421 lines (308 loc) 11.9 kB
require('./_helper.js'); var raptor = require('raptor'); var define = raptor.createDefine(module); describe('listeners module', function() { it('should allow listener groups', function() { var listeners = require('raptor/listeners').createObservable(); var thisObj = {}; var testEventFired = false; listeners.subscribe('testEvent', function(eventArgs) { expect(eventArgs.one).toEqual(1); expect(eventArgs.two).toEqual(2); testEventFired = true; }, thisObj); listeners.publish('testEvent', { one: 1, two: 2 }); expect(testEventFired).toEqual(true); }); it('should allow multiple types for ListenerGroup.subscribe()', function() { var listeners = require('raptor/listeners').createObservable(); var event1Fired = false, event2Fired = false; listeners.subscribe({ 'event1': function(eventArgs) { expect(eventArgs.one).toEqual(1); expect(eventArgs.two).toEqual(2); event1Fired = true; }, 'event2': function(eventArgs) { expect(eventArgs.three).toEqual(3); expect(eventArgs.four).toEqual(4); event2Fired = true; } }); listeners.publish('event1', {one: 1, two: 2}); listeners.publish('event2', {three: 3, four: 4}); expect(event1Fired).toEqual(true); expect(event2Fired).toEqual(true); }); it('should allow a custom thisObj to be used for callbacks with listener groups', function() { var listeners = require('raptor/listeners').createObservable(); var thisObj = {}; listeners.subscribe('testEvent', function() { expect(this).toStrictlyEqual(thisObj); }, thisObj); var anotherThisObj = {}; listeners.subscribe({ 'event1': function() { expect(this).toEqual(anotherThisObj); }, 'event2': function() { expect(this).toEqual(anotherThisObj); } }, anotherThisObj); listeners.publish('testEvent'); listeners.publish('event1'); listeners.publish('event2'); }); it('should allow listeners to be removed', function() { var listeners = require('raptor/listeners').createObservable(); var event1Fired = false, event2Fired = false; event3Fired = false; event4Fired = false; event5Fired = false; event6Fired = false; var handle_1_2 = listeners.subscribe({ 'event1': function() { event1Fired = true; }, 'event2': function() { event2Fired = true; } }); var handle_3_4_5 = listeners.subscribe({ 'event3': function() { event3Fired = true; }, 'event4': function() { event4Fired = true; }, 'event5': function() { event5Fired = true; } }); var handle_6 = listeners.subscribe('event6', function() { event6Fired = false; }, this); handle_1_2.removeAll(); handle_3_4_5.remove('event3'); handle_3_4_5.remove('event4'); //keep event5 callback handle_6.remove(); listeners.publish('event1'); listeners.publish('event2'); listeners.publish('event3'); listeners.publish('event4'); listeners.publish('event5'); listeners.publish('event6'); expect(event1Fired).toEqual(false); expect(event2Fired).toEqual(false); expect(event3Fired).toEqual(false); expect(event4Fired).toEqual(false); expect(event5Fired).toEqual(true); expect(event6Fired).toEqual(false); }); it('should allow any object become a listener', function() { var myObject = {}; require('raptor/listeners').makeObservable(myObject); var thisObj = {}; var testFired = false; myObject.subscribe('test', function() { expect(this).toStrictlyEqual(thisObj); testFired = true; }, thisObj); myObject.publish('test'); expect(testFired).toEqual(true); var anotherObject = {}; require('raptor/listeners').makeObservable(anotherObject); var event1Fired = false, event2Fired = false; anotherObject.subscribe({ 'event1': function() { event1Fired = true; }, 'event2': function() { event2Fired = true; } }); anotherObject.publish('event1'); expect(event1Fired).toEqual(true); expect(event2Fired).toEqual(false); anotherObject.publish('event2'); expect(event2Fired).toEqual(true); }); it('should allow the original message name to be accessed', function() { var observable = require('raptor/listeners').createObservable(); var receivedMessage; observable.subscribe('test', function(data, message) { receivedMessage = message; }); observable.publish('test'); expect(receivedMessage).toNotEqual(null); expect(receivedMessage.getName()).toEqual("test"); }); it('should allow an args array to be provided to the publish method', function() { var observable = require('raptor/listeners').createObservable(); var receivedHello, receivedWorld, messageReceived = false; observable.subscribe('test', function(hello, world) { expect(hello).toEqual("hello"); expect(world).toEqual("world"); messageReceived = true; }); observable.publish('test', ['hello', 'world']); expect(messageReceived).toEqual(true); }); it('should allow messages to be restricted for observables', function() { var observable = require('raptor/listeners').createObservable(); observable.registerMessages([]); var test1Count = 0; var test2Count = 0; var _e = null; try { observable.subscribe('test1', function() { test1Count++; }); observable.subscribe('test2', function() { test2Count++; }); } catch(e) { _e = e; } expect(_e).toNotEqual(null); _e = null; try { observable.publish('test1'); } catch(e) { _e = e; } expect(_e).toNotEqual(null); _e = null; try { observable.publish('test2'); } catch(e) { _e = e; } expect(_e).toNotEqual(null); observable.registerMessages(['test1', 'test2']); observable.subscribe('test1', function() { test1Count++; }); observable.subscribe('test2', function() { test2Count++; }); observable.publish('test1'); observable.publish('test2'); expect(test1Count).toEqual(1); expect(test2Count).toEqual(1); }); it('should allow message functions to be added for allowed messages', function() { var observable = require('raptor/listeners').createObservable(); observable.registerMessages(['test1', 'test2'], true /* create functions */); var test1Count = 0; var test2Count = 0; observable.subscribe('test1', function(message) { test1Count += message.inc; }); observable.subscribe('test2', function(message) { test2Count += message.inc; }); observable.test1(function(message) { test1Count += message.inc; }); observable.test2(function(message) { test2Count += message.inc; }); observable.test1({inc: 1}); observable.test2({inc: 1}); expect(test1Count).toEqual(2); expect(test2Count).toEqual(2); }); it('should allow the set of allowed messages and option to create functions to be passed in at creation time', function() { var observable = require('raptor/listeners').createObservable(['test1', 'test2'], true /* create functions */); var test1Count = 0; var test2Count = 0; observable.subscribe('test1', function(message) { test1Count += message.inc; }); observable.subscribe('test2', function(message) { test2Count += message.inc; }); observable.test1({inc: 1}); observable.test2({inc: 1}); expect(test1Count).toEqual(1); expect(test2Count).toEqual(1); var _e = null; try { observable.subscribe('test3', function() {}); } catch(e) { _e = e; } expect(_e).toNotEqual(null); _e = null; try { observable.publish('test3'); } catch(e) { _e = e; } expect(_e).toNotEqual(null); }); it('should allow a function to be observable', function() { var f = function() { f.success({result: "Hello World!"}); }; require('raptor/listeners').makeObservable(f, null, ['success', 'error'], true /* create functions */); var result = null; f.success(function(message) { result = message.result; }); f(); expect(result).toEqual('Hello World!'); }); it('should allow an object to unsubscribe from everything', function() { var publisher1 = require('raptor/listeners').createObservable(); var publisher2 = require('raptor/listeners').createObservable(); var publisher3 = require('raptor/listeners').createObservable(); var subscriber = {}; var p1Count = 0, p2Count = 0, p3Count = 0; publisher1.subscribe('test1', function() { p1Count++; }, subscriber); publisher2.subscribe('test2', function() { p2Count++; }, subscriber); var p3Handle = publisher3.subscribe('test3', function() { p3Count++; }, subscriber); publisher1.publish('test1'); publisher2.publish('test2'); publisher3.publish('test3'); expect(p1Count).toEqual(1); expect(p2Count).toEqual(1); expect(p3Count).toEqual(1); p3Handle.unsubscribe(); require('raptor/listeners').unsubscribeFromAll(subscriber); publisher1.publish('test1'); publisher2.publish('test2'); publisher3.publish('test3'); expect(p1Count).toEqual(1); expect(p2Count).toEqual(1); expect(p3Count).toEqual(1); }); });