test: move custom WHATWG URL tests into separate files
To enable automatic update of WPT, move all our custom WHATWG URL tests that are not present in the upstream into files starting with `test-whatwg-url-custom-`, so it's easier to identify test cases that can be upstreamed and test cases that should be rolled into our repo (possibly with automation). PR-URL: https://github.com/nodejs/node/pull/22442 Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com>
This commit is contained in:
parent
16cffb0d48
commit
6dd694c125
@ -1,4 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
const common = require('../common');
|
const common = require('../common');
|
||||||
|
|
||||||
if (!common.hasIntl)
|
if (!common.hasIntl)
|
||||||
@ -7,9 +10,8 @@ if (!common.hasIntl)
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const { domainToASCII, domainToUnicode } = require('url');
|
const { domainToASCII, domainToUnicode } = require('url');
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
const tests = require('../fixtures/url-idna');
|
||||||
const tests = require('../fixtures/url-idna.js');
|
const wptToASCIITests = require('../fixtures/url-toascii');
|
||||||
const wptToASCIITests = require('../fixtures/url-toascii.js');
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const expectedError = common.expectsError(
|
const expectedError = common.expectsError(
|
@ -1,5 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const { URL, URLSearchParams } = require('url');
|
const { URL, URLSearchParams } = require('url');
|
@ -1,5 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
const common = require('../common');
|
const common = require('../common');
|
||||||
if (!common.hasIntl) {
|
if (!common.hasIntl) {
|
||||||
// A handful of the tests fail when ICU is not included.
|
// A handful of the tests fail when ICU is not included.
|
||||||
@ -10,7 +12,6 @@ const util = require('util');
|
|||||||
const URL = require('url').URL;
|
const URL = require('url').URL;
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
const url = new URL('https://username:password@host.name:8080/path/name/?que=ry#hash');
|
const url = new URL('https://username:password@host.name:8080/path/name/?que=ry#hash');
|
||||||
|
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
@ -1,5 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
const common = require('../common');
|
const common = require('../common');
|
||||||
if (!common.hasIntl) {
|
if (!common.hasIntl) {
|
||||||
// A handful of the tests fail when ICU is not included.
|
// A handful of the tests fail when ICU is not included.
|
||||||
@ -10,7 +12,6 @@ const URL = require('url').URL;
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const fixtures = require('../common/fixtures');
|
const fixtures = require('../common/fixtures');
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
const tests = require(fixtures.path('url-tests'));
|
const tests = require(fixtures.path('url-tests'));
|
||||||
|
|
||||||
const originalFailures = tests.filter((test) => test.failure);
|
const originalFailures = tests.filter((test) => test.failure);
|
@ -1,12 +1,13 @@
|
|||||||
// Flags: --expose-internals
|
// Flags: --expose-internals
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
require('../common');
|
require('../common');
|
||||||
const URL = require('url').URL;
|
const URL = require('url').URL;
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const urlToOptions = require('internal/url').urlToOptions;
|
const urlToOptions = require('internal/url').urlToOptions;
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
const url = new URL('http://user:pass@foo.bar.com:21/aaa/zzz?l=24#test');
|
const url = new URL('http://user:pass@foo.bar.com:21/aaa/zzz?l=24#test');
|
||||||
const oldParams = url.searchParams; // for test of [SameObject]
|
const oldParams = url.searchParams; // for test of [SameObject]
|
||||||
|
|
37
test/parallel/test-whatwg-url-custom-searchparams-append.js
Normal file
37
test/parallel/test-whatwg-url-custom-searchparams-append.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
|
{
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.append.call(undefined);
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_THIS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Value of "this" must be of type URLSearchParams'
|
||||||
|
});
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.append('a');
|
||||||
|
}, {
|
||||||
|
code: 'ERR_MISSING_ARGS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'The "name" and "value" arguments must be specified'
|
||||||
|
});
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
toString() { throw new Error('toString'); },
|
||||||
|
valueOf() { throw new Error('valueOf'); }
|
||||||
|
};
|
||||||
|
const sym = Symbol();
|
||||||
|
assert.throws(() => params.set(obj, 'b'), /^Error: toString$/);
|
||||||
|
assert.throws(() => params.set('a', obj), /^Error: toString$/);
|
||||||
|
assert.throws(() => params.set(sym, 'b'),
|
||||||
|
/^TypeError: Cannot convert a Symbol value to a string$/);
|
||||||
|
assert.throws(() => params.set('a', sym),
|
||||||
|
/^TypeError: Cannot convert a Symbol value to a string$/);
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
|
function makeIterableFunc(array) {
|
||||||
|
return Object.assign(() => {}, {
|
||||||
|
[Symbol.iterator]() {
|
||||||
|
return array[Symbol.iterator]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const iterableError = common.expectsError({
|
||||||
|
code: 'ERR_ARG_NOT_ITERABLE',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Query pairs must be iterable'
|
||||||
|
});
|
||||||
|
const tupleError = common.expectsError({
|
||||||
|
code: 'ERR_INVALID_TUPLE',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Each query pair must be an iterable [name, value] tuple'
|
||||||
|
}, 6);
|
||||||
|
|
||||||
|
let params;
|
||||||
|
params = new URLSearchParams(undefined);
|
||||||
|
assert.strictEqual(params.toString(), '');
|
||||||
|
params = new URLSearchParams(null);
|
||||||
|
assert.strictEqual(params.toString(), '');
|
||||||
|
params = new URLSearchParams(
|
||||||
|
makeIterableFunc([['key', 'val'], ['key2', 'val2']])
|
||||||
|
);
|
||||||
|
assert.strictEqual(params.toString(), 'key=val&key2=val2');
|
||||||
|
params = new URLSearchParams(
|
||||||
|
makeIterableFunc([['key', 'val'], ['key2', 'val2']].map(makeIterableFunc))
|
||||||
|
);
|
||||||
|
assert.strictEqual(params.toString(), 'key=val&key2=val2');
|
||||||
|
assert.throws(() => new URLSearchParams([[1]]), tupleError);
|
||||||
|
assert.throws(() => new URLSearchParams([[1, 2, 3]]), tupleError);
|
||||||
|
assert.throws(() => new URLSearchParams({ [Symbol.iterator]: 42 }),
|
||||||
|
iterableError);
|
||||||
|
assert.throws(() => new URLSearchParams([{}]), tupleError);
|
||||||
|
assert.throws(() => new URLSearchParams(['a']), tupleError);
|
||||||
|
assert.throws(() => new URLSearchParams([null]), tupleError);
|
||||||
|
assert.throws(() => new URLSearchParams([{ [Symbol.iterator]: 42 }]),
|
||||||
|
tupleError);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const obj = {
|
||||||
|
toString() { throw new Error('toString'); },
|
||||||
|
valueOf() { throw new Error('valueOf'); }
|
||||||
|
};
|
||||||
|
const sym = Symbol();
|
||||||
|
const toStringError = /^Error: toString$/;
|
||||||
|
const symbolError = /^TypeError: Cannot convert a Symbol value to a string$/;
|
||||||
|
|
||||||
|
assert.throws(() => new URLSearchParams({ a: obj }), toStringError);
|
||||||
|
assert.throws(() => new URLSearchParams([['a', obj]]), toStringError);
|
||||||
|
assert.throws(() => new URLSearchParams(sym), symbolError);
|
||||||
|
assert.throws(() => new URLSearchParams({ [sym]: 'a' }), symbolError);
|
||||||
|
assert.throws(() => new URLSearchParams({ a: sym }), symbolError);
|
||||||
|
assert.throws(() => new URLSearchParams([[sym, 'a']]), symbolError);
|
||||||
|
assert.throws(() => new URLSearchParams([['a', sym]]), symbolError);
|
||||||
|
}
|
46
test/parallel/test-whatwg-url-custom-searchparams-delete.js
Normal file
46
test/parallel/test-whatwg-url-custom-searchparams-delete.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const { URL, URLSearchParams } = require('url');
|
||||||
|
|
||||||
|
{
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.delete.call(undefined);
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_THIS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Value of "this" must be of type URLSearchParams'
|
||||||
|
});
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.delete();
|
||||||
|
}, {
|
||||||
|
code: 'ERR_MISSING_ARGS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'The "name" argument must be specified'
|
||||||
|
});
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
toString() { throw new Error('toString'); },
|
||||||
|
valueOf() { throw new Error('valueOf'); }
|
||||||
|
};
|
||||||
|
const sym = Symbol();
|
||||||
|
assert.throws(() => params.delete(obj), /^Error: toString$/);
|
||||||
|
assert.throws(() => params.delete(sym),
|
||||||
|
/^TypeError: Cannot convert a Symbol value to a string$/);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/nodejs/node/issues/10480
|
||||||
|
// Emptying searchParams should correctly update url's query
|
||||||
|
{
|
||||||
|
const url = new URL('http://domain?var=1&var=2&var=3');
|
||||||
|
for (const param of url.searchParams.keys()) {
|
||||||
|
url.searchParams.delete(param);
|
||||||
|
}
|
||||||
|
assert.strictEqual(url.searchParams.toString(), '');
|
||||||
|
assert.strictEqual(url.search, '');
|
||||||
|
assert.strictEqual(url.href, 'http://domain/');
|
||||||
|
}
|
17
test/parallel/test-whatwg-url-custom-searchparams-foreach.js
Normal file
17
test/parallel/test-whatwg-url-custom-searchparams-foreach.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const { URLSearchParams } = require('url');
|
||||||
|
|
||||||
|
{
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.forEach.call(undefined);
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_THIS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Value of "this" must be of type URLSearchParams'
|
||||||
|
});
|
||||||
|
}
|
34
test/parallel/test-whatwg-url-custom-searchparams-get.js
Normal file
34
test/parallel/test-whatwg-url-custom-searchparams-get.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
|
{
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.get.call(undefined);
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_THIS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Value of "this" must be of type URLSearchParams'
|
||||||
|
});
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.get();
|
||||||
|
}, {
|
||||||
|
code: 'ERR_MISSING_ARGS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'The "name" argument must be specified'
|
||||||
|
});
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
toString() { throw new Error('toString'); },
|
||||||
|
valueOf() { throw new Error('valueOf'); }
|
||||||
|
};
|
||||||
|
const sym = Symbol();
|
||||||
|
assert.throws(() => params.get(obj), /^Error: toString$/);
|
||||||
|
assert.throws(() => params.get(sym),
|
||||||
|
/^TypeError: Cannot convert a Symbol value to a string$/);
|
||||||
|
}
|
34
test/parallel/test-whatwg-url-custom-searchparams-getall.js
Normal file
34
test/parallel/test-whatwg-url-custom-searchparams-getall.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
|
{
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.getAll.call(undefined);
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_THIS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Value of "this" must be of type URLSearchParams'
|
||||||
|
});
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.getAll();
|
||||||
|
}, {
|
||||||
|
code: 'ERR_MISSING_ARGS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'The "name" argument must be specified'
|
||||||
|
});
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
toString() { throw new Error('toString'); },
|
||||||
|
valueOf() { throw new Error('valueOf'); }
|
||||||
|
};
|
||||||
|
const sym = Symbol();
|
||||||
|
assert.throws(() => params.getAll(obj), /^Error: toString$/);
|
||||||
|
assert.throws(() => params.getAll(sym),
|
||||||
|
/^TypeError: Cannot convert a Symbol value to a string$/);
|
||||||
|
}
|
34
test/parallel/test-whatwg-url-custom-searchparams-has.js
Normal file
34
test/parallel/test-whatwg-url-custom-searchparams-has.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
|
{
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.has.call(undefined);
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_THIS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Value of "this" must be of type URLSearchParams'
|
||||||
|
});
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.has();
|
||||||
|
}, {
|
||||||
|
code: 'ERR_MISSING_ARGS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'The "name" argument must be specified'
|
||||||
|
});
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
toString() { throw new Error('toString'); },
|
||||||
|
valueOf() { throw new Error('valueOf'); }
|
||||||
|
};
|
||||||
|
const sym = Symbol();
|
||||||
|
assert.throws(() => params.has(obj), /^Error: toString$/);
|
||||||
|
assert.throws(() => params.has(sym),
|
||||||
|
/^TypeError: Cannot convert a Symbol value to a string$/);
|
||||||
|
}
|
@ -1,11 +1,12 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
const sp = new URLSearchParams('?a=a&b=b&b=c');
|
const sp = new URLSearchParams('?a=a&b=b&b=c');
|
||||||
assert.strictEqual(util.inspect(sp),
|
assert.strictEqual(util.inspect(sp),
|
||||||
"URLSearchParams { 'a' => 'a', 'b' => 'b', 'b' => 'c' }");
|
"URLSearchParams { 'a' => 'a', 'b' => 'b', 'b' => 'c' }");
|
@ -1,10 +1,11 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
const common = require('../common');
|
const common = require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
const params = new URLSearchParams('a=b&c=d');
|
const params = new URLSearchParams('a=b&c=d');
|
||||||
const keys = params.keys();
|
const keys = params.keys();
|
||||||
|
|
37
test/parallel/test-whatwg-url-custom-searchparams-set.js
Normal file
37
test/parallel/test-whatwg-url-custom-searchparams-set.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
|
{
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.set.call(undefined);
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_THIS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Value of "this" must be of type URLSearchParams'
|
||||||
|
});
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.set('a');
|
||||||
|
}, {
|
||||||
|
code: 'ERR_MISSING_ARGS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'The "name" and "value" arguments must be specified'
|
||||||
|
});
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
toString() { throw new Error('toString'); },
|
||||||
|
valueOf() { throw new Error('valueOf'); }
|
||||||
|
};
|
||||||
|
const sym = Symbol();
|
||||||
|
assert.throws(() => params.append(obj, 'b'), /^Error: toString$/);
|
||||||
|
assert.throws(() => params.append('a', obj), /^Error: toString$/);
|
||||||
|
assert.throws(() => params.append(sym, 'b'),
|
||||||
|
/^TypeError: Cannot convert a Symbol value to a string$/);
|
||||||
|
assert.throws(() => params.append('a', sym),
|
||||||
|
/^TypeError: Cannot convert a Symbol value to a string$/);
|
||||||
|
}
|
47
test/parallel/test-whatwg-url-custom-searchparams-sort.js
Normal file
47
test/parallel/test-whatwg-url-custom-searchparams-sort.js
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
require('../common');
|
||||||
|
const { URL, URLSearchParams } = require('url');
|
||||||
|
const { test, assert_array_equals } = require('../common/wpt');
|
||||||
|
|
||||||
|
// Test bottom-up iterative stable merge sort
|
||||||
|
const tests = [{ input: '', output: [] }];
|
||||||
|
const pairs = [];
|
||||||
|
for (let i = 10; i < 100; i++) {
|
||||||
|
pairs.push([`a${i}`, 'b']);
|
||||||
|
tests[0].output.push([`a${i}`, 'b']);
|
||||||
|
}
|
||||||
|
tests[0].input = pairs.sort(() => Math.random() > 0.5)
|
||||||
|
.map((pair) => pair.join('=')).join('&');
|
||||||
|
|
||||||
|
tests.push(
|
||||||
|
{
|
||||||
|
'input': 'z=a&=b&c=d',
|
||||||
|
'output': [['', 'b'], ['c', 'd'], ['z', 'a']]
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
tests.forEach((val) => {
|
||||||
|
test(() => {
|
||||||
|
const params = new URLSearchParams(val.input);
|
||||||
|
let i = 0;
|
||||||
|
params.sort();
|
||||||
|
for (const param of params) {
|
||||||
|
assert_array_equals(param, val.output[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}, `Parse and sort: ${val.input}`);
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
const url = new URL(`?${val.input}`, 'https://example/');
|
||||||
|
url.searchParams.sort();
|
||||||
|
const params = new URLSearchParams(url.search);
|
||||||
|
let i = 0;
|
||||||
|
for (const param of params) {
|
||||||
|
assert_array_equals(param, val.output[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}, `URL parse and sort: ${val.input}`);
|
||||||
|
});
|
@ -0,0 +1,17 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
|
{
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
common.expectsError(() => {
|
||||||
|
params.toString.call(undefined);
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_THIS',
|
||||||
|
type: TypeError,
|
||||||
|
message: 'Value of "this" must be of type URLSearchParams'
|
||||||
|
});
|
||||||
|
}
|
@ -1,10 +1,11 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
const common = require('../common');
|
const common = require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
const params = new URLSearchParams('a=b&c=d');
|
const params = new URLSearchParams('a=b&c=d');
|
||||||
const values = params.values();
|
const values = params.values();
|
||||||
|
|
@ -1,11 +1,12 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
const common = require('../common');
|
const common = require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const { URL, URLSearchParams } = require('url');
|
const { URL, URLSearchParams } = require('url');
|
||||||
const fixtures = require('../common/fixtures');
|
const fixtures = require('../common/fixtures');
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
const serialized = 'a=a&a=1&a=true&a=undefined&a=null&a=%EF%BF%BD' +
|
const serialized = 'a=a&a=1&a=true&a=undefined&a=null&a=%EF%BF%BD' +
|
||||||
'&a=%EF%BF%BD&a=%F0%9F%98%80&a=%EF%BF%BD%EF%BF%BD' +
|
'&a=%EF%BF%BD&a=%F0%9F%98%80&a=%EF%BF%BD%EF%BF%BD' +
|
||||||
'&a=%5Bobject+Object%5D';
|
'&a=%5Bobject+Object%5D';
|
60
test/parallel/test-whatwg-url-custom-setters.js
Normal file
60
test/parallel/test-whatwg-url-custom-setters.js
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
if (!common.hasIntl) {
|
||||||
|
// A handful of the tests fail when ICU is not included.
|
||||||
|
common.skip('missing Intl');
|
||||||
|
}
|
||||||
|
|
||||||
|
const assert = require('assert');
|
||||||
|
const URL = require('url').URL;
|
||||||
|
const { test, assert_equals } = require('../common/wpt');
|
||||||
|
const fixtures = require('../common/fixtures');
|
||||||
|
|
||||||
|
const additionalTestCases =
|
||||||
|
require(fixtures.path('url-setter-tests-additional.js'));
|
||||||
|
|
||||||
|
{
|
||||||
|
for (const attributeToBeSet in additionalTestCases) {
|
||||||
|
if (attributeToBeSet === 'comment') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const testCases = additionalTestCases[attributeToBeSet];
|
||||||
|
for (const testCase of testCases) {
|
||||||
|
let name = `Setting <${testCase.href}>.${attributeToBeSet}` +
|
||||||
|
` = "${testCase.new_value}"`;
|
||||||
|
if ('comment' in testCase) {
|
||||||
|
name += ` ${testCase.comment}`;
|
||||||
|
}
|
||||||
|
test(function() {
|
||||||
|
const url = new URL(testCase.href);
|
||||||
|
url[attributeToBeSet] = testCase.new_value;
|
||||||
|
for (const attribute in testCase.expected) {
|
||||||
|
assert_equals(url[attribute], testCase.expected[attribute]);
|
||||||
|
}
|
||||||
|
}, `URL: ${name}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const url = new URL('http://example.com/');
|
||||||
|
const obj = {
|
||||||
|
toString() { throw new Error('toString'); },
|
||||||
|
valueOf() { throw new Error('valueOf'); }
|
||||||
|
};
|
||||||
|
const sym = Symbol();
|
||||||
|
const props = Object.getOwnPropertyDescriptors(Object.getPrototypeOf(url));
|
||||||
|
for (const [name, { set }] of Object.entries(props)) {
|
||||||
|
if (set) {
|
||||||
|
assert.throws(() => url[name] = obj,
|
||||||
|
/^Error: toString$/,
|
||||||
|
`url.${name} = { toString() { throw ... } }`);
|
||||||
|
assert.throws(() => url[name] = sym,
|
||||||
|
/^TypeError: Cannot convert a Symbol value to a string$/,
|
||||||
|
`url.${name} = ${String(sym)}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,11 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Tests below are not from WPT.
|
||||||
|
|
||||||
require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const URL = require('url').URL;
|
const URL = require('url').URL;
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
const toString = Object.prototype.toString;
|
const toString = Object.prototype.toString;
|
||||||
|
|
||||||
const url = new URL('http://example.org');
|
const url = new URL('http://example.org');
|
@ -1,7 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const common = require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
const { test, assert_equals, assert_true } = require('../common/wpt');
|
const { test, assert_equals, assert_true } = require('../common/wpt');
|
||||||
|
|
||||||
@ -48,34 +47,3 @@ test(function() {
|
|||||||
assert_equals(params.get('first'), '1', 'Search params object has name "first" with value "1"');
|
assert_equals(params.get('first'), '1', 'Search params object has name "first" with value "1"');
|
||||||
}, 'Append multiple');
|
}, 'Append multiple');
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
{
|
|
||||||
const params = new URLSearchParams();
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.append.call(undefined);
|
|
||||||
}, {
|
|
||||||
code: 'ERR_INVALID_THIS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Value of "this" must be of type URLSearchParams'
|
|
||||||
});
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.append('a');
|
|
||||||
}, {
|
|
||||||
code: 'ERR_MISSING_ARGS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'The "name" and "value" arguments must be specified'
|
|
||||||
});
|
|
||||||
|
|
||||||
const obj = {
|
|
||||||
toString() { throw new Error('toString'); },
|
|
||||||
valueOf() { throw new Error('valueOf'); }
|
|
||||||
};
|
|
||||||
const sym = Symbol();
|
|
||||||
assert.throws(() => params.set(obj, 'b'), /^Error: toString$/);
|
|
||||||
assert.throws(() => params.set('a', obj), /^Error: toString$/);
|
|
||||||
assert.throws(() => params.set(sym, 'b'),
|
|
||||||
/^TypeError: Cannot convert a Symbol value to a string$/);
|
|
||||||
assert.throws(() => params.set('a', sym),
|
|
||||||
/^TypeError: Cannot convert a Symbol value to a string$/);
|
|
||||||
}
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const common = require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
const {
|
const {
|
||||||
test, assert_equals, assert_true,
|
test, assert_equals, assert_true,
|
||||||
@ -190,66 +189,3 @@ test(() => {
|
|||||||
assert_equals(params2.get("a"), "b")
|
assert_equals(params2.get("a"), "b")
|
||||||
}, "Custom [Symbol.iterator]")
|
}, "Custom [Symbol.iterator]")
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
function makeIterableFunc(array) {
|
|
||||||
return Object.assign(() => {}, {
|
|
||||||
[Symbol.iterator]() {
|
|
||||||
return array[Symbol.iterator]();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const iterableError = common.expectsError({
|
|
||||||
code: 'ERR_ARG_NOT_ITERABLE',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Query pairs must be iterable'
|
|
||||||
});
|
|
||||||
const tupleError = common.expectsError({
|
|
||||||
code: 'ERR_INVALID_TUPLE',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Each query pair must be an iterable [name, value] tuple'
|
|
||||||
}, 6);
|
|
||||||
|
|
||||||
let params;
|
|
||||||
params = new URLSearchParams(undefined);
|
|
||||||
assert.strictEqual(params.toString(), '');
|
|
||||||
params = new URLSearchParams(null);
|
|
||||||
assert.strictEqual(params.toString(), '');
|
|
||||||
params = new URLSearchParams(
|
|
||||||
makeIterableFunc([['key', 'val'], ['key2', 'val2']])
|
|
||||||
);
|
|
||||||
assert.strictEqual(params.toString(), 'key=val&key2=val2');
|
|
||||||
params = new URLSearchParams(
|
|
||||||
makeIterableFunc([['key', 'val'], ['key2', 'val2']].map(makeIterableFunc))
|
|
||||||
);
|
|
||||||
assert.strictEqual(params.toString(), 'key=val&key2=val2');
|
|
||||||
assert.throws(() => new URLSearchParams([[1]]), tupleError);
|
|
||||||
assert.throws(() => new URLSearchParams([[1, 2, 3]]), tupleError);
|
|
||||||
assert.throws(() => new URLSearchParams({ [Symbol.iterator]: 42 }),
|
|
||||||
iterableError);
|
|
||||||
assert.throws(() => new URLSearchParams([{}]), tupleError);
|
|
||||||
assert.throws(() => new URLSearchParams(['a']), tupleError);
|
|
||||||
assert.throws(() => new URLSearchParams([null]), tupleError);
|
|
||||||
assert.throws(() => new URLSearchParams([{ [Symbol.iterator]: 42 }]),
|
|
||||||
tupleError);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const obj = {
|
|
||||||
toString() { throw new Error('toString'); },
|
|
||||||
valueOf() { throw new Error('valueOf'); }
|
|
||||||
};
|
|
||||||
const sym = Symbol();
|
|
||||||
const toStringError = /^Error: toString$/;
|
|
||||||
const symbolError = /^TypeError: Cannot convert a Symbol value to a string$/;
|
|
||||||
|
|
||||||
assert.throws(() => new URLSearchParams({ a: obj }), toStringError);
|
|
||||||
assert.throws(() => new URLSearchParams([['a', obj]]), toStringError);
|
|
||||||
assert.throws(() => new URLSearchParams(sym), symbolError);
|
|
||||||
assert.throws(() => new URLSearchParams({ [sym]: 'a' }), symbolError);
|
|
||||||
assert.throws(() => new URLSearchParams({ a: sym }), symbolError);
|
|
||||||
assert.throws(() => new URLSearchParams([[sym, 'a']]), symbolError);
|
|
||||||
assert.throws(() => new URLSearchParams([['a', sym]]), symbolError);
|
|
||||||
}
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const common = require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
|
||||||
const { URL, URLSearchParams } = require('url');
|
const { URL, URLSearchParams } = require('url');
|
||||||
const { test, assert_equals, assert_true, assert_false } =
|
const { test, assert_equals, assert_true, assert_false } =
|
||||||
require('../common/wpt');
|
require('../common/wpt');
|
||||||
@ -58,43 +57,3 @@ test(function() {
|
|||||||
assert_equals(url.search, '', 'url.search does not have ?');
|
assert_equals(url.search, '', 'url.search does not have ?');
|
||||||
}, 'Removing non-existent param removes ? from URL');
|
}, 'Removing non-existent param removes ? from URL');
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
{
|
|
||||||
const params = new URLSearchParams();
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.delete.call(undefined);
|
|
||||||
}, {
|
|
||||||
code: 'ERR_INVALID_THIS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Value of "this" must be of type URLSearchParams'
|
|
||||||
});
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.delete();
|
|
||||||
}, {
|
|
||||||
code: 'ERR_MISSING_ARGS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'The "name" argument must be specified'
|
|
||||||
});
|
|
||||||
|
|
||||||
const obj = {
|
|
||||||
toString() { throw new Error('toString'); },
|
|
||||||
valueOf() { throw new Error('valueOf'); }
|
|
||||||
};
|
|
||||||
const sym = Symbol();
|
|
||||||
assert.throws(() => params.delete(obj), /^Error: toString$/);
|
|
||||||
assert.throws(() => params.delete(sym),
|
|
||||||
/^TypeError: Cannot convert a Symbol value to a string$/);
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://github.com/nodejs/node/issues/10480
|
|
||||||
// Emptying searchParams should correctly update url's query
|
|
||||||
{
|
|
||||||
const url = new URL('http://domain?var=1&var=2&var=3');
|
|
||||||
for (const param of url.searchParams.keys()) {
|
|
||||||
url.searchParams.delete(param);
|
|
||||||
}
|
|
||||||
assert.strictEqual(url.searchParams.toString(), '');
|
|
||||||
assert.strictEqual(url.search, '');
|
|
||||||
assert.strictEqual(url.href, 'http://domain/');
|
|
||||||
}
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const common = require('../common');
|
require('../common');
|
||||||
const { URL, URLSearchParams } = require('url');
|
const { URL, URLSearchParams } = require('url');
|
||||||
const { test, assert_array_equals, assert_unreached } =
|
const { test, assert_array_equals, assert_unreached } =
|
||||||
require('../common/wpt');
|
require('../common/wpt');
|
||||||
@ -45,15 +45,3 @@ test(function() {
|
|||||||
}
|
}
|
||||||
}, "empty");
|
}, "empty");
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
{
|
|
||||||
const params = new URLSearchParams();
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.forEach.call(undefined);
|
|
||||||
}, {
|
|
||||||
code: 'ERR_INVALID_THIS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Value of "this" must be of type URLSearchParams'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const common = require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
const { test, assert_equals, assert_true } = require('../common/wpt');
|
const { test, assert_equals, assert_true } = require('../common/wpt');
|
||||||
|
|
||||||
@ -33,31 +32,3 @@ test(function() {
|
|||||||
assert_equals(params.get('fourth'), null, 'Search params object has no "fourth" name and value.');
|
assert_equals(params.get('fourth'), null, 'Search params object has no "fourth" name and value.');
|
||||||
}, 'More get() basics');
|
}, 'More get() basics');
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
{
|
|
||||||
const params = new URLSearchParams();
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.get.call(undefined);
|
|
||||||
}, {
|
|
||||||
code: 'ERR_INVALID_THIS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Value of "this" must be of type URLSearchParams'
|
|
||||||
});
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.get();
|
|
||||||
}, {
|
|
||||||
code: 'ERR_MISSING_ARGS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'The "name" argument must be specified'
|
|
||||||
});
|
|
||||||
|
|
||||||
const obj = {
|
|
||||||
toString() { throw new Error('toString'); },
|
|
||||||
valueOf() { throw new Error('valueOf'); }
|
|
||||||
};
|
|
||||||
const sym = Symbol();
|
|
||||||
assert.throws(() => params.get(obj), /^Error: toString$/);
|
|
||||||
assert.throws(() => params.get(sym),
|
|
||||||
/^TypeError: Cannot convert a Symbol value to a string$/);
|
|
||||||
}
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const common = require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
const { test, assert_equals, assert_true, assert_array_equals } =
|
const { test, assert_equals, assert_true, assert_array_equals } =
|
||||||
require('../common/wpt');
|
require('../common/wpt');
|
||||||
@ -38,31 +37,3 @@ test(function() {
|
|||||||
assert_array_equals(matches, ['one'], 'Search params object has expected name "a" values');
|
assert_array_equals(matches, ['one'], 'Search params object has expected name "a" values');
|
||||||
}, 'getAll() multiples');
|
}, 'getAll() multiples');
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
{
|
|
||||||
const params = new URLSearchParams();
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.getAll.call(undefined);
|
|
||||||
}, {
|
|
||||||
code: 'ERR_INVALID_THIS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Value of "this" must be of type URLSearchParams'
|
|
||||||
});
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.getAll();
|
|
||||||
}, {
|
|
||||||
code: 'ERR_MISSING_ARGS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'The "name" argument must be specified'
|
|
||||||
});
|
|
||||||
|
|
||||||
const obj = {
|
|
||||||
toString() { throw new Error('toString'); },
|
|
||||||
valueOf() { throw new Error('valueOf'); }
|
|
||||||
};
|
|
||||||
const sym = Symbol();
|
|
||||||
assert.throws(() => params.getAll(obj), /^Error: toString$/);
|
|
||||||
assert.throws(() => params.getAll(sym),
|
|
||||||
/^TypeError: Cannot convert a Symbol value to a string$/);
|
|
||||||
}
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const common = require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
const { test, assert_false, assert_true } = require('../common/wpt');
|
const { test, assert_false, assert_true } = require('../common/wpt');
|
||||||
|
|
||||||
@ -36,31 +35,3 @@ test(function() {
|
|||||||
assert_false(params.has('first'), 'Search params object has no name "first"');
|
assert_false(params.has('first'), 'Search params object has no name "first"');
|
||||||
}, 'has() following delete()');
|
}, 'has() following delete()');
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
{
|
|
||||||
const params = new URLSearchParams();
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.has.call(undefined);
|
|
||||||
}, {
|
|
||||||
code: 'ERR_INVALID_THIS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Value of "this" must be of type URLSearchParams'
|
|
||||||
});
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.has();
|
|
||||||
}, {
|
|
||||||
code: 'ERR_MISSING_ARGS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'The "name" argument must be specified'
|
|
||||||
});
|
|
||||||
|
|
||||||
const obj = {
|
|
||||||
toString() { throw new Error('toString'); },
|
|
||||||
valueOf() { throw new Error('valueOf'); }
|
|
||||||
};
|
|
||||||
const sym = Symbol();
|
|
||||||
assert.throws(() => params.has(obj), /^Error: toString$/);
|
|
||||||
assert.throws(() => params.has(sym),
|
|
||||||
/^TypeError: Cannot convert a Symbol value to a string$/);
|
|
||||||
}
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const common = require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
const { test, assert_equals, assert_true } = require('../common/wpt');
|
const { test, assert_equals, assert_true } = require('../common/wpt');
|
||||||
|
|
||||||
@ -34,34 +33,3 @@ test(function() {
|
|||||||
assert_equals(params.get('a'), '4', 'Search params object has name "a" with value "4"');
|
assert_equals(params.get('a'), '4', 'Search params object has name "a" with value "4"');
|
||||||
}, 'URLSearchParams.set');
|
}, 'URLSearchParams.set');
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
{
|
|
||||||
const params = new URLSearchParams();
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.set.call(undefined);
|
|
||||||
}, {
|
|
||||||
code: 'ERR_INVALID_THIS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Value of "this" must be of type URLSearchParams'
|
|
||||||
});
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.set('a');
|
|
||||||
}, {
|
|
||||||
code: 'ERR_MISSING_ARGS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'The "name" and "value" arguments must be specified'
|
|
||||||
});
|
|
||||||
|
|
||||||
const obj = {
|
|
||||||
toString() { throw new Error('toString'); },
|
|
||||||
valueOf() { throw new Error('valueOf'); }
|
|
||||||
};
|
|
||||||
const sym = Symbol();
|
|
||||||
assert.throws(() => params.append(obj, 'b'), /^Error: toString$/);
|
|
||||||
assert.throws(() => params.append('a', obj), /^Error: toString$/);
|
|
||||||
assert.throws(() => params.append(sym, 'b'),
|
|
||||||
/^TypeError: Cannot convert a Symbol value to a string$/);
|
|
||||||
assert.throws(() => params.append('a', sym),
|
|
||||||
/^TypeError: Cannot convert a Symbol value to a string$/);
|
|
||||||
}
|
|
||||||
|
@ -61,45 +61,3 @@ test(function() {
|
|||||||
assert_equals(url.search, "")
|
assert_equals(url.search, "")
|
||||||
}, "Sorting non-existent params removes ? from URL")
|
}, "Sorting non-existent params removes ? from URL")
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
|
|
||||||
// Test bottom-up iterative stable merge sort
|
|
||||||
const tests = [{ input: '', output: [] }];
|
|
||||||
const pairs = [];
|
|
||||||
for (let i = 10; i < 100; i++) {
|
|
||||||
pairs.push([`a${i}`, 'b']);
|
|
||||||
tests[0].output.push([`a${i}`, 'b']);
|
|
||||||
}
|
|
||||||
tests[0].input = pairs.sort(() => Math.random() > 0.5)
|
|
||||||
.map((pair) => pair.join('=')).join('&');
|
|
||||||
|
|
||||||
tests.push(
|
|
||||||
{
|
|
||||||
'input': 'z=a&=b&c=d',
|
|
||||||
'output': [['', 'b'], ['c', 'd'], ['z', 'a']]
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
tests.forEach((val) => {
|
|
||||||
test(() => {
|
|
||||||
const params = new URLSearchParams(val.input);
|
|
||||||
let i = 0;
|
|
||||||
params.sort();
|
|
||||||
for (const param of params) {
|
|
||||||
assert_array_equals(param, val.output[i]);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}, `Parse and sort: ${val.input}`);
|
|
||||||
|
|
||||||
test(() => {
|
|
||||||
const url = new URL(`?${val.input}`, 'https://example/');
|
|
||||||
url.searchParams.sort();
|
|
||||||
const params = new URLSearchParams(url.search);
|
|
||||||
let i = 0;
|
|
||||||
for (const param of params) {
|
|
||||||
assert_array_equals(param, val.output[i]);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}, `URL parse and sort: ${val.input}`);
|
|
||||||
});
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const common = require('../common');
|
require('../common');
|
||||||
const URLSearchParams = require('url').URLSearchParams;
|
const URLSearchParams = require('url').URLSearchParams;
|
||||||
const { test, assert_equals } = require('../common/wpt');
|
const { test, assert_equals } = require('../common/wpt');
|
||||||
|
|
||||||
@ -121,15 +121,3 @@ test(function() {
|
|||||||
assert_equals(params.toString(), 'a=&a=b');
|
assert_equals(params.toString(), 'a=&a=b');
|
||||||
}, 'URLSearchParams.toString');
|
}, 'URLSearchParams.toString');
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
{
|
|
||||||
const params = new URLSearchParams();
|
|
||||||
common.expectsError(() => {
|
|
||||||
params.toString.call(undefined);
|
|
||||||
}, {
|
|
||||||
code: 'ERR_INVALID_THIS',
|
|
||||||
type: TypeError,
|
|
||||||
message: 'Value of "this" must be of type URLSearchParams'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
@ -6,14 +6,10 @@ if (!common.hasIntl) {
|
|||||||
common.skip('missing Intl');
|
common.skip('missing Intl');
|
||||||
}
|
}
|
||||||
|
|
||||||
const assert = require('assert');
|
|
||||||
const URL = require('url').URL;
|
const URL = require('url').URL;
|
||||||
const { test, assert_equals } = require('../common/wpt');
|
const { test, assert_equals } = require('../common/wpt');
|
||||||
const fixtures = require('../common/fixtures');
|
const fixtures = require('../common/fixtures');
|
||||||
|
|
||||||
const additionalTestCases =
|
|
||||||
require(fixtures.path('url-setter-tests-additional.js'));
|
|
||||||
|
|
||||||
const request = {
|
const request = {
|
||||||
response: require(fixtures.path('url-setter-tests'))
|
response: require(fixtures.path('url-setter-tests'))
|
||||||
};
|
};
|
||||||
@ -80,48 +76,3 @@ function runURLSettersTests(all_test_cases) {
|
|||||||
|
|
||||||
startURLSettersTests()
|
startURLSettersTests()
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
// Tests below are not from WPT.
|
|
||||||
|
|
||||||
{
|
|
||||||
for (const attributeToBeSet in additionalTestCases) {
|
|
||||||
if (attributeToBeSet === 'comment') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const testCases = additionalTestCases[attributeToBeSet];
|
|
||||||
for (const testCase of testCases) {
|
|
||||||
let name = `Setting <${testCase.href}>.${attributeToBeSet}` +
|
|
||||||
` = "${testCase.new_value}"`;
|
|
||||||
if ('comment' in testCase) {
|
|
||||||
name += ` ${testCase.comment}`;
|
|
||||||
}
|
|
||||||
test(function() {
|
|
||||||
const url = new URL(testCase.href);
|
|
||||||
url[attributeToBeSet] = testCase.new_value;
|
|
||||||
for (const attribute in testCase.expected) {
|
|
||||||
assert_equals(url[attribute], testCase.expected[attribute]);
|
|
||||||
}
|
|
||||||
}, `URL: ${name}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const url = new URL('http://example.com/');
|
|
||||||
const obj = {
|
|
||||||
toString() { throw new Error('toString'); },
|
|
||||||
valueOf() { throw new Error('valueOf'); }
|
|
||||||
};
|
|
||||||
const sym = Symbol();
|
|
||||||
const props = Object.getOwnPropertyDescriptors(Object.getPrototypeOf(url));
|
|
||||||
for (const [name, { set }] of Object.entries(props)) {
|
|
||||||
if (set) {
|
|
||||||
assert.throws(() => url[name] = obj,
|
|
||||||
/^Error: toString$/,
|
|
||||||
`url.${name} = { toString() { throw ... } }`);
|
|
||||||
assert.throws(() => url[name] = sym,
|
|
||||||
/^TypeError: Cannot convert a Symbol value to a string$/,
|
|
||||||
`url.${name} = ${String(sym)}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user