aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/runner/reporter.js51
1 files changed, 49 insertions, 2 deletions
diff --git a/test/runner/reporter.js b/test/runner/reporter.js
index 74417f2fb..519d74709 100644
--- a/test/runner/reporter.js
+++ b/test/runner/reporter.js
@@ -1,6 +1,7 @@
import chalk from "chalk";
import { getBrowserString } from "./lib/getBrowserString.js";
import { prettyMs } from "./lib/prettyMs.js";
+import * as Diff from "diff";
export function reportTest( test, reportId, { browser, headless } ) {
if ( test.status === "passed" ) {
@@ -24,12 +25,58 @@ export function reportTest( test, reportId, { browser, headless } ) {
message += `\n${ chalk.gray( error.stack ) }`;
if ( error.expected && error.actual ) {
message += `\nexpected: ${ JSON.stringify( error.expected ) }`;
- message += `\nactual: ${ chalk.red( JSON.stringify( error.actual ) ) }`;
+ message += `\nactual: ${ JSON.stringify( error.actual ) }`;
+ let diff;
+
+ if (
+ Array.isArray( error.expected ) &&
+ Array.isArray( error.actual )
+ ) {
+
+ // Diff arrays
+ diff = Diff.diffArrays( error.expected, error.actual );
+ } else if (
+ typeof error.expected === "object" &&
+ typeof error.actual === "object"
+ ) {
+
+ // Diff objects
+ diff = Diff.diffJson( error.expected, error.actual );
+ } else if (
+ typeof error.expected === "number" &&
+ typeof error.expected === "number"
+ ) {
+
+ // Diff numbers directly
+ const value = error.actual - error.expected;
+ if ( value > 0 ) {
+ diff = [ { added: true, value: `+${ value }` } ];
+ } else {
+ diff = [ { removed: true, value: `${ value }` } ];
+ }
+ } else {
+
+ // Diff everything else as characters
+ diff = Diff.diffChars( `${ error.expected }`, `${ error.actual }` );
+ }
+
+ message += "\n";
+ message += diff
+ .map( ( part ) => {
+ if ( part.added ) {
+ return chalk.green( part.value );
+ }
+ if ( part.removed ) {
+ return chalk.red( part.value );
+ }
+ return chalk.gray( part.value );
+ } )
+ .join( "" );
}
}
}
- console.log( "\n\n" + message );
+ console.log( `\n\n${ message }` );
// Only return failed messages
if ( test.status === "failed" ) {