| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | 'use strict';var common = require('./common');var EventEmitter = require('../').EventEmitter;var once = require('../').once;var has = require('has');var assert = require('assert');function Event(type) {  this.type = type;}function EventTargetMock() {  this.events = {};  this.addEventListener = common.mustCall(this.addEventListener);  this.removeEventListener = common.mustCall(this.removeEventListener);}EventTargetMock.prototype.addEventListener = function addEventListener(name, listener, options) {  if (!(name in this.events)) {    this.events[name] = { listeners: [], options: options || {} }  }  this.events[name].listeners.push(listener);};EventTargetMock.prototype.removeEventListener = function removeEventListener(name, callback) {  if (!(name in this.events)) {    return;  }  var event = this.events[name];  var stack = event.listeners;  for (var i = 0, l = stack.length; i < l; i++) {    if (stack[i] === callback) {      stack.splice(i, 1);      if (stack.length === 0) {        delete this.events[name];      }      return;    }  }};EventTargetMock.prototype.dispatchEvent = function dispatchEvent(arg) {  if (!(arg.type in this.events)) {    return true;  }  var event = this.events[arg.type];  var stack = event.listeners.slice();  for (var i = 0, l = stack.length; i < l; i++) {    stack[i].call(null, arg);    if (event.options.once) {      this.removeEventListener(arg.type, stack[i]);    }  }  return !arg.defaultPrevented;};function onceAnEvent() {  var ee = new EventEmitter();  process.nextTick(function () {    ee.emit('myevent', 42);  });  return once(ee, 'myevent').then(function (args) {    var value = args[0]    assert.strictEqual(value, 42);    assert.strictEqual(ee.listenerCount('error'), 0);    assert.strictEqual(ee.listenerCount('myevent'), 0);  });}function onceAnEventWithTwoArgs() {  var ee = new EventEmitter();  process.nextTick(function () {    ee.emit('myevent', 42, 24);  });  return once(ee, 'myevent').then(function (value) {    assert.strictEqual(value.length, 2);    assert.strictEqual(value[0], 42);    assert.strictEqual(value[1], 24);  });}function catchesErrors() {  var ee = new EventEmitter();  var expected = new Error('kaboom');  var err;  process.nextTick(function () {    ee.emit('error', expected);  });  return once(ee, 'myevent').then(function () {    throw new Error('should reject')  }, function (err) {    assert.strictEqual(err, expected);    assert.strictEqual(ee.listenerCount('error'), 0);    assert.strictEqual(ee.listenerCount('myevent'), 0);  });}function stopListeningAfterCatchingError() {  var ee = new EventEmitter();  var expected = new Error('kaboom');  var err;  process.nextTick(function () {    ee.emit('error', expected);    ee.emit('myevent', 42, 24);  });  // process.on('multipleResolves', common.mustNotCall());  return once(ee, 'myevent').then(common.mustNotCall, function (err) {    // process.removeAllListeners('multipleResolves');    assert.strictEqual(err, expected);    assert.strictEqual(ee.listenerCount('error'), 0);    assert.strictEqual(ee.listenerCount('myevent'), 0);  });}function onceError() {  var ee = new EventEmitter();  var expected = new Error('kaboom');  process.nextTick(function () {    ee.emit('error', expected);  });  var promise = once(ee, 'error');  assert.strictEqual(ee.listenerCount('error'), 1);  return promise.then(function (args) {    var err = args[0]    assert.strictEqual(err, expected);    assert.strictEqual(ee.listenerCount('error'), 0);    assert.strictEqual(ee.listenerCount('myevent'), 0);  });}function onceWithEventTarget() {  var et = new EventTargetMock();  var event = new Event('myevent');  process.nextTick(function () {    et.dispatchEvent(event);  });  return once(et, 'myevent').then(function (args) {    var value = args[0];    assert.strictEqual(value, event);    assert.strictEqual(has(et.events, 'myevent'), false);  });}function onceWithEventTargetError() {  var et = new EventTargetMock();  var error = new Event('error');  process.nextTick(function () {    et.dispatchEvent(error);  });  return once(et, 'error').then(function (args) {    var err = args[0];    assert.strictEqual(err, error);    assert.strictEqual(has(et.events, 'error'), false);  });}function prioritizesEventEmitter() {  var ee = new EventEmitter();  ee.addEventListener = assert.fail;  ee.removeAllListeners = assert.fail;  process.nextTick(function () {    ee.emit('foo');  });  return once(ee, 'foo');}var allTests = [  onceAnEvent(),  onceAnEventWithTwoArgs(),  catchesErrors(),  stopListeningAfterCatchingError(),  onceError(),  onceWithEventTarget(),  onceWithEventTargetError(),  prioritizesEventEmitter()];var hasBrowserEventTarget = false;try {  hasBrowserEventTarget = typeof (new window.EventTarget().addEventListener) === 'function' &&    new window.Event('xyz').type === 'xyz';} catch (err) {}if (hasBrowserEventTarget) {  var onceWithBrowserEventTarget = function onceWithBrowserEventTarget() {    var et = new window.EventTarget();    var event = new window.Event('myevent');    process.nextTick(function () {      et.dispatchEvent(event);    });    return once(et, 'myevent').then(function (args) {      var value = args[0];      assert.strictEqual(value, event);      assert.strictEqual(has(et.events, 'myevent'), false);    });  }  var onceWithBrowserEventTargetError = function onceWithBrowserEventTargetError() {    var et = new window.EventTarget();    var error = new window.Event('error');    process.nextTick(function () {      et.dispatchEvent(error);    });    return once(et, 'error').then(function (args) {      var err = args[0];      assert.strictEqual(err, error);      assert.strictEqual(has(et.events, 'error'), false);    });  }  common.test.comment('Testing with browser built-in EventTarget');  allTests.push([    onceWithBrowserEventTarget(),    onceWithBrowserEventTargetError()  ]);}module.exports = Promise.all(allTests);
 |