1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/addon-sdk/source/test/test-event-utils.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,282 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +'use strict'; 1.9 + 1.10 +const { on, emit } = require("sdk/event/core"); 1.11 +const { filter, map, merge, expand, pipe, stripListeners } = require("sdk/event/utils"); 1.12 +const $ = require("./event/helpers"); 1.13 + 1.14 +function isEven(x) !(x % 2) 1.15 +function inc(x) x + 1 1.16 + 1.17 +exports["test filter events"] = function(assert) { 1.18 + let input = {}; 1.19 + let evens = filter(input, isEven); 1.20 + let actual = []; 1.21 + on(evens, "data", function(e) actual.push(e)); 1.22 + 1.23 + [1, 2, 3, 4, 5, 6, 7].forEach(function(x) emit(input, "data", x)); 1.24 + 1.25 + assert.deepEqual(actual, [2, 4, 6], "only even numbers passed through"); 1.26 +}; 1.27 + 1.28 +exports["test filter emits"] = $.emits(function(input, assert) { 1.29 + let output = filter(input, isEven); 1.30 + assert(output, [1, 2, 3, 4, 5], [2, 4], "this is `output` & evens passed"); 1.31 +});; 1.32 + 1.33 +exports["test filter reg once"] = $.registerOnce(function(input, assert) { 1.34 + assert(filter(input, isEven), [1, 2, 3, 4, 5, 6], [2, 4, 6], 1.35 + "listener can be registered only once"); 1.36 +}); 1.37 + 1.38 +exports["test filter ignores new"] = $.ignoreNew(function(input, assert) { 1.39 + assert(filter(input, isEven), [1, 2, 3], [2], 1.40 + "new listener is ignored") 1.41 +}); 1.42 + 1.43 +exports["test filter is FIFO"] = $.FIFO(function(input, assert) { 1.44 + assert(filter(input, isEven), [1, 2, 3, 4], [2, 4], 1.45 + "listeners are invoked in fifo order") 1.46 +}); 1.47 + 1.48 +exports["test map events"] = function(assert) { 1.49 + let input = {}; 1.50 + let incs = map(input, inc); 1.51 + let actual = []; 1.52 + on(incs, "data", function(e) actual.push(e)); 1.53 + 1.54 + [1, 2, 3, 4].forEach(function(x) emit(input, "data", x)); 1.55 + 1.56 + assert.deepEqual(actual, [2, 3, 4, 5], "all numbers were incremented"); 1.57 +}; 1.58 + 1.59 +exports["test map emits"] = $.emits(function(input, assert) { 1.60 + let output = map(input, inc); 1.61 + assert(output, [1, 2, 3], [2, 3, 4], "this is `output` & evens passed"); 1.62 +});; 1.63 + 1.64 +exports["test map reg once"] = $.registerOnce(function(input, assert) { 1.65 + assert(map(input, inc), [1, 2, 3], [2, 3, 4], 1.66 + "listener can be registered only once"); 1.67 +}); 1.68 + 1.69 +exports["test map ignores new"] = $.ignoreNew(function(input, assert) { 1.70 + assert(map(input, inc), [1], [2], 1.71 + "new listener is ignored") 1.72 +}); 1.73 + 1.74 +exports["test map is FIFO"] = $.FIFO(function(input, assert) { 1.75 + assert(map(input, inc), [1, 2, 3, 4], [2, 3, 4, 5], 1.76 + "listeners are invoked in fifo order") 1.77 +}); 1.78 + 1.79 +exports["test merge stream[stream]"] = function(assert) { 1.80 + let a = {}, b = {}, c = {}; 1.81 + let inputs = {}; 1.82 + let actual = []; 1.83 + 1.84 + on(merge(inputs), "data", function($) actual.push($)) 1.85 + 1.86 + emit(inputs, "data", a); 1.87 + emit(a, "data", "a1"); 1.88 + emit(inputs, "data", b); 1.89 + emit(b, "data", "b1"); 1.90 + emit(a, "data", "a2"); 1.91 + emit(inputs, "data", c); 1.92 + emit(c, "data", "c1"); 1.93 + emit(c, "data", "c2"); 1.94 + emit(b, "data", "b2"); 1.95 + emit(a, "data", "a3"); 1.96 + 1.97 + assert.deepEqual(actual, ["a1", "b1", "a2", "c1", "c2", "b2", "a3"], 1.98 + "all inputs data merged into one"); 1.99 +}; 1.100 + 1.101 +exports["test merge array[stream]"] = function(assert) { 1.102 + let a = {}, b = {}, c = {}; 1.103 + let inputs = {}; 1.104 + let actual = []; 1.105 + 1.106 + on(merge([a, b, c]), "data", function($) actual.push($)) 1.107 + 1.108 + emit(a, "data", "a1"); 1.109 + emit(b, "data", "b1"); 1.110 + emit(a, "data", "a2"); 1.111 + emit(c, "data", "c1"); 1.112 + emit(c, "data", "c2"); 1.113 + emit(b, "data", "b2"); 1.114 + emit(a, "data", "a3"); 1.115 + 1.116 + assert.deepEqual(actual, ["a1", "b1", "a2", "c1", "c2", "b2", "a3"], 1.117 + "all inputs data merged into one"); 1.118 +}; 1.119 + 1.120 +exports["test merge emits"] = $.emits(function(input, assert) { 1.121 + let evens = filter(input, isEven) 1.122 + let output = merge([evens, input]); 1.123 + assert(output, [1, 2, 3], [1, 2, 2, 3], "this is `output` & evens passed"); 1.124 +}); 1.125 + 1.126 + 1.127 +exports["test merge reg once"] = $.registerOnce(function(input, assert) { 1.128 + let evens = filter(input, isEven) 1.129 + let output = merge([input, evens]); 1.130 + assert(output, [1, 2, 3, 4], [1, 2, 2, 3, 4, 4], 1.131 + "listener can be registered only once"); 1.132 +}); 1.133 + 1.134 +exports["test merge ignores new"] = $.ignoreNew(function(input, assert) { 1.135 + let evens = filter(input, isEven) 1.136 + let output = merge([input, evens]) 1.137 + assert(output, [1], [1], 1.138 + "new listener is ignored") 1.139 +}); 1.140 + 1.141 +exports["test marge is FIFO"] = $.FIFO(function(input, assert) { 1.142 + let evens = filter(input, isEven) 1.143 + let output = merge([input, evens]) 1.144 + 1.145 + assert(output, [1, 2, 3, 4], [1, 2, 2, 3, 4, 4], 1.146 + "listeners are invoked in fifo order") 1.147 +}); 1.148 + 1.149 +exports["test expand"] = function(assert) { 1.150 + let a = {}, b = {}, c = {}; 1.151 + let inputs = {}; 1.152 + let actual = []; 1.153 + 1.154 + on(expand(inputs, function($) $()), "data", function($) actual.push($)) 1.155 + 1.156 + emit(inputs, "data", function() a); 1.157 + emit(a, "data", "a1"); 1.158 + emit(inputs, "data", function() b); 1.159 + emit(b, "data", "b1"); 1.160 + emit(a, "data", "a2"); 1.161 + emit(inputs, "data", function() c); 1.162 + emit(c, "data", "c1"); 1.163 + emit(c, "data", "c2"); 1.164 + emit(b, "data", "b2"); 1.165 + emit(a, "data", "a3"); 1.166 + 1.167 + assert.deepEqual(actual, ["a1", "b1", "a2", "c1", "c2", "b2", "a3"], 1.168 + "all inputs data merged into one"); 1.169 +}; 1.170 + 1.171 +exports["test pipe"] = function (assert, done) { 1.172 + let src = {}; 1.173 + let dest = {}; 1.174 + 1.175 + let aneventCount = 0, multiargsCount = 0; 1.176 + let wildcardCount = {}; 1.177 + 1.178 + on(dest, 'an-event', arg => { 1.179 + assert.equal(arg, 'my-arg', 'piped argument to event'); 1.180 + ++aneventCount; 1.181 + check(); 1.182 + }); 1.183 + on(dest, 'multiargs', (...data) => { 1.184 + assert.equal(data[0], 'a', 'multiple arguments passed via pipe'); 1.185 + assert.equal(data[1], 'b', 'multiple arguments passed via pipe'); 1.186 + assert.equal(data[2], 'c', 'multiple arguments passed via pipe'); 1.187 + ++multiargsCount; 1.188 + check(); 1.189 + }); 1.190 + 1.191 + on(dest, '*', (name, ...data) => { 1.192 + wildcardCount[name] = (wildcardCount[name] || 0) + 1; 1.193 + if (name === 'multiargs') { 1.194 + assert.equal(data[0], 'a', 'multiple arguments passed via pipe, wildcard'); 1.195 + assert.equal(data[1], 'b', 'multiple arguments passed via pipe, wildcard'); 1.196 + assert.equal(data[2], 'c', 'multiple arguments passed via pipe, wildcard'); 1.197 + } 1.198 + if (name === 'an-event') 1.199 + assert.equal(data[0], 'my-arg', 'argument passed via pipe, wildcard'); 1.200 + check(); 1.201 + }); 1.202 + 1.203 + pipe(src, dest); 1.204 + 1.205 + for (let i = 0; i < 3; i++) 1.206 + emit(src, 'an-event', 'my-arg'); 1.207 + 1.208 + emit(src, 'multiargs', 'a', 'b', 'c'); 1.209 + 1.210 + function check () { 1.211 + if (aneventCount === 3 && multiargsCount === 1 && 1.212 + wildcardCount['an-event'] === 3 && 1.213 + wildcardCount['multiargs'] === 1) 1.214 + done(); 1.215 + } 1.216 +}; 1.217 + 1.218 +exports["test pipe multiple targets"] = function (assert) { 1.219 + let src1 = {}; 1.220 + let src2 = {}; 1.221 + let middle = {}; 1.222 + let dest = {}; 1.223 + 1.224 + pipe(src1, middle); 1.225 + pipe(src2, middle); 1.226 + pipe(middle, dest); 1.227 + 1.228 + let middleFired = 0; 1.229 + let destFired = 0; 1.230 + let src1Fired = 0; 1.231 + let src2Fired = 0; 1.232 + 1.233 + on(src1, '*', () => src1Fired++); 1.234 + on(src2, '*', () => src2Fired++); 1.235 + on(middle, '*', () => middleFired++); 1.236 + on(dest, '*', () => destFired++); 1.237 + 1.238 + emit(src1, 'ev'); 1.239 + assert.equal(src1Fired, 1, 'event triggers in source in pipe chain'); 1.240 + assert.equal(middleFired, 1, 'event passes through the middle of pipe chain'); 1.241 + assert.equal(destFired, 1, 'event propagates to end of pipe chain'); 1.242 + assert.equal(src2Fired, 0, 'event does not fire on alternative chain routes'); 1.243 + 1.244 + emit(src2, 'ev'); 1.245 + assert.equal(src2Fired, 1, 'event triggers in source in pipe chain'); 1.246 + assert.equal(middleFired, 2, 1.247 + 'event passes through the middle of pipe chain from different src'); 1.248 + assert.equal(destFired, 2, 1.249 + 'event propagates to end of pipe chain from different src'); 1.250 + assert.equal(src1Fired, 1, 'event does not fire on alternative chain routes'); 1.251 + 1.252 + emit(middle, 'ev'); 1.253 + assert.equal(middleFired, 3, 1.254 + 'event triggers in source of pipe chain'); 1.255 + assert.equal(destFired, 3, 1.256 + 'event propagates to end of pipe chain from middle src'); 1.257 + assert.equal(src1Fired, 1, 'event does not fire on alternative chain routes'); 1.258 + assert.equal(src2Fired, 1, 'event does not fire on alternative chain routes'); 1.259 +}; 1.260 + 1.261 +exports['test stripListeners'] = function (assert) { 1.262 + var options = { 1.263 + onAnEvent: noop1, 1.264 + onMessage: noop2, 1.265 + verb: noop1, 1.266 + value: 100 1.267 + }; 1.268 + 1.269 + var stripped = stripListeners(options); 1.270 + assert.ok(stripped !== options, 'stripListeners should return a new object'); 1.271 + assert.equal(options.onAnEvent, noop1, 'stripListeners does not affect original'); 1.272 + assert.equal(options.onMessage, noop2, 'stripListeners does not affect original'); 1.273 + assert.equal(options.verb, noop1, 'stripListeners does not affect original'); 1.274 + assert.equal(options.value, 100, 'stripListeners does not affect original'); 1.275 + 1.276 + assert.ok(!stripped.onAnEvent, 'stripListeners removes `on*` values'); 1.277 + assert.ok(!stripped.onMessage, 'stripListeners removes `on*` values'); 1.278 + assert.equal(stripped.verb, noop1, 'stripListeners leaves not `on*` values'); 1.279 + assert.equal(stripped.value, 100, 'stripListeners leaves not `on*` values'); 1.280 + 1.281 + function noop1 () {} 1.282 + function noop2 () {} 1.283 +}; 1.284 + 1.285 +require('test').run(exports);