1'use strict'; 2 3// Tests below are not from WPT. 4 5require('../common'); 6const assert = require('assert'); 7const URLSearchParams = require('url').URLSearchParams; 8 9function makeIterableFunc(array) { 10 return Object.assign(() => {}, { 11 [Symbol.iterator]() { 12 return array[Symbol.iterator](); 13 } 14 }); 15} 16 17{ 18 const iterableError = { 19 code: 'ERR_ARG_NOT_ITERABLE', 20 name: 'TypeError', 21 message: 'Query pairs must be iterable' 22 }; 23 const tupleError = { 24 code: 'ERR_INVALID_TUPLE', 25 name: 'TypeError', 26 message: 'Each query pair must be an iterable [name, value] tuple' 27 }; 28 29 let params; 30 params = new URLSearchParams(undefined); 31 assert.strictEqual(params.toString(), ''); 32 params = new URLSearchParams(null); 33 assert.strictEqual(params.toString(), ''); 34 params = new URLSearchParams( 35 makeIterableFunc([['key', 'val'], ['key2', 'val2']]) 36 ); 37 assert.strictEqual(params.toString(), 'key=val&key2=val2'); 38 params = new URLSearchParams( 39 makeIterableFunc([['key', 'val'], ['key2', 'val2']].map(makeIterableFunc)) 40 ); 41 assert.strictEqual(params.toString(), 'key=val&key2=val2'); 42 assert.throws(() => new URLSearchParams([[1]]), tupleError); 43 assert.throws(() => new URLSearchParams([[1, 2, 3]]), tupleError); 44 assert.throws(() => new URLSearchParams({ [Symbol.iterator]: 42 }), 45 iterableError); 46 assert.throws(() => new URLSearchParams([{}]), tupleError); 47 assert.throws(() => new URLSearchParams(['a']), tupleError); 48 assert.throws(() => new URLSearchParams([null]), tupleError); 49 assert.throws(() => new URLSearchParams([{ [Symbol.iterator]: 42 }]), 50 tupleError); 51} 52 53{ 54 const obj = { 55 toString() { throw new Error('toString'); }, 56 valueOf() { throw new Error('valueOf'); } 57 }; 58 const sym = Symbol(); 59 const toStringError = /^Error: toString$/; 60 const symbolError = /^TypeError: Cannot convert a Symbol value to a string$/; 61 62 assert.throws(() => new URLSearchParams({ a: obj }), toStringError); 63 assert.throws(() => new URLSearchParams([['a', obj]]), toStringError); 64 assert.throws(() => new URLSearchParams(sym), symbolError); 65 assert.throws(() => new URLSearchParams({ [sym]: 'a' }), symbolError); 66 assert.throws(() => new URLSearchParams({ a: sym }), symbolError); 67 assert.throws(() => new URLSearchParams([[sym, 'a']]), symbolError); 68 assert.throws(() => new URLSearchParams([['a', sym]]), symbolError); 69} 70