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