diff options
Diffstat (limited to 'addon-sdk/source/test/event')
-rw-r--r-- | addon-sdk/source/test/event/helpers.js | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/addon-sdk/source/test/event/helpers.js b/addon-sdk/source/test/event/helpers.js new file mode 100644 index 000000000..d0d63d46f --- /dev/null +++ b/addon-sdk/source/test/event/helpers.js @@ -0,0 +1,112 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const { on, once, off, emit, count } = require("sdk/event/core"); + +const { setImmediate, setTimeout } = require("sdk/timers"); +const { defer } = require("sdk/core/promise"); + +/** + * Utility function that returns a promise once the specified event's `type` + * is emitted on the given `target`, or the delay specified is passed. + * + * @param {Object|Number} [target] + * The delay to wait, or the object that receives the event. + * If not given, the function returns a promise that will be resolved + * as soon as possible. + * @param {String} [type] + * A string representing the event type to waiting for. + * @param {Boolean} [capture] + * If `true`, `capture` indicates that the user wishes to initiate capture. + * + * @returns {Promise} + * A promise resolved once the delay given is passed, or the object + * receives the event specified + */ +const wait = function(target, type, capture) { + let { promise, resolve, reject } = defer(); + + if (!arguments.length) { + setImmediate(resolve); + } + else if (typeof(target) === "number") { + setTimeout(resolve, target); + } + else if (typeof(target.once) === "function") { + target.once(type, resolve); + } + else if (typeof(target.addEventListener) === "function") { + target.addEventListener(type, function listener(...args) { + this.removeEventListener(type, listener, capture); + resolve(...args); + }, capture); + } + else if (typeof(target) === "object" && target !== null) { + once(target, type, resolve); + } + else { + reject('Invalid target given.'); + } + + return promise; +}; +exports.wait = wait; + +function scenario(setup) { + return function(unit) { + return function(assert) { + let actual = []; + let input = {}; + unit(input, function(output, events, expected, message) { + let result = setup(output, expected, actual); + + events.forEach(event => emit(input, "data", event)); + + assert.deepEqual(actual, result, message); + }); + } + } +} + +exports.emits = scenario(function(output, expected, actual) { + on(output, "data", function(data) { + return actual.push(this, data); + }); + + return expected.reduce(($$, $) => $$.concat(output, $), []); +}); + +exports.registerOnce = scenario(function(output, expected, actual) { + function listener(data) { + return actual.push(data); + } + on(output, "data", listener); + on(output, "data", listener); + on(output, "data", listener); + + return expected; +}); + +exports.ignoreNew = scenario(function(output, expected, actual) { + on(output, "data", function(data) { + actual.push(data + "#1"); + on(output, "data", function(data) { + actual.push(data + "#2"); + }); + }); + + return expected.map($ => $ + "#1"); +}); + +exports.FIFO = scenario(function(target, expected, actual) { + on(target, "data", $ => actual.push($ + "#1")); + on(target, "data", $ => actual.push($ + "#2")); + on(target, "data", $ => actual.push($ + "#3")); + + return expected.reduce(function(result, value) { + return result.concat(value + "#1", value + "#2", value + "#3"); + }, []); +}); |