diff --git a/source/group.ts b/source/group.ts index a678ff5..0fce5fe 100644 --- a/source/group.ts +++ b/source/group.ts @@ -4,23 +4,32 @@ import {type Result, Test, TestContext} from "./test.js"; export async function setup( name: string, fn: (group: Group) => Promise, + options?: GroupOptions, ): Promise { - const group = new Group(name); + const group = new Group(name, options); await fn(group); await group.run(); return group; } +/** Options for test groups. */ +export type GroupOptions = { + parallel?: boolean; +}; + /** A collection of tests. */ -export class Group { +export class Group implements GroupOptions { public context: TestContext = new TestContext(); + public parallel: boolean; public results: Result[] = []; public tests: Test[] = []; private _afterAll: (() => Promise) | undefined; private _beforeAll: (() => Promise) | undefined; - constructor(public name: string) {} + constructor(public name: string, options?: GroupOptions) { + this.parallel = options?.parallel ?? false; + } /** Set a function to run after all tests have finished. */ afterAll(fn: Group["_afterAll"]): void { @@ -48,9 +57,18 @@ export class Group { await this._beforeAll(); } - const results = await Promise.all( - this.tests.map(async (test) => test.run(this.context)), - ); + let results: Result[]; + if (this.parallel) { + results = await Promise.all( + this.tests.map(async (test) => test.run(this.context)), + ); + } else { + results = []; + for (const test of this.tests) { + // eslint-disable-next-line no-await-in-loop + results.push(await test.run(this.context)); + } + } if (this._afterAll !== undefined) { await this._afterAll(); diff --git a/tests/index.ts b/tests/index.ts index 151fb2d..43b8ed2 100644 --- a/tests/index.ts +++ b/tests/index.ts @@ -34,24 +34,30 @@ void setup("add", async (group) => { }); }); -void setup("subtract", async (group) => { - group.beforeAll(async () => { - console.log("subtract beforeAll hook"); - }); +void setup( + "subtract", + async (group) => { + group.beforeAll(async () => { + console.log("subtract beforeAll hook"); + }); - group.afterAll(async () => { - console.log("subtract afterAll hook"); - }); + group.afterAll(async () => { + console.log("subtract afterAll hook"); + }); - group.test("subtract(1, 1) = 0", async (test) => { - test.equals(await subtract(1, 1), 0); - }); + group.test("subtract(1, 1) = 0", async (test) => { + test.equals(await subtract(1, 1), 0); + }); - group.skip("subtract(1, 1) = 1", async (test) => { - test.equals(await subtract(1, 1), 1); - }); + group.skip("subtract(1, 1) = 1", async (test) => { + test.equals(await subtract(1, 1), 1); + }); - group.test("subtract(1, 1) = 2", async (test) => { - test.equals(await subtract(1, 1), 2, "extra title"); - }); -}); + group.test("subtract(1, 1) = 2", async (test) => { + test.equals(await subtract(1, 1), 2, "extra title"); + }); + }, + { + parallel: false, + }, +);