11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_ci// Tests below are not from WPT.
41cb0ef41Sopenharmony_ci
51cb0ef41Sopenharmony_cirequire('../common');
61cb0ef41Sopenharmony_ciconst assert = require('assert');
71cb0ef41Sopenharmony_ci
81cb0ef41Sopenharmony_cifunction makeIterableFunc(array) {
91cb0ef41Sopenharmony_ci  return Object.assign(() => {}, {
101cb0ef41Sopenharmony_ci    [Symbol.iterator]() {
111cb0ef41Sopenharmony_ci      return array[Symbol.iterator]();
121cb0ef41Sopenharmony_ci    }
131cb0ef41Sopenharmony_ci  });
141cb0ef41Sopenharmony_ci}
151cb0ef41Sopenharmony_ci
161cb0ef41Sopenharmony_ci{
171cb0ef41Sopenharmony_ci  const iterableError = {
181cb0ef41Sopenharmony_ci    code: 'ERR_ARG_NOT_ITERABLE',
191cb0ef41Sopenharmony_ci    name: 'TypeError',
201cb0ef41Sopenharmony_ci    message: 'Query pairs must be iterable'
211cb0ef41Sopenharmony_ci  };
221cb0ef41Sopenharmony_ci  const tupleError = {
231cb0ef41Sopenharmony_ci    code: 'ERR_INVALID_TUPLE',
241cb0ef41Sopenharmony_ci    name: 'TypeError',
251cb0ef41Sopenharmony_ci    message: 'Each query pair must be an iterable [name, value] tuple'
261cb0ef41Sopenharmony_ci  };
271cb0ef41Sopenharmony_ci
281cb0ef41Sopenharmony_ci  let params;
291cb0ef41Sopenharmony_ci  params = new URLSearchParams(undefined);
301cb0ef41Sopenharmony_ci  assert.strictEqual(params.toString(), '');
311cb0ef41Sopenharmony_ci  params = new URLSearchParams(null);
321cb0ef41Sopenharmony_ci  assert.strictEqual(params.toString(), '');
331cb0ef41Sopenharmony_ci  params = new URLSearchParams(
341cb0ef41Sopenharmony_ci    makeIterableFunc([['key', 'val'], ['key2', 'val2']])
351cb0ef41Sopenharmony_ci  );
361cb0ef41Sopenharmony_ci  assert.strictEqual(params.toString(), 'key=val&key2=val2');
371cb0ef41Sopenharmony_ci  params = new URLSearchParams(
381cb0ef41Sopenharmony_ci    makeIterableFunc([['key', 'val'], ['key2', 'val2']].map(makeIterableFunc))
391cb0ef41Sopenharmony_ci  );
401cb0ef41Sopenharmony_ci  assert.strictEqual(params.toString(), 'key=val&key2=val2');
411cb0ef41Sopenharmony_ci  params = new URLSearchParams({ hasOwnProperty: 1 });
421cb0ef41Sopenharmony_ci  assert.strictEqual(params.get('hasOwnProperty'), '1');
431cb0ef41Sopenharmony_ci  assert.strictEqual(params.toString(), 'hasOwnProperty=1');
441cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams([[1]]), tupleError);
451cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams([[1, 2, 3]]), tupleError);
461cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams({ [Symbol('test')]: 42 }),
471cb0ef41Sopenharmony_ci                TypeError);
481cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams({ [Symbol.iterator]: 42 }),
491cb0ef41Sopenharmony_ci                iterableError);
501cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams([{}]), tupleError);
511cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams(['a']), tupleError);
521cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams([null]), tupleError);
531cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams([{ [Symbol.iterator]: 42 }]),
541cb0ef41Sopenharmony_ci                tupleError);
551cb0ef41Sopenharmony_ci
561cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams(
571cb0ef41Sopenharmony_ci    makeIterableFunc([['key', 'val', 'val2']])
581cb0ef41Sopenharmony_ci  ), tupleError);
591cb0ef41Sopenharmony_ci}
601cb0ef41Sopenharmony_ci
611cb0ef41Sopenharmony_ci{
621cb0ef41Sopenharmony_ci  const obj = {
631cb0ef41Sopenharmony_ci    toString() { throw new Error('toString'); },
641cb0ef41Sopenharmony_ci    valueOf() { throw new Error('valueOf'); }
651cb0ef41Sopenharmony_ci  };
661cb0ef41Sopenharmony_ci  const sym = Symbol();
671cb0ef41Sopenharmony_ci  const toStringError = /^Error: toString$/;
681cb0ef41Sopenharmony_ci  const symbolError = /^TypeError: Cannot convert a Symbol value to a string$/;
691cb0ef41Sopenharmony_ci
701cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams({ a: obj }), toStringError);
711cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams([['a', obj]]), toStringError);
721cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams(sym), symbolError);
731cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams({ [sym]: 'a' }), symbolError);
741cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams({ a: sym }), symbolError);
751cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams([[sym, 'a']]), symbolError);
761cb0ef41Sopenharmony_ci  assert.throws(() => new URLSearchParams([['a', sym]]), symbolError);
771cb0ef41Sopenharmony_ci}
78