Add a parallel option to groups.

This commit is contained in:
Bauke 2022-12-27 15:25:04 +01:00
parent 035cac86cc
commit a0d46f7018
Signed by: Bauke
GPG Key ID: C1C0F29952BCF558
2 changed files with 47 additions and 23 deletions

View File

@ -4,23 +4,32 @@ import {type Result, Test, TestContext} from "./test.js";
export async function setup( export async function setup(
name: string, name: string,
fn: (group: Group) => Promise<void>, fn: (group: Group) => Promise<void>,
options?: GroupOptions,
): Promise<Group> { ): Promise<Group> {
const group = new Group(name); const group = new Group(name, options);
await fn(group); await fn(group);
await group.run(); await group.run();
return group; return group;
} }
/** Options for test groups. */
export type GroupOptions = {
parallel?: boolean;
};
/** A collection of tests. */ /** A collection of tests. */
export class Group { export class Group implements GroupOptions {
public context: TestContext = new TestContext(); public context: TestContext = new TestContext();
public parallel: boolean;
public results: Result[] = []; public results: Result[] = [];
public tests: Test[] = []; public tests: Test[] = [];
private _afterAll: (() => Promise<void>) | undefined; private _afterAll: (() => Promise<void>) | undefined;
private _beforeAll: (() => Promise<void>) | undefined; private _beforeAll: (() => Promise<void>) | 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. */ /** Set a function to run after all tests have finished. */
afterAll(fn: Group["_afterAll"]): void { afterAll(fn: Group["_afterAll"]): void {
@ -48,9 +57,18 @@ export class Group {
await this._beforeAll(); await this._beforeAll();
} }
const results = await Promise.all( let results: Result[];
if (this.parallel) {
results = await Promise.all(
this.tests.map(async (test) => test.run(this.context)), 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) { if (this._afterAll !== undefined) {
await this._afterAll(); await this._afterAll();

View File

@ -34,7 +34,9 @@ void setup("add", async (group) => {
}); });
}); });
void setup("subtract", async (group) => { void setup(
"subtract",
async (group) => {
group.beforeAll(async () => { group.beforeAll(async () => {
console.log("subtract beforeAll hook"); console.log("subtract beforeAll hook");
}); });
@ -54,4 +56,8 @@ void setup("subtract", async (group) => {
group.test("subtract(1, 1) = 2", async (test) => { group.test("subtract(1, 1) = 2", async (test) => {
test.equals(await subtract(1, 1), 2, "extra title"); test.equals(await subtract(1, 1), 2, "extra title");
}); });
}); },
{
parallel: false,
},
);