1'use strict';
2
3const common = require('../common.js');
4const { deepEqual, deepStrictEqual, notDeepEqual, notDeepStrictEqual } =
5  require('assert');
6
7const bench = common.createBenchmark(main, {
8  n: [5e2],
9  len: [5e2],
10  strict: [0, 1],
11  method: [
12    'deepEqual_primitiveOnly',
13    'deepEqual_objectOnly',
14    'deepEqual_mixed',
15    'notDeepEqual_primitiveOnly',
16    'notDeepEqual_objectOnly',
17    'notDeepEqual_mixed',
18  ],
19});
20
21function benchmark(method, n, values, values2) {
22  const actual = new Set(values);
23  // Prevent reference equal elements
24  const deepCopy = JSON.parse(JSON.stringify(values2 ? values2 : values));
25  const expected = new Set(deepCopy);
26  bench.start();
27  for (let i = 0; i < n; ++i) {
28    method(actual, expected);
29  }
30  bench.end(n);
31}
32
33function main({ n, len, method, strict }) {
34  const array = Array(len).fill(1);
35
36  switch (method) {
37    case 'deepEqual_primitiveOnly': {
38      const values = array.map((_, i) => `str_${i}`);
39      benchmark(strict ? deepStrictEqual : deepEqual, n, values);
40      break;
41    }
42    case 'deepEqual_objectOnly': {
43      const values = array.map((_, i) => [`str_${i}`, null]);
44      benchmark(strict ? deepStrictEqual : deepEqual, n, values);
45      break;
46    }
47    case 'deepEqual_mixed': {
48      const values = array.map((_, i) => {
49        return i % 2 ? [`str_${i}`, null] : `str_${i}`;
50      });
51      benchmark(strict ? deepStrictEqual : deepEqual, n, values);
52      break;
53    }
54    case 'notDeepEqual_primitiveOnly': {
55      const values = array.map((_, i) => `str_${i}`);
56      const values2 = values.slice(0);
57      values2[Math.floor(len / 2)] = 'w00t';
58      benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2);
59      break;
60    }
61    case 'notDeepEqual_objectOnly': {
62      const values = array.map((_, i) => [`str_${i}`, null]);
63      const values2 = values.slice(0);
64      values2[Math.floor(len / 2)] = ['w00t'];
65      benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2);
66      break;
67    }
68    case 'notDeepEqual_mixed': {
69      const values = array.map((_, i) => {
70        return i % 2 ? [`str_${i}`, null] : `str_${i}`;
71      });
72      const values2 = values.slice();
73      values2[0] = 'w00t';
74      benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2);
75      break;
76    }
77    default:
78      throw new Error(`Unsupported method "${method}"`);
79  }
80}
81