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