aboutsummaryrefslogtreecommitdiff
path: root/node_modules/pretty-format/perf/test.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/pretty-format/perf/test.js')
-rw-r--r--node_modules/pretty-format/perf/test.js215
1 files changed, 215 insertions, 0 deletions
diff --git a/node_modules/pretty-format/perf/test.js b/node_modules/pretty-format/perf/test.js
new file mode 100644
index 000000000..3edd40f62
--- /dev/null
+++ b/node_modules/pretty-format/perf/test.js
@@ -0,0 +1,215 @@
+/**
+ * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+
+'use strict';
+
+const prettyFormat = require('../build');
+const util = require('util');
+const chalk = require('chalk');
+const leftPad = require('left-pad');
+const worldGeoJson = require('./world.geo.json');
+const React = require('react');
+const ReactTestRenderer = require('react-test-renderer');
+const ReactTestComponent = require('../build/plugins/ReactTestComponent');
+
+const NANOSECONDS = 1000000000;
+let TIMES_TO_RUN = 100000;
+
+function testCase(name, fn) {
+ let result, error, time, total;
+
+ try {
+ result = fn();
+ } catch (err) {
+ error = err;
+ }
+
+ if (!error) {
+ const start = process.hrtime();
+
+ for (let i = 0; i < TIMES_TO_RUN; i++) {
+ fn();
+ }
+
+ const diff = process.hrtime(start);
+
+ total = diff[0] * 1e9 + diff[1];
+ time = Math.round(total / TIMES_TO_RUN);
+ }
+
+ return {
+ error,
+ name,
+ result,
+ time,
+ total,
+ };
+}
+
+function test(name, value, ignoreResult, prettyFormatOpts) {
+ const formatted = testCase(
+ 'prettyFormat() ',
+ () => prettyFormat(value, prettyFormatOpts)
+ );
+
+ const inspected = testCase('util.inspect() ', () => {
+ return util.inspect(value, {
+ depth: null,
+ showHidden: true,
+ });
+ });
+
+ const stringified = testCase('JSON.stringify()', () => {
+ return JSON.stringify(value, null, ' ');
+ });
+
+ const results = [formatted, inspected, stringified].sort((a, b) => {
+ return a.time - b.time;
+ });
+
+ const winner = results[0];
+
+ results.forEach((item, index) => {
+ item.isWinner = index === 0;
+ item.isLoser = index === results.length - 1;
+ });
+
+ function log(current) {
+ let message = current.name;
+
+ if (current.time) {
+ message += ' - ' + leftPad(current.time, 6) + 'ns';
+ }
+ if (current.total) {
+ message +=
+ ' - ' + (current.total / NANOSECONDS) + 's total (' +
+ TIMES_TO_RUN + ' runs)';
+ }
+ if (current.error) {
+ message += ' - Error: ' + current.error.message;
+ }
+
+ if (!ignoreResult && current.result) {
+ message += ' - ' + JSON.stringify(current.result);
+ }
+
+ message = ' ' + message + ' ';
+
+ if (current.error) {
+ message = chalk.dim(message);
+ }
+
+ const diff = (current.time - winner.time);
+
+ if (diff > (winner.time * 0.85)) {
+ message = chalk.bgRed.black(message);
+ } else if (diff > (winner.time * 0.65)) {
+ message = chalk.bgYellow.black(message);
+ } else if (!current.error) {
+ message = chalk.bgGreen.black(message);
+ } else {
+ message = chalk.dim(message);
+ }
+
+ console.log(' ' + message);
+ }
+
+ console.log(name + ': ');
+ results.forEach(log);
+ console.log();
+}
+
+function returnArguments() {
+ return arguments;
+}
+
+test('empty arguments', returnArguments());
+test('arguments', returnArguments(1, 2, 3));
+test('an empty array', []);
+test('an array with items', [1, 2, 3]);
+test('a typed array', new Uint32Array(3));
+test('an array buffer', new ArrayBuffer(3));
+test('a nested array', [[1, 2, 3]]);
+test('true', true);
+test('false', false);
+test('an error', new Error());
+test('a typed error with a message', new TypeError('message'));
+/* eslint-disable no-new-func */
+test('a function constructor', new Function());
+/* eslint-enable no-new-func */
+test('an anonymous function', () => {});
+function named() {}
+test('a named function', named);
+test('Infinity', Infinity);
+test('-Infinity', -Infinity);
+test('an empty map', new Map());
+const mapWithValues = new Map();
+const mapWithNonStringKeys = new Map();
+mapWithValues.set('prop1', 'value1');
+mapWithValues.set('prop2', 'value2');
+mapWithNonStringKeys.set({prop: 'value'}, {prop: 'value'});
+test('a map with values', mapWithValues);
+test('a map with non-string keys', mapWithNonStringKeys);
+test('NaN', NaN);
+test('null', null);
+test('a number', 123);
+test('a date', new Date(10e11));
+test('an empty object', {});
+test('an object with properties', {prop1: 'value1', prop2: 'value2'});
+const objectWithPropsAndSymbols = {prop: 'value1'};
+objectWithPropsAndSymbols[Symbol('symbol1')] = 'value2';
+objectWithPropsAndSymbols[Symbol('symbol2')] = 'value3';
+test('an object with properties and symbols', objectWithPropsAndSymbols);
+test('an object with sorted properties', {a: 2, b: 1});
+test('regular expressions from constructors', new RegExp('regexp'));
+test('regular expressions from literals', /regexp/ig);
+test('an empty set', new Set());
+const setWithValues = new Set();
+setWithValues.add('value1');
+setWithValues.add('value2');
+test('a set with values', setWithValues);
+test('a string', 'string');
+test('a symbol', Symbol('symbol'));
+test('undefined', undefined);
+test('a WeakMap', new WeakMap());
+test('a WeakSet', new WeakSet());
+test('deeply nested objects', {prop: {prop: {prop: 'value'}}});
+const circularReferences = {};
+circularReferences.prop = circularReferences;
+test('circular references', circularReferences);
+const parallelReferencesInner = {};
+const parallelReferences = {
+ prop1: parallelReferencesInner,
+ prop2: parallelReferencesInner,
+};
+test('parallel references', parallelReferences);
+test('able to customize indent', {prop: 'value'});
+const bigObj = {};
+for (let i = 0; i < 50; i++) {
+ bigObj[i] = i;
+}
+test('big object', bigObj);
+
+const element = React.createElement(
+ 'div',
+ {onClick: () => {}, prop: {a: 1, b: 2}},
+ React.createElement('div', {prop: {a: 1, b: 2}}),
+ React.createElement('div'),
+ React.createElement('div', {prop: {a: 1, b: 2}},
+ React.createElement('div', null,
+ React.createElement('div')
+ )
+ )
+);
+
+test('react', ReactTestRenderer.create(element).toJSON(), false, {
+ plugins: [ReactTestComponent],
+});
+
+TIMES_TO_RUN = 100;
+test('massive', worldGeoJson, true);