diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-05-28 00:38:50 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-05-28 00:40:43 +0200 |
commit | 7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027 (patch) | |
tree | 6de9a1aebd150a23b7f8c273ec657a5d0a18fe3e /node_modules/ava/lib/concurrent.js | |
parent | 963b7a41feb29cc4be090a2446bdfe0c1f1bcd81 (diff) |
add linting (and some initial fixes)
Diffstat (limited to 'node_modules/ava/lib/concurrent.js')
-rw-r--r-- | node_modules/ava/lib/concurrent.js | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/node_modules/ava/lib/concurrent.js b/node_modules/ava/lib/concurrent.js new file mode 100644 index 000000000..3cdbb41c3 --- /dev/null +++ b/node_modules/ava/lib/concurrent.js @@ -0,0 +1,64 @@ +'use strict'; + +class Concurrent { + constructor(runnables, bail) { + if (!Array.isArray(runnables)) { + throw new TypeError('Expected an array of runnables'); + } + + this.runnables = runnables; + this.bail = bail || false; + } + + run() { + let allPassed = true; + + let pending; + let rejectPending; + let resolvePending; + const allPromises = []; + const handlePromise = promise => { + if (!pending) { + pending = new Promise((resolve, reject) => { + rejectPending = reject; + resolvePending = resolve; + }); + } + + allPromises.push(promise.then(passed => { + if (!passed) { + allPassed = false; + + if (this.bail) { + // Stop if the test failed and bail mode is on. + resolvePending(); + } + } + }, rejectPending)); + }; + + for (const runnable of this.runnables) { + const passedOrPromise = runnable.run(); + + if (!passedOrPromise) { + if (this.bail) { + // Stop if the test failed and bail mode is on. + return false; + } + + allPassed = false; + } else if (passedOrPromise !== true) { + handlePromise(passedOrPromise); + } + } + + if (pending) { + Promise.all(allPromises).then(resolvePending); + return pending.then(() => allPassed); + } + + return allPassed; + } +} + +module.exports = Concurrent; |