11cb0ef41Sopenharmony_ci// Flags: --expose-internals --no-warnings 21cb0ef41Sopenharmony_ci'use strict'; 31cb0ef41Sopenharmony_ci 41cb0ef41Sopenharmony_ciconst common = require('../common'); 51cb0ef41Sopenharmony_ciconst { NodeEventTarget } = require('internal/event_target'); 61cb0ef41Sopenharmony_ci 71cb0ef41Sopenharmony_ciconst { 81cb0ef41Sopenharmony_ci deepStrictEqual, 91cb0ef41Sopenharmony_ci ok, 101cb0ef41Sopenharmony_ci strictEqual, 111cb0ef41Sopenharmony_ci throws, 121cb0ef41Sopenharmony_ci} = require('assert'); 131cb0ef41Sopenharmony_ci 141cb0ef41Sopenharmony_ciconst { on } = require('events'); 151cb0ef41Sopenharmony_ci 161cb0ef41Sopenharmony_ci{ 171cb0ef41Sopenharmony_ci const eventTarget = new NodeEventTarget(); 181cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 0); 191cb0ef41Sopenharmony_ci deepStrictEqual(eventTarget.eventNames(), []); 201cb0ef41Sopenharmony_ci 211cb0ef41Sopenharmony_ci const ev1 = common.mustCall(function(event) { 221cb0ef41Sopenharmony_ci strictEqual(event.type, 'foo'); 231cb0ef41Sopenharmony_ci strictEqual(this, eventTarget); 241cb0ef41Sopenharmony_ci }, 2); 251cb0ef41Sopenharmony_ci 261cb0ef41Sopenharmony_ci const ev2 = { 271cb0ef41Sopenharmony_ci handleEvent: common.mustCall(function(event) { 281cb0ef41Sopenharmony_ci strictEqual(event.type, 'foo'); 291cb0ef41Sopenharmony_ci strictEqual(this, ev2); 301cb0ef41Sopenharmony_ci }) 311cb0ef41Sopenharmony_ci }; 321cb0ef41Sopenharmony_ci 331cb0ef41Sopenharmony_ci eventTarget.addEventListener('foo', ev1); 341cb0ef41Sopenharmony_ci eventTarget.addEventListener('foo', ev2, { once: true }); 351cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 2); 361cb0ef41Sopenharmony_ci ok(eventTarget.dispatchEvent(new Event('foo'))); 371cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 1); 381cb0ef41Sopenharmony_ci eventTarget.dispatchEvent(new Event('foo')); 391cb0ef41Sopenharmony_ci 401cb0ef41Sopenharmony_ci eventTarget.removeEventListener('foo', ev1); 411cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 0); 421cb0ef41Sopenharmony_ci eventTarget.dispatchEvent(new Event('foo')); 431cb0ef41Sopenharmony_ci} 441cb0ef41Sopenharmony_ci 451cb0ef41Sopenharmony_ci{ 461cb0ef41Sopenharmony_ci const eventTarget = new NodeEventTarget(); 471cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 0); 481cb0ef41Sopenharmony_ci deepStrictEqual(eventTarget.eventNames(), []); 491cb0ef41Sopenharmony_ci 501cb0ef41Sopenharmony_ci const ev1 = common.mustCall((event) => { 511cb0ef41Sopenharmony_ci strictEqual(event.type, 'foo'); 521cb0ef41Sopenharmony_ci }, 2); 531cb0ef41Sopenharmony_ci 541cb0ef41Sopenharmony_ci const ev2 = { 551cb0ef41Sopenharmony_ci handleEvent: common.mustCall((event) => { 561cb0ef41Sopenharmony_ci strictEqual(event.type, 'foo'); 571cb0ef41Sopenharmony_ci }) 581cb0ef41Sopenharmony_ci }; 591cb0ef41Sopenharmony_ci 601cb0ef41Sopenharmony_ci strictEqual(eventTarget.on('foo', ev1), eventTarget); 611cb0ef41Sopenharmony_ci strictEqual(eventTarget.once('foo', ev2, { once: true }), eventTarget); 621cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 2); 631cb0ef41Sopenharmony_ci eventTarget.dispatchEvent(new Event('foo')); 641cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 1); 651cb0ef41Sopenharmony_ci eventTarget.dispatchEvent(new Event('foo')); 661cb0ef41Sopenharmony_ci 671cb0ef41Sopenharmony_ci strictEqual(eventTarget.off('foo', ev1), eventTarget); 681cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 0); 691cb0ef41Sopenharmony_ci eventTarget.dispatchEvent(new Event('foo')); 701cb0ef41Sopenharmony_ci} 711cb0ef41Sopenharmony_ci 721cb0ef41Sopenharmony_ci{ 731cb0ef41Sopenharmony_ci const eventTarget = new NodeEventTarget(); 741cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 0); 751cb0ef41Sopenharmony_ci deepStrictEqual(eventTarget.eventNames(), []); 761cb0ef41Sopenharmony_ci 771cb0ef41Sopenharmony_ci const ev1 = common.mustCall((event) => { 781cb0ef41Sopenharmony_ci strictEqual(event.type, 'foo'); 791cb0ef41Sopenharmony_ci }, 2); 801cb0ef41Sopenharmony_ci 811cb0ef41Sopenharmony_ci const ev2 = { 821cb0ef41Sopenharmony_ci handleEvent: common.mustCall((event) => { 831cb0ef41Sopenharmony_ci strictEqual(event.type, 'foo'); 841cb0ef41Sopenharmony_ci }) 851cb0ef41Sopenharmony_ci }; 861cb0ef41Sopenharmony_ci 871cb0ef41Sopenharmony_ci eventTarget.addListener('foo', ev1); 881cb0ef41Sopenharmony_ci eventTarget.once('foo', ev2, { once: true }); 891cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 2); 901cb0ef41Sopenharmony_ci eventTarget.dispatchEvent(new Event('foo')); 911cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 1); 921cb0ef41Sopenharmony_ci eventTarget.dispatchEvent(new Event('foo')); 931cb0ef41Sopenharmony_ci 941cb0ef41Sopenharmony_ci eventTarget.removeListener('foo', ev1); 951cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 0); 961cb0ef41Sopenharmony_ci eventTarget.dispatchEvent(new Event('foo')); 971cb0ef41Sopenharmony_ci} 981cb0ef41Sopenharmony_ci 991cb0ef41Sopenharmony_ci{ 1001cb0ef41Sopenharmony_ci const eventTarget = new NodeEventTarget(); 1011cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 0); 1021cb0ef41Sopenharmony_ci deepStrictEqual(eventTarget.eventNames(), []); 1031cb0ef41Sopenharmony_ci 1041cb0ef41Sopenharmony_ci // Won't actually be called. 1051cb0ef41Sopenharmony_ci const ev1 = () => {}; 1061cb0ef41Sopenharmony_ci 1071cb0ef41Sopenharmony_ci // Won't actually be called. 1081cb0ef41Sopenharmony_ci const ev2 = { handleEvent() {} }; 1091cb0ef41Sopenharmony_ci 1101cb0ef41Sopenharmony_ci eventTarget.addListener('foo', ev1); 1111cb0ef41Sopenharmony_ci eventTarget.addEventListener('foo', ev1); 1121cb0ef41Sopenharmony_ci eventTarget.once('foo', ev2, { once: true }); 1131cb0ef41Sopenharmony_ci eventTarget.once('foo', ev2, { once: false }); 1141cb0ef41Sopenharmony_ci eventTarget.on('bar', ev1); 1151cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 2); 1161cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('bar'), 1); 1171cb0ef41Sopenharmony_ci deepStrictEqual(eventTarget.eventNames(), ['foo', 'bar']); 1181cb0ef41Sopenharmony_ci strictEqual(eventTarget.removeAllListeners('foo'), eventTarget); 1191cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 0); 1201cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('bar'), 1); 1211cb0ef41Sopenharmony_ci deepStrictEqual(eventTarget.eventNames(), ['bar']); 1221cb0ef41Sopenharmony_ci strictEqual(eventTarget.removeAllListeners(), eventTarget); 1231cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('foo'), 0); 1241cb0ef41Sopenharmony_ci strictEqual(eventTarget.listenerCount('bar'), 0); 1251cb0ef41Sopenharmony_ci deepStrictEqual(eventTarget.eventNames(), []); 1261cb0ef41Sopenharmony_ci} 1271cb0ef41Sopenharmony_ci 1281cb0ef41Sopenharmony_ci{ 1291cb0ef41Sopenharmony_ci const target = new NodeEventTarget(); 1301cb0ef41Sopenharmony_ci 1311cb0ef41Sopenharmony_ci process.on('warning', common.mustCall((warning) => { 1321cb0ef41Sopenharmony_ci ok(warning instanceof Error); 1331cb0ef41Sopenharmony_ci strictEqual(warning.name, 'MaxListenersExceededWarning'); 1341cb0ef41Sopenharmony_ci strictEqual(warning.target, target); 1351cb0ef41Sopenharmony_ci strictEqual(warning.count, 2); 1361cb0ef41Sopenharmony_ci strictEqual(warning.type, 'foo'); 1371cb0ef41Sopenharmony_ci ok(warning.message.includes( 1381cb0ef41Sopenharmony_ci '2 foo listeners added to NodeEventTarget')); 1391cb0ef41Sopenharmony_ci })); 1401cb0ef41Sopenharmony_ci 1411cb0ef41Sopenharmony_ci strictEqual(target.getMaxListeners(), NodeEventTarget.defaultMaxListeners); 1421cb0ef41Sopenharmony_ci target.setMaxListeners(1); 1431cb0ef41Sopenharmony_ci target.on('foo', () => {}); 1441cb0ef41Sopenharmony_ci target.on('foo', () => {}); 1451cb0ef41Sopenharmony_ci} 1461cb0ef41Sopenharmony_ci{ 1471cb0ef41Sopenharmony_ci // Test NodeEventTarget emit 1481cb0ef41Sopenharmony_ci const emitter = new NodeEventTarget(); 1491cb0ef41Sopenharmony_ci emitter.addEventListener('foo', common.mustCall((e) => { 1501cb0ef41Sopenharmony_ci strictEqual(e.type, 'foo'); 1511cb0ef41Sopenharmony_ci strictEqual(e.detail, 'bar'); 1521cb0ef41Sopenharmony_ci ok(e instanceof Event); 1531cb0ef41Sopenharmony_ci }), { once: true }); 1541cb0ef41Sopenharmony_ci emitter.once('foo', common.mustCall((e, droppedAdditionalArgument) => { 1551cb0ef41Sopenharmony_ci strictEqual(e, 'bar'); 1561cb0ef41Sopenharmony_ci strictEqual(droppedAdditionalArgument, undefined); 1571cb0ef41Sopenharmony_ci })); 1581cb0ef41Sopenharmony_ci emitter.emit('foo', 'bar', 'baz'); 1591cb0ef41Sopenharmony_ci} 1601cb0ef41Sopenharmony_ci{ 1611cb0ef41Sopenharmony_ci // Test NodeEventTarget emit unsupported usage 1621cb0ef41Sopenharmony_ci const emitter = new NodeEventTarget(); 1631cb0ef41Sopenharmony_ci throws(() => { 1641cb0ef41Sopenharmony_ci emitter.emit(); 1651cb0ef41Sopenharmony_ci }, /ERR_INVALID_ARG_TYPE/); 1661cb0ef41Sopenharmony_ci} 1671cb0ef41Sopenharmony_ci 1681cb0ef41Sopenharmony_ci(async () => { 1691cb0ef41Sopenharmony_ci // test NodeEventTarget async-iterability 1701cb0ef41Sopenharmony_ci const emitter = new NodeEventTarget(); 1711cb0ef41Sopenharmony_ci const interval = setInterval(() => { 1721cb0ef41Sopenharmony_ci emitter.dispatchEvent(new Event('foo')); 1731cb0ef41Sopenharmony_ci }, 0); 1741cb0ef41Sopenharmony_ci let count = 0; 1751cb0ef41Sopenharmony_ci for await (const [ item ] of on(emitter, 'foo')) { 1761cb0ef41Sopenharmony_ci count++; 1771cb0ef41Sopenharmony_ci strictEqual(item.type, 'foo'); 1781cb0ef41Sopenharmony_ci if (count > 5) { 1791cb0ef41Sopenharmony_ci break; 1801cb0ef41Sopenharmony_ci } 1811cb0ef41Sopenharmony_ci } 1821cb0ef41Sopenharmony_ci clearInterval(interval); 1831cb0ef41Sopenharmony_ci})().then(common.mustCall()); 184