From 60db72bf6a83570b4f59ce595e652ac9396ebedc Mon Sep 17 00:00:00 2001 From: 59naga Date: Mon, 20 Aug 2018 03:27:03 +0900 Subject: [PATCH] :heavy_plus_sign: Describe / add manual execution option(immediate) --- src/describe.mjs | 64 +++++++++++-------- .../immediate false(manual)/expected.mjs | 8 +++ .../immediate false(manual)/index.mjs | 12 ++++ 3 files changed, 56 insertions(+), 28 deletions(-) create mode 100644 test/describe/immediate false(manual)/expected.mjs create mode 100644 test/describe/immediate false(manual)/index.mjs diff --git a/src/describe.mjs b/src/describe.mjs index 2e202ee..7768d6a 100644 --- a/src/describe.mjs +++ b/src/describe.mjs @@ -7,6 +7,7 @@ export default class Describe { this.opts = Object.assign( { timeout: 1000, + immediate: true, concurrency: Infinity }, options @@ -39,40 +40,47 @@ export default class Describe { this.block.setOptions = this.setOptions.bind(this); this.waitForChildren = this.waitForChildren.bind(this); + this.evaluted = new Promise(resolve => { + if (this.opts.immediate) { + this.evaluateBlock = () => {}; + setImmediate(resolve); + } else { + this.evaluateBlock = resolve; + } + }); this.finish = new Promise(finish => { - this.busy = new Promise(free => { + this.busy = new Promise(async free => { + await this.evaluted; + try { + await Promise.each(this.hooks.before, Promise.try); + } catch (error) { + this.opts.reporter.fail("before hooks", error); + process.emit("exit"); + } + + while (this.tasks.length) { + const tasks = this.tasks.slice(); + this.tasks.length = 0; + + if (this.opts.concurrency === 1) { + await Promise.each(tasks, ([title, task]) => task()); + } else { + await Promise.map(tasks, ([title, task]) => task(), { + concurrency: this.opts.concurrency || Infinity + }); + } + } + free(); + setImmediate(async () => { + await this.waitForChildren(); try { - await Promise.each(this.hooks.before, Promise.try); + await Promise.each(this.hooks.after, Promise.try); } catch (error) { - this.opts.reporter.fail("before hooks", error); + this.opts.reporter.fail("after hooks", error); process.emit("exit"); } - - while (this.tasks.length) { - const tasks = this.tasks.slice(); - this.tasks.length = 0; - - if (this.opts.concurrency === 1) { - await Promise.each(tasks, ([title, task]) => task()); - } else { - await Promise.map(tasks, ([title, task]) => task(), { - concurrency: this.opts.concurrency || Infinity - }); - } - } - free(); - - setImmediate(async () => { - await this.waitForChildren(); - try { - await Promise.each(this.hooks.after, Promise.try); - } catch (error) { - this.opts.reporter.fail("after hooks", error); - process.emit("exit"); - } - finish(); - }); + finish(); }); }); }); diff --git a/test/describe/immediate false(manual)/expected.mjs b/test/describe/immediate false(manual)/expected.mjs new file mode 100644 index 0000000..1f16d13 --- /dev/null +++ b/test/describe/immediate false(manual)/expected.mjs @@ -0,0 +1,8 @@ +export const code = 1; +export const stdout = ` + foo + + 0 passing (ELAPSED ms) +`; + +export const stderr = ``; diff --git a/test/describe/immediate false(manual)/index.mjs b/test/describe/immediate false(manual)/index.mjs new file mode 100644 index 0000000..96d83ef --- /dev/null +++ b/test/describe/immediate false(manual)/index.mjs @@ -0,0 +1,12 @@ +import { describe } from "eastern"; + +describe( + "foo", + it => { + it("bar"); + it("bar", () => { + console.log("baz"); + }); + }, + { immediate: false } +);