From e2e731f1b0c030d0c9cdade7aadf36f773a1a0fd Mon Sep 17 00:00:00 2001 From: Jamie Mason Date: Tue, 27 Sep 2016 16:20:25 +0100 Subject: [PATCH] feat(core): use existing benchmark.js suites refs #8 --- package.json | 1 + src/adapter.js | 66 ------------------------------ src/{karma-benchmark.js => api.js} | 0 src/globals.js | 4 ++ src/lib/construct.js | 12 ++++++ src/main.js | 18 +++++++- src/run-benchmarks.js | 55 +++++++++++++++++++++++++ src/store.js | 27 ++++++++++++ src/vendor/benchmark.js | 1 + src/vendor/karma.js | 1 + src/vendor/lodash.js | 1 + src/wrapped-benchmark.js | 32 +++++++++++++++ 12 files changed, 150 insertions(+), 68 deletions(-) delete mode 100644 src/adapter.js rename src/{karma-benchmark.js => api.js} (100%) create mode 100644 src/globals.js create mode 100644 src/lib/construct.js create mode 100644 src/run-benchmarks.js create mode 100644 src/store.js create mode 100644 src/vendor/benchmark.js create mode 100644 src/vendor/karma.js create mode 100644 src/vendor/lodash.js create mode 100644 src/wrapped-benchmark.js diff --git a/package.json b/package.json index 6b6dd15..2b52f8a 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "xo": { "envs": [ "browser", + "jasmine", "node" ], "space": 2 diff --git a/src/adapter.js b/src/adapter.js deleted file mode 100644 index 24bf574..0000000 --- a/src/adapter.js +++ /dev/null @@ -1,66 +0,0 @@ -(function () { - var global = this; - var karma = global.__karma__; - - karma.start = function () { - var suites = global.__karma_benchmark_suites__; - var hasTests = Boolean(suites.length); - var errors = []; - - if (!hasTests) { - return complete(); - } - - runNextSuite(); - - function logResult(event) { - var suite = this; - var result = event.target; - karma.result({ - id: result.id, - description: suite.name + ': ' + result.name, - suite: [], - success: errors.length === 0, - log: errors, - skipped: false, - time: result.stats.mean * 1000, - benchmark: { - suite: suite.name, - name: result.name, - stats: result.stats, - count: result.count, - cycles: result.cycles, - error: result.error, - hz: result.hz - } - }); - - // Reset errors - errors = []; - } - - function logError(evt) { - errors.push(evt.target.error.toString()); - } - - function runNextSuite() { - if (!suites.length) { - return complete(); - } - - suites.shift() - .on('cycle', logResult) - .on('abort error', logError) - .on('complete', runNextSuite) - .run({ - async: true - }); - } - - function complete() { - karma.complete({ - coverage: global.__coverage__ - }); - } - }; -}).call(this); diff --git a/src/karma-benchmark.js b/src/api.js similarity index 100% rename from src/karma-benchmark.js rename to src/api.js diff --git a/src/globals.js b/src/globals.js new file mode 100644 index 0000000..c139fc6 --- /dev/null +++ b/src/globals.js @@ -0,0 +1,4 @@ +module.exports = { + Benchmark: global.Benchmark, + lodash: global._ +}; diff --git a/src/lib/construct.js b/src/lib/construct.js new file mode 100644 index 0000000..5b2a12a --- /dev/null +++ b/src/lib/construct.js @@ -0,0 +1,12 @@ +module.exports = function construct(Instance, a, b, c) { + if (c) { + return new Instance(a, b, c); + } + if (b) { + return new Instance(a, b); + } + if (a) { + return new Instance(a); + } + return new Instance(); +}; diff --git a/src/main.js b/src/main.js index 0eb2278..909dc35 100644 --- a/src/main.js +++ b/src/main.js @@ -1,3 +1,17 @@ -module.exports = function karmaBenchmark() { - // temp... +// 3rd party modules +var karma = require('./vendor/karma'); + +// modules +var runBenchmarks = require('./run-benchmarks'); +var WrappedBenchmark = require('./wrapped-benchmark'); + +// implementation +global.Benchmark = WrappedBenchmark; + +karma.start = function () { + runBenchmarks(function () { + karma.complete({ + coverage: global.__coverage__ + }); + }); }; diff --git a/src/run-benchmarks.js b/src/run-benchmarks.js new file mode 100644 index 0000000..67374a5 --- /dev/null +++ b/src/run-benchmarks.js @@ -0,0 +1,55 @@ +// 3rd party modules +var karma = require('./vendor/karma'); + +// modules +var store = require('./store'); + +// public +module.exports = runBenchmarks; + +// implementation +function runBenchmarks(done) { + var suites = store.getSuites(); + if (suites.length) { + runSuite(suites.shift(), function () { + runBenchmarks(done); + }); + } else { + done(); + } +} + +function runSuite(suite, done) { + var errors = []; + suite + .on('cycle', function (e) { + karma.result({ + id: e.target.id, + description: suite.name + ': ' + e.target.name, + suite: [], + success: errors.length === 0, + log: errors, + skipped: false, + time: e.target.stats.mean * 1000, + benchmark: { + suite: suite.name, + name: e.target.name, + stats: e.target.stats, + count: e.target.count, + cycles: e.target.cycles, + error: e.target.error, + hz: e.target.hz + } + }); + errors = []; + }) + .on('abort error', function (e) { + errors.push(e.target.error.toString()); + }) + .on('complete', + done + ) + .run({ + async: true + }); +} diff --git a/src/store.js b/src/store.js new file mode 100644 index 0000000..82f9dc5 --- /dev/null +++ b/src/store.js @@ -0,0 +1,27 @@ +// public +module.exports = { + addBenchmark: addBenchmark, + addSuite: addSuite, + getSuites: getSuites +}; + +// implementation +var benchmarks = []; +var suites = []; + +function addBenchmark(benchmark, hasSuite) { + benchmark.hasSuite = Boolean(hasSuite); + benchmarks.push(benchmark); + console.log('benchmark added:', benchmark, benchmarks); + return benchmark; +} + +function addSuite(suite) { + suites.push(suite); + console.log('suite added:', suite, suites); + return suite; +} + +function getSuites() { + return suites; +} diff --git a/src/vendor/benchmark.js b/src/vendor/benchmark.js new file mode 100644 index 0000000..c7bfd75 --- /dev/null +++ b/src/vendor/benchmark.js @@ -0,0 +1 @@ +module.exports = global.Benchmark; diff --git a/src/vendor/karma.js b/src/vendor/karma.js new file mode 100644 index 0000000..f1f040e --- /dev/null +++ b/src/vendor/karma.js @@ -0,0 +1 @@ +module.exports = global.__karma__; diff --git a/src/vendor/lodash.js b/src/vendor/lodash.js new file mode 100644 index 0000000..56c6e71 --- /dev/null +++ b/src/vendor/lodash.js @@ -0,0 +1 @@ +module.exports = global._; diff --git a/src/wrapped-benchmark.js b/src/wrapped-benchmark.js new file mode 100644 index 0000000..01a8ada --- /dev/null +++ b/src/wrapped-benchmark.js @@ -0,0 +1,32 @@ +// 3rd party modules +var Benchmark = require('./vendor/Benchmark'); + +// modules +var construct = require('./lib/construct'); +var store = require('./store'); + +// public +module.exports = WrappedBenchmark; +module.exports.Suite = WrappedSuite; + +// implementation +var Suite = Benchmark.Suite; + +function WrappedBenchmark(name, fn, options) { + var benchmark = construct(Benchmark, name, fn, options); + return store.addBenchmark(benchmark, false); +} + +function WrappedSuite(name, options) { + var suite = construct(Suite, name, options); + suite.add = addBenchmark; + store.addSuite(suite); + return suite; +} + +function addBenchmark(name, fn, options) { + var suite = Suite.prototype.add.call(this, name, fn, options); + var benchmark = suite[suite.length - 1]; + store.addBenchmark(benchmark, true); + return suite; +}