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