'use strict';
const common = require('../common');
const assert = require('assert');
const dc = require('diagnostics_channel');
const { pathToFileURL } = require('url');

const trace = dc.tracingChannel('module.import');
const events = [];
let lastEvent;

function track(name) {
  return common.mustCall((event) => {
    // Verify every event after the first is the same object
    if (events.length) {
      assert.strictEqual(event, lastEvent);
    }
    lastEvent = event;

    events.push({ name, ...event });
  });
}

trace.subscribe({
  start: common.mustCall(track('start')),
  end: common.mustCall(track('end')),
  asyncStart: common.mustCall(track('asyncStart')),
  asyncEnd: common.mustCall(track('asyncEnd')),
  error: common.mustCall(track('error')),
});

assert.rejects(import('does-not-exist'), (error) => {
  const expectedParentURL = pathToFileURL(module.filename).href;
  // Verify order and contents of each event
  assert.deepStrictEqual(events, [
    {
      name: 'start',
      parentURL: expectedParentURL,
      url: 'does-not-exist',
    },
    {
      name: 'end',
      parentURL: expectedParentURL,
      url: 'does-not-exist',
    },
    {
      name: 'error',
      parentURL: expectedParentURL,
      url: 'does-not-exist',
      error,
    },
    {
      name: 'asyncStart',
      parentURL: expectedParentURL,
      url: 'does-not-exist',
      error,
    },
    {
      name: 'asyncEnd',
      parentURL: expectedParentURL,
      url: 'does-not-exist',
      error,
    },
  ]);
  return true;
}).then(common.mustCall());
