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