1'use strict';
2
3// Tests below are not from WPT.
4
5require('../common');
6const assert = require('assert');
7const fixtures = require('../common/fixtures');
8
9const serialized = 'a=a&a=1&a=true&a=undefined&a=null&a=%EF%BF%BD' +
10                   '&a=%EF%BF%BD&a=%F0%9F%98%80&a=%EF%BF%BD%EF%BF%BD' +
11                   '&a=%5Bobject+Object%5D';
12const values = ['a', 1, true, undefined, null, '\uD83D', '\uDE00',
13                '\uD83D\uDE00', '\uDE00\uD83D', {}];
14const normalizedValues = ['a', '1', 'true', 'undefined', 'null', '\uFFFD',
15                          '\uFFFD', '\uD83D\uDE00', '\uFFFD\uFFFD',
16                          '[object Object]'];
17
18const m = new URL('http://example.org');
19const ownSymbolsBeforeGetterAccess = Object.getOwnPropertySymbols(m);
20const sp = m.searchParams;
21assert.deepStrictEqual(Object.getOwnPropertySymbols(m), ownSymbolsBeforeGetterAccess);
22
23assert(sp);
24assert.strictEqual(sp.toString(), '');
25assert.strictEqual(m.search, '');
26
27assert(!sp.has('a'));
28values.forEach((i) => sp.set('a', i));
29assert(sp.has('a'));
30assert.strictEqual(sp.get('a'), '[object Object]');
31sp.delete('a');
32assert(!sp.has('a'));
33
34m.search = '';
35assert.strictEqual(sp.toString(), '');
36
37values.forEach((i) => sp.append('a', i));
38assert(sp.has('a'));
39assert.strictEqual(sp.getAll('a').length, values.length);
40assert.strictEqual(sp.get('a'), 'a');
41
42assert.strictEqual(sp.toString(), serialized);
43
44assert.strictEqual(m.search, `?${serialized}`);
45
46assert.strictEqual(sp[Symbol.iterator], sp.entries);
47
48let key, val;
49let n = 0;
50for ([key, val] of sp) {
51  assert.strictEqual(key, 'a', n);
52  assert.strictEqual(val, normalizedValues[n], n);
53  n++;
54}
55n = 0;
56for (key of sp.keys()) {
57  assert.strictEqual(key, 'a', n);
58  n++;
59}
60n = 0;
61for (val of sp.values()) {
62  assert.strictEqual(val, normalizedValues[n], n);
63  n++;
64}
65n = 0;
66sp.forEach(function(val, key, obj) {
67  assert.strictEqual(this, undefined, n);
68  assert.strictEqual(key, 'a', n);
69  assert.strictEqual(val, normalizedValues[n], n);
70  assert.strictEqual(obj, sp, n);
71  n++;
72});
73sp.forEach(function() {
74  assert.strictEqual(this, m);
75}, m);
76
77{
78  const callbackErr = {
79    code: 'ERR_INVALID_ARG_TYPE',
80    name: 'TypeError'
81  };
82  assert.throws(() => sp.forEach(), callbackErr);
83  assert.throws(() => sp.forEach(1), callbackErr);
84}
85
86m.search = '?a=a&b=b';
87assert.strictEqual(sp.toString(), 'a=a&b=b');
88
89const tests = require(fixtures.path('url-searchparams.js'));
90
91for (const [input, expected, parsed] of tests) {
92  if (input[0] !== '?') {
93    const sp = new URLSearchParams(input);
94    assert.strictEqual(String(sp), expected);
95    assert.deepStrictEqual(Array.from(sp), parsed);
96
97    m.search = input;
98    assert.strictEqual(String(m.searchParams), expected);
99    assert.deepStrictEqual(Array.from(m.searchParams), parsed);
100  }
101
102  {
103    const sp = new URLSearchParams(`?${input}`);
104    assert.strictEqual(String(sp), expected);
105    assert.deepStrictEqual(Array.from(sp), parsed);
106
107    m.search = `?${input}`;
108    assert.strictEqual(String(m.searchParams), expected);
109    assert.deepStrictEqual(Array.from(m.searchParams), parsed);
110  }
111}
112