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