// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.

import events, { addAbortListener, EventEmitter } from "node:events";

EventEmitter.captureRejections = true;

Deno.test("regression #20441", async () => {
  const { promise, resolve } = Promise.withResolvers<void>();

  const ee = new EventEmitter();

  ee.on("foo", function () {
    const p = new Promise((_resolve, reject) => {
      setTimeout(() => {
        reject();
      }, 100);
    });
    return p;
  });

  ee.on("error", function (_) {
    resolve();
  });

  ee.emit("foo");
  await promise;
});

Deno.test("eventemitter async resource", () => {
  // @ts-ignore: @types/node is outdated
  class Foo extends events.EventEmitterAsyncResource {}

  const foo = new Foo();
  // @ts-ignore: @types/node is outdated
  foo.emit("bar");
});

Deno.test("addAbortListener", async () => {
  const { promise, resolve } = Promise.withResolvers<void>();
  const abortController = new AbortController();
  addAbortListener(abortController.signal, () => {
    resolve();
  });
  abortController.abort();
  await promise;
});