|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +// Tests below are not from WPT. |
| 4 | + |
| 5 | +const common = require('../common'); |
| 6 | +const assert = require('assert'); |
| 7 | +const URLSearchParams = require('url').URLSearchParams; |
| 8 | + |
| 9 | +function makeIterableFunc(array) { |
| 10 | + return Object.assign(() => {}, { |
| 11 | + [Symbol.iterator]() { |
| 12 | + return array[Symbol.iterator](); |
| 13 | + } |
| 14 | + }); |
| 15 | +} |
| 16 | + |
| 17 | +{ |
| 18 | + const iterableError = common.expectsError({ |
| 19 | + code: 'ERR_ARG_NOT_ITERABLE', |
| 20 | + type: TypeError, |
| 21 | + message: 'Query pairs must be iterable' |
| 22 | + }); |
| 23 | + const tupleError = common.expectsError({ |
| 24 | + code: 'ERR_INVALID_TUPLE', |
| 25 | + type: TypeError, |
| 26 | + message: 'Each query pair must be an iterable [name, value] tuple' |
| 27 | + }, 6); |
| 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 | +} |
0 commit comments