diff options
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; |