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