addon-sdk/source/test/test-event-target.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 'use strict';
     7 const { emit } = require('sdk/event/core');
     8 const { EventTarget } = require('sdk/event/target');
     9 const { Loader } = require('sdk/test/loader');
    11 exports['test add a listener'] = function(assert) {
    12   let events = [ { name: 'event#1' }, 'event#2' ];
    13   let target = EventTarget();
    15   target.on('message', function(message) {
    16     assert.equal(this, target, 'this is a target object');
    17     assert.equal(message, events.shift(), 'message is emitted event');
    18   });
    20   emit(target, 'message', events[0]);
    21   emit(target, 'message', events[0]);
    22 };
    24 exports['test pass in listeners'] = function(assert) {
    25   let actual = [ ];
    26   let target = EventTarget({
    27     onMessage: function onMessage(message) {
    28       assert.equal(this, target, 'this is an event target');
    29       actual.push(1);
    30     },
    31     onFoo: null,
    32     onbla: function() {
    33       assert.fail('`onbla` is not supposed to be called');
    34     }
    35   });
    36   target.on('message', function(message) {
    37     assert.equal(this, target, 'this is an event target');
    38     actual.push(2);
    39   });
    41   emit(target, 'message');
    42   emit(target, 'missing');
    44   assert.deepEqual([ 1, 2 ], actual, 'all listeners trigerred in right order');
    45 };
    47 exports['test that listener is unique per type'] = function(assert) {
    48   let actual = []
    49   let target = EventTarget();
    50   function listener() { actual.push(1) }
    51   target.on('message', listener);
    52   target.on('message', listener);
    53   target.on('message', listener);
    54   target.on('foo', listener);
    55   target.on('foo', listener);
    57   emit(target, 'message');
    58   assert.deepEqual([ 1 ], actual, 'only one message listener added');
    59   emit(target, 'foo');
    60   assert.deepEqual([ 1, 1 ], actual, 'same listener added for other event');
    61 };
    63 exports['test event type matters'] = function(assert) {
    64   let target = EventTarget();
    65   target.on('message', function() {
    66     assert.fail('no event is expected');
    67   });
    68   target.on('done', function() {
    69     assert.pass('event is emitted');
    70   });
    72   emit(target, 'foo');
    73   emit(target, 'done');
    74 };
    76 exports['test all arguments are pasesd'] = function(assert) {
    77   let foo = { name: 'foo' }, bar = 'bar';
    78   let target = EventTarget();
    79   target.on('message', function(a, b) {
    80     assert.equal(a, foo, 'first argument passed');
    81     assert.equal(b, bar, 'second argument passed');
    82   });
    83   emit(target, 'message', foo, bar);
    84 };
    86 exports['test no side-effects in emit'] = function(assert) {
    87   let target = EventTarget();
    88   target.on('message', function() {
    89     assert.pass('first listener is called');
    90     target.on('message', function() {
    91       assert.fail('second listener is called');
    92     });
    93   });
    94   emit(target, 'message');
    95 };
    97 exports['test order of propagation'] = function(assert) {
    98   let actual = [];
    99   let target = EventTarget();
   100   target.on('message', function() { actual.push(1); });
   101   target.on('message', function() { actual.push(2); });
   102   target.on('message', function() { actual.push(3); });
   103   emit(target, 'message');
   104   assert.deepEqual([ 1, 2, 3 ], actual, 'called in order they were added');
   105 };
   107 exports['test remove a listener'] = function(assert) {
   108   let target = EventTarget();
   109   let actual = [];
   110   target.on('message', function listener() {
   111     actual.push(1);
   112     target.on('message', function() {
   113       target.removeListener('message', listener);
   114       actual.push(2);
   115     })
   116   });
   118   target.off('message'); // must do nothing.
   119   emit(target, 'message');
   120   assert.deepEqual([ 1 ], actual, 'first listener called');
   121   emit(target, 'message');
   122   assert.deepEqual([ 1, 1, 2 ], actual, 'second listener called');
   123   emit(target, 'message');
   124   assert.deepEqual([ 1, 1, 2, 2, 2 ], actual, 'first listener removed');
   125 };
   127 exports['test error handling'] = function(assert) {
   128   let target = EventTarget();
   129   let error = Error('boom!');
   131   target.on('message', function() { throw error; })
   132   target.on('error', function(boom) {
   133     assert.equal(boom, error, 'thrown exception causes error event');
   134   });
   135   emit(target, 'message');
   136 };
   138 exports['test unhandled errors'] = function(assert) {
   139   let exceptions = [];
   140   let loader = Loader(module);
   141   let { emit } = loader.require('sdk/event/core');
   142   let { EventTarget } = loader.require('sdk/event/target');
   143   Object.defineProperties(loader.sandbox('sdk/event/core'), {
   144     console: { value: {
   145       exception: function(e) {
   146         exceptions.push(e);
   147       }
   148     }}
   149   });
   150   let target = EventTarget();
   151   let boom = Error('Boom!');
   152   let drax = Error('Draax!!');
   154   target.on('message', function() { throw boom; });
   156   emit(target, 'message');
   157   assert.ok(~String(exceptions[0]).indexOf('Boom!'),
   158             'unhandled exception is logged');
   160   target.on('error', function() { throw drax; });
   161   emit(target, 'message');
   162   assert.ok(~String(exceptions[1]).indexOf('Draax!'),
   163             'error in error handler is logged');
   164 };
   166 exports['test target is chainable'] = function (assert, done) {
   167   let loader = Loader(module);
   168   let exceptions = [];
   169   let { EventTarget } = loader.require('sdk/event/target');
   170   let { emit } = loader.require('sdk/event/core');
   171   Object.defineProperties(loader.sandbox('sdk/event/core'), {
   172     console: { value: {
   173       exception: function(e) {
   174         exceptions.push(e);
   175       }
   176     }}
   177   });
   179   let emitter = EventTarget();
   180   let boom = Error('Boom');
   181   let onceCalled = 0;
   183   emitter.once('oneTime', function () {
   184     assert.equal(++onceCalled, 1, 'once event called only once');
   185   }).on('data', function (message) {
   186     assert.equal(message, 'message', 'handles event');
   187     emit(emitter, 'oneTime');
   188     emit(emitter, 'data2', 'message2');
   189   }).on('phony', function () {
   190     assert.fail('removeListener does not remove chained event');
   191   }).removeListener('phony')
   192   .on('data2', function (message) {
   193     assert.equal(message, 'message2', 'handle chained event');
   194     emit(emitter, 'oneTime');
   195     throw boom;
   196   }).on('error', function (error) {
   197     assert.equal(error, boom, 'error handled in chained event');
   198     done();
   199   });
   201   emit(emitter, 'data', 'message');
   202 };
   204 require('test').run(exports);

mercurial