diff --git a/testing/mod.ts b/testing/mod.ts index 462c13fb1691..fb9b661d0517 100644 --- a/testing/mod.ts +++ b/testing/mod.ts @@ -102,6 +102,7 @@ export function test(t: TestDefinition | TestFunction): void { const RED_FAILED = red("FAILED"); const GREEN_OK = green("OK"); +const RED_BG_FAIL = bgRed(" FAIL "); interface TestStats { filtered: number; @@ -165,6 +166,17 @@ function report(result: TestResult): void { result.printed = true; } +function printFailedSummary(results: TestResults): void { + results.cases.forEach( + (v): void => { + if (!v.ok) { + console.error(`${RED_BG_FAIL} ${red(v.name)}`); + console.error(v.error); + } + } + ); +} + function printResults( stats: TestStats, results: TestResults, @@ -184,7 +196,7 @@ function printResults( } // Attempting to match the output of Rust's test runner. print( - `\ntest result: ${stats.failed ? RED_FAILED : GREEN_OK}. ` + + `\ntest result: ${stats.failed ? RED_BG_FAIL : GREEN_OK} ` + `${stats.passed} passed; ${stats.failed} failed; ` + `${stats.ignored} ignored; ${stats.measured} measured; ` + `${stats.filtered} filtered out ` + @@ -251,6 +263,7 @@ async function runTestsParallel( async function runTestsSerial( stats: TestStats, + results: TestResults, tests: TestDefinition[], exitOnFail: boolean, disableLog: boolean @@ -273,6 +286,14 @@ async function runTestsSerial( print( GREEN_OK + " " + name + " " + promptTestTime(end - start, true) ); + results.cases.forEach( + (v): void => { + if (v.name === name) { + v.ok = true; + v.printed = true; + } + } + ); } catch (err) { if (disableLog) { print(CLEAR_LINE, false); @@ -280,6 +301,15 @@ async function runTestsSerial( print(`${RED_FAILED} ${name}`); print(err.stack); stats.failed++; + results.cases.forEach( + (v): void => { + if (v.name === name) { + v.error = err; + v.ok = false; + v.printed = true; + } + } + ); if (exitOnFail) { break; } @@ -329,7 +359,7 @@ export async function runTests({ if (parallel) { await runTestsParallel(stats, results, tests, exitOnFail); } else { - await runTestsSerial(stats, tests, exitOnFail, disableLog); + await runTestsSerial(stats, results, tests, exitOnFail, disableLog); } const end = performance.now(); if (disableLog) { @@ -341,6 +371,7 @@ export async function runTests({ // promise rejections being swallowed. setTimeout((): void => { console.error(`There were ${stats.failed} test failures.`); + printFailedSummary(results); Deno.exit(1); }, 0); }