basant307/AI_Governance_Project
048
1'use strict';2 3var common = require('./common');4var EventEmitter = require('../').EventEmitter;5var once = require('../').once;6var has = require('has');7var assert = require('assert');8 9function Event(type) {10 this.type = type;11}12 13function EventTargetMock() {14 this.events = {};15 16 this.addEventListener = common.mustCall(this.addEventListener);17 this.removeEventListener = common.mustCall(this.removeEventListener);18}19 20EventTargetMock.prototype.addEventListener = function addEventListener(name, listener, options) {21 if (!(name in this.events)) {22 this.events[name] = { listeners: [], options: options || {} }23 }24 this.events[name].listeners.push(listener);25};26 27EventTargetMock.prototype.removeEventListener = function removeEventListener(name, callback) {28 if (!(name in this.events)) {29 return;30 }31 var event = this.events[name];32 var stack = event.listeners;33 34 for (var i = 0, l = stack.length; i < l; i++) {35 if (stack[i] === callback) {36 stack.splice(i, 1);37 if (stack.length === 0) {38 delete this.events[name];39 }40 return;41 }42 }43};44 45EventTargetMock.prototype.dispatchEvent = function dispatchEvent(arg) {46 if (!(arg.type in this.events)) {47 return true;48 }49 50 var event = this.events[arg.type];51 var stack = event.listeners.slice();52 53 for (var i = 0, l = stack.length; i < l; i++) {54 stack[i].call(null, arg);55 if (event.options.once) {56 this.removeEventListener(arg.type, stack[i]);57 }58 }59 return !arg.defaultPrevented;60};61 62function onceAnEvent() {63 var ee = new EventEmitter();64 65 process.nextTick(function () {66 ee.emit('myevent', 42);67 });68 69 return once(ee, 'myevent').then(function (args) {70 var value = args[0]71 assert.strictEqual(value, 42);72 assert.strictEqual(ee.listenerCount('error'), 0);73 assert.strictEqual(ee.listenerCount('myevent'), 0);74 });75}76 77function onceAnEventWithTwoArgs() {78 var ee = new EventEmitter();79 80 process.nextTick(function () {81 ee.emit('myevent', 42, 24);82 });83 84 return once(ee, 'myevent').then(function (value) {85 assert.strictEqual(value.length, 2);86 assert.strictEqual(value[0], 42);87 assert.strictEqual(value[1], 24);88 });89}90 91function catchesErrors() {92 var ee = new EventEmitter();93 94 var expected = new Error('kaboom');95 var err;96 process.nextTick(function () {97 ee.emit('error', expected);98 });99 100 return once(ee, 'myevent').then(function () {101 throw new Error('should reject')102 }, function (err) {103 assert.strictEqual(err, expected);104 assert.strictEqual(ee.listenerCount('error'), 0);105 assert.strictEqual(ee.listenerCount('myevent'), 0);106 });107}108 109function stopListeningAfterCatchingError() {110 var ee = new EventEmitter();111 112 var expected = new Error('kaboom');113 var err;114 process.nextTick(function () {115 ee.emit('error', expected);116 ee.emit('myevent', 42, 24);117 });118 119 // process.on('multipleResolves', common.mustNotCall());120 121 return once(ee, 'myevent').then(common.mustNotCall, function (err) {122 // process.removeAllListeners('multipleResolves');123 assert.strictEqual(err, expected);124 assert.strictEqual(ee.listenerCount('error'), 0);125 assert.strictEqual(ee.listenerCount('myevent'), 0);126 });127}128 129function onceError() {130 var ee = new EventEmitter();131 132 var expected = new Error('kaboom');133 process.nextTick(function () {134 ee.emit('error', expected);135 });136 137 var promise = once(ee, 'error');138 assert.strictEqual(ee.listenerCount('error'), 1);139 return promise.then(function (args) {140 var err = args[0]141 assert.strictEqual(err, expected);142 assert.strictEqual(ee.listenerCount('error'), 0);143 assert.strictEqual(ee.listenerCount('myevent'), 0);144 });145}146 147function onceWithEventTarget() {148 var et = new EventTargetMock();149 var event = new Event('myevent');150 process.nextTick(function () {151 et.dispatchEvent(event);152 });153 return once(et, 'myevent').then(function (args) {154 var value = args[0];155 assert.strictEqual(value, event);156 assert.strictEqual(has(et.events, 'myevent'), false);157 });158}159 160function onceWithEventTargetError() {161 var et = new EventTargetMock();162 var error = new Event('error');163 process.nextTick(function () {164 et.dispatchEvent(error);165 });166 return once(et, 'error').then(function (args) {167 var err = args[0];168 assert.strictEqual(err, error);169 assert.strictEqual(has(et.events, 'error'), false);170 });171}172 173function prioritizesEventEmitter() {174 var ee = new EventEmitter();175 ee.addEventListener = assert.fail;176 ee.removeAllListeners = assert.fail;177 process.nextTick(function () {178 ee.emit('foo');179 });180 return once(ee, 'foo');181}182 183var allTests = [184 onceAnEvent(),185 onceAnEventWithTwoArgs(),186 catchesErrors(),187 stopListeningAfterCatchingError(),188 onceError(),189 onceWithEventTarget(),190 onceWithEventTargetError(),191 prioritizesEventEmitter()192];193 194var hasBrowserEventTarget = false;195try {196 hasBrowserEventTarget = typeof (new window.EventTarget().addEventListener) === 'function' &&197 new window.Event('xyz').type === 'xyz';198} catch (err) {}199 200if (hasBrowserEventTarget) {201 var onceWithBrowserEventTarget = function onceWithBrowserEventTarget() {202 var et = new window.EventTarget();203 var event = new window.Event('myevent');204 process.nextTick(function () {205 et.dispatchEvent(event);206 });207 return once(et, 'myevent').then(function (args) {208 var value = args[0];209 assert.strictEqual(value, event);210 assert.strictEqual(has(et.events, 'myevent'), false);211 });212 }213 214 var onceWithBrowserEventTargetError = function onceWithBrowserEventTargetError() {215 var et = new window.EventTarget();216 var error = new window.Event('error');217 process.nextTick(function () {218 et.dispatchEvent(error);219 });220 return once(et, 'error').then(function (args) {221 var err = args[0];222 assert.strictEqual(err, error);223 assert.strictEqual(has(et.events, 'error'), false);224 });225 }226 227 common.test.comment('Testing with browser built-in EventTarget');228 allTests.push([229 onceWithBrowserEventTarget(),230 onceWithBrowserEventTargetError()231 ]);232}233 234module.exports = Promise.all(allTests);235 