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