-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathindex.js
More file actions
90 lines (69 loc) · 2.61 KB
/
index.js
File metadata and controls
90 lines (69 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
const Benchmark = require('benchmark');
const AsciiTable = require('ascii-table');
const progress = require('pace');
const nativeTests = require('./compiled/native').default;
const browserTests = require('./compiled/browser').default;
function getTotalTestCount(suites) {
let total = 0;
Object.values(suites).forEach((suite) => {
Object.keys(suite).forEach((test) => {
Object.keys(suite[test]).forEach(() => {
total += 1;
});
});
});
return total;
}
function runSuites(suites) {
const bar = progress(getTotalTestCount(suites));
function runSuite(suiteName, tests) {
return new Promise((resolve) => {
const suite = new Benchmark.Suite(suiteName, {
minSamples: 50,
});
const testNames = Object.keys(tests);
const projectNamesSet = new Set();
const getRunName = (testName, projectName) => `${testName}: ${projectName}`;
testNames.forEach((testName) => {
Object.keys(tests[testName]).forEach((projectName) => {
projectNamesSet.add(projectName);
suite.add(getRunName(testName, projectName), tests[testName][projectName]);
});
});
const projectNames = Array.from(projectNamesSet);
/**
* something in the dep tree is fubaring the string "styled-components"
* when used as a suite key
*/
const projectNamesWithVersions = projectNames.map(
// eslint-disable-next-line
lib => `${lib} (v${require(`${lib === 'styled' ? 'styled-components' : lib}/package.json`).version})`
);
const table = new AsciiTable(suiteName);
table.setHeading('', ...projectNamesWithVersions);
suite.on('cycle', () => bar.op());
suite.on('error', err => console.error(err.target.error) && suite.abort());
suite.on('complete', () => {
const suiteResults = Array.from(suite);
const rows = testNames.map(testName => (
[testName].concat(projectNames.map((projectName) => {
const runName = getRunName(testName, projectName);
const run = suiteResults.find(run => run.name === runName); // eslint-disable-line
return run
? `${(run.stats.mean * 1000).toFixed(3)}±${(run.stats.deviation * 1000).toFixed(3)}ms`
: '-';
}))
));
rows.forEach(row => table.addRow(row));
resolve(table.toString());
});
suite.run();
});
}
const results = Object.keys(suites).map(suiteName => runSuite(suiteName, suites[suiteName]));
results.forEach(async result => console.log(await result));
}
runSuites({
browser: browserTests,
native: nativeTests,
});