'use strict';
require('../common');
const assert = require('assert');
const url = require('url');

function createWithNoPrototype(properties = []) {
  const noProto = Object.create(null);
  properties.forEach((property) => {
    noProto[property.key] = property.value;
  });
  return noProto;
}

function check(actual, expected) {
  assert.notStrictEqual(Object.getPrototypeOf(actual), Object.prototype);
  assert.deepStrictEqual(Object.keys(actual).sort(),
                         Object.keys(expected).sort());
  Object.keys(expected).forEach(function(key) {
    assert.deepStrictEqual(actual[key], expected[key]);
  });
}

const parseTestsWithQueryString = {
  '/foo/bar?baz=quux#frag': {
    href: '/foo/bar?baz=quux#frag',
    hash: '#frag',
    search: '?baz=quux',
    query: createWithNoPrototype([{ key: 'baz', value: 'quux' }]),
    pathname: '/foo/bar',
    path: '/foo/bar?baz=quux'
  },
  'http://example.com': {
    href: 'http://example.com/',
    protocol: 'http:',
    slashes: true,
    host: 'example.com',
    hostname: 'example.com',
    query: createWithNoPrototype(),
    search: null,
    pathname: '/',
    path: '/'
  },
  '/example': {
    protocol: null,
    slashes: null,
    auth: undefined,
    host: null,
    port: null,
    hostname: null,
    hash: null,
    search: null,
    query: createWithNoPrototype(),
    pathname: '/example',
    path: '/example',
    href: '/example'
  },
  '/example?query=value': {
    protocol: null,
    slashes: null,
    auth: undefined,
    host: null,
    port: null,
    hostname: null,
    hash: null,
    search: '?query=value',
    query: createWithNoPrototype([{ key: 'query', value: 'value' }]),
    pathname: '/example',
    path: '/example?query=value',
    href: '/example?query=value'
  }
};
for (const u in parseTestsWithQueryString) {
  const actual = url.parse(u, true);
  const expected = Object.assign(new url.Url(), parseTestsWithQueryString[u]);
  for (const i in actual) {
    if (actual[i] === null && expected[i] === undefined) {
      expected[i] = null;
    }
  }

  const properties = Object.keys(actual).sort();
  assert.deepStrictEqual(properties, Object.keys(expected).sort());
  properties.forEach((property) => {
    if (property === 'query') {
      check(actual[property], expected[property]);
    } else {
      assert.deepStrictEqual(actual[property], expected[property]);
    }
  });
}
