@ 261105.16
current
'use strict';

require('../common');

const assert = require('assert');
const { URLPattern } = require('url');

{
  assert.deepStrictEqual(
    Object.getOwnPropertyDescriptor(URLPattern.prototype, Symbol.toStringTag),
    {
      configurable: true,
      enumerable: false,
      value: 'URLPattern',
      writable: false,
    });
  assert.strictEqual(
    Object.prototype.toString.call(new URLPattern()),
    '[object URLPattern]');
}

// Verify that if an error is thrown while accessing any of the
// init options, the error is appropriately propagated.
assert.throws(() => {
  new URLPattern({
    get protocol() {
      throw new Error('boom');
    }
  });
}, {
  message: 'boom',
});

// Verify that if an error is thrown while accessing the ignoreCase
// option, the error is appropriately propagated.
assert.throws(() => {
  new URLPattern({}, { get ignoreCase() {
    throw new Error('boom');
  } });
}, {
  message: 'boom'
});

{
  const result = new URLPattern({ pathname: '/:value' })
    .exec('https://example.com/test');

  assert.deepStrictEqual(Object.keys(result), [
    'hash',
    'hostname',
    'inputs',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username',
  ]);
  assert.deepStrictEqual(Object.keys(result.pathname), [
    'groups',
    'input',
  ]);
  assert.strictEqual(result.hostname.input, 'example.com');
  assert.strictEqual(result.pathname.input, '/test');
  assert.strictEqual(result.pathname.groups.value, 'test');
}

{
  const accessed = [];
  const expected = [
    'baseURL',
    'hash',
    'hostname',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username',
  ];
  const init = new Proxy({}, {
    get(target, name, receiver) {
      accessed.push(name);
      return Reflect.get(target, name, receiver);
    },
  });

  new URLPattern(init);
  assert.deepStrictEqual(accessed, expected);
}

{
  const input = new URLPattern({ pathname: '/x' })
    .exec({
      protocol: 'https',
      pathname: '/x',
      username: undefined,
    }).inputs[0];

  assert.deepStrictEqual(Object.keys(input), ['pathname', 'protocol']);
  assert.strictEqual('username' in input, false);
  assert.deepStrictEqual({ ...input }, {
    pathname: '/x',
    protocol: 'https',
  });
}