From 8f0407efad81ea8c255daf03c0e19b6bae3b88b6 Mon Sep 17 00:00:00 2001 From: Vincent LE GOFF Date: Thu, 28 Mar 2019 17:29:27 +0100 Subject: [PATCH] Fix parallel testing (denoland/deno_std#309) Fixes denoland/deno_std#308 Co-authored by @chiefbiiko Original: https://github.com/denoland/deno_std/commit/cac060f3882ba5df2e0e641350b33ef771c8ee44 --- testing/main.ts | 10 +++++++++- testing/mod.ts | 19 +++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/testing/main.ts b/testing/main.ts index 077d662ee5..00502b2377 100644 --- a/testing/main.ts +++ b/testing/main.ts @@ -1,3 +1,11 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. import { runTests } from "./mod.ts"; -runTests(); + +async function main() { + // Testing entire test suite serially + await runTests(); + // Testing parallel execution on a subset that does not depend on exec order + await runTests({ parallel: true, only: /^testing/ }); +} + +main(); diff --git a/testing/mod.ts b/testing/mod.ts index d0d755e78a..71f27db20c 100644 --- a/testing/mod.ts +++ b/testing/mod.ts @@ -10,7 +10,7 @@ export interface TestDefinition { } let filterRegExp: RegExp | null; -const tests: TestDefinition[] = []; +const candidates: TestDefinition[] = []; let filtered = 0; @@ -35,7 +35,7 @@ export function test(t: TestDefinition | TestFunction): void { throw new Error("Test function may not be anonymous"); } if (filter(name)) { - tests.push({ fn, name }); + candidates.push({ fn, name }); } else { filtered++; } @@ -124,8 +124,8 @@ function previousPrinted(name: string, results: TestResults): boolean { async function createTestCase( stats: TestStats, results: TestResults, - { fn, name }: TestDefinition, - exitOnFail: boolean + exitOnFail: boolean, + { fn, name }: TestDefinition ): Promise { const result: TestResult = results.cases.get(results.keys.get(name)); try { @@ -197,6 +197,8 @@ async function runTestsSerial( export interface RunOptions { parallel?: boolean; exitOnFail?: boolean; + only?: RegExp; + skip?: RegExp; } /** @@ -205,11 +207,16 @@ export interface RunOptions { */ export async function runTests({ parallel = false, - exitOnFail = false + exitOnFail = false, + only = /[^\s]/, + skip = /^\s*$/ }: RunOptions = {}): Promise { + const tests: TestDefinition[] = candidates.filter( + ({ name }) => only.test(name) && !skip.test(name) + ); const stats: TestStats = { measured: 0, - ignored: 0, + ignored: candidates.length - tests.length, filtered: filtered, passed: 0, failed: 0