1'use strict';
2const common = require('../common.js');
3
4const values = {
5  noencode: {
6    foo: 'bar',
7    baz: 'quux',
8    xyzzy: 'thud',
9  },
10  encodemany: {
11    '\u0080\u0083\u0089': 'bar',
12    '\u008C\u008E\u0099': 'quux',
13    'xyzzy': '\u00A5q\u00A3r',
14  },
15  encodelast: {
16    foo: 'bar',
17    baz: 'quux',
18    xyzzy: 'thu\u00AC',
19  },
20  array: {
21    foo: [],
22    baz: ['bar'],
23    xyzzy: ['bar', 'quux', 'thud'],
24  },
25  multiprimitives: {
26    foo: false,
27    bar: -13.37,
28    baz: 'baz',
29  },
30};
31
32function paramGenerator(paramType) {
33  const valueKeys = Object.keys(values);
34  switch (paramType) {
35    case 'string':
36      // Return the values object with all values as strings
37      return valueKeys.reduce((acc, key) => {
38        const objectKeys = Object.keys(values[key]);
39        acc[key] = objectKeys.reduce((acc, k, i) => {
40          acc += `${k}=${values[key][k]}${i < objectKeys.length - 1 ? '&' : ''}`;
41          return acc;
42        }, '');
43        return acc;
44      }, {});
45    case 'iterable':
46      // Return the values object with all values as iterable
47      return valueKeys.reduce((acc, key) => {
48        acc[key] = Object.keys(values[key]).reduce((acc, k) => {
49          acc.push([k, values[key][k]]);
50          return acc;
51        }, []);
52        return acc;
53      }, {});
54    case 'object':
55      // Return the values object with all values as objects
56      return values;
57    default:
58  }
59}
60
61const bench = common.createBenchmark(main, {
62  type: ['noencode', 'encodemany', 'encodelast', 'array', 'multiprimitives'],
63  inputType: ['string', 'iterable', 'object'],
64  n: [1e6],
65});
66
67function main({ n, type, inputType }) {
68  const inputs = paramGenerator(inputType);
69  const input = inputs[type];
70  const u = new URLSearchParams(input);
71
72  bench.start();
73  for (let i = 0; i < n; i += 1)
74    u.toString();
75  bench.end(n);
76}
77