@@ -3,6 +3,18 @@ import { getBrowserString } from "./lib/getBrowserString.js";
33import { prettyMs } from "./lib/prettyMs.js" ;
44import * as Diff from "diff" ;
55
6+ function serializeForDiff ( value ) {
7+
8+ // Use naive serialization for everything except types with confusable values
9+ if ( typeof value === "string" ) {
10+ return JSON . stringify ( value ) ;
11+ }
12+ if ( typeof value === "bigint" ) {
13+ return `${ value } n` ;
14+ }
15+ return `${ value } ` ;
16+ }
17+
618export function reportTest ( test , reportId , { browser, headless } ) {
719 if ( test . status === "passed" ) {
820
@@ -25,15 +37,19 @@ export function reportTest( test, reportId, { browser, headless } ) {
2537 message += `\n${ error . message } ` ;
2638 }
2739 message += `\n${ chalk . gray ( error . stack ) } ` ;
28- if ( "expected" in error && "actual" in error ) {
29- message += `\nexpected: ${ JSON . stringify ( error . expected ) } ` ;
30- message += `\nactual: ${ JSON . stringify ( error . actual ) } ` ;
40+
41+ // Show expected and actual values
42+ // if either is defined and non-null.
43+ // error.actual is set to null for failed
44+ // assert.expect() assertions, so skip those as well.
45+ // This should be fine because error.expected would
46+ // have to also be null for this to be skipped.
47+ if ( error . expected != null || error . actual != null ) {
48+ message += `\nexpected: ${ chalk . red ( JSON . stringify ( error . expected ) ) } ` ;
49+ message += `\nactual: ${ chalk . green ( JSON . stringify ( error . actual ) ) } ` ;
3150 let diff ;
3251
33- if (
34- Array . isArray ( error . expected ) &&
35- Array . isArray ( error . actual )
36- ) {
52+ if ( Array . isArray ( error . expected ) && Array . isArray ( error . actual ) ) {
3753
3854 // Diff arrays
3955 diff = Diff . diffArrays ( error . expected , error . actual ) ;
@@ -46,7 +62,7 @@ export function reportTest( test, reportId, { browser, headless } ) {
4662 diff = Diff . diffJson ( error . expected , error . actual ) ;
4763 } else if (
4864 typeof error . expected === "number" &&
49- typeof error . expected === "number"
65+ typeof error . actual === "number"
5066 ) {
5167
5268 // Diff numbers directly
@@ -57,30 +73,35 @@ export function reportTest( test, reportId, { browser, headless } ) {
5773 diff = [ { removed : true , value : `${ value } ` } ] ;
5874 }
5975 } else if (
60- typeof error . expected === "boolean " &&
61- typeof error . actual === "boolean "
76+ typeof error . expected === "string " &&
77+ typeof error . actual === "string "
6278 ) {
6379
64- // Show the actual boolean in red
65- diff = [ { removed : true , value : ` ${ error . actual } ` } ] ;
80+ // Diff the characters of strings
81+ diff = Diff . diffChars ( error . expected , error . actual ) ;
6682 } else {
6783
68- // Diff everything else as characters
69- diff = Diff . diffChars ( `${ error . expected } ` , `${ error . actual } ` ) ;
84+ // Diff everything else as words
85+ diff = Diff . diffWords (
86+ serializeForDiff ( error . expected ) ,
87+ serializeForDiff ( error . actual )
88+ ) ;
7089 }
7190
72- message += "\n" ;
73- message += diff
74- . map ( ( part ) => {
75- if ( part . added ) {
76- return chalk . green ( part . value ) ;
77- }
78- if ( part . removed ) {
79- return chalk . red ( part . value ) ;
80- }
81- return chalk . gray ( part . value ) ;
82- } )
83- . join ( "" ) ;
91+ if ( diff ) {
92+ message += "\n" ;
93+ message += diff
94+ . map ( ( part ) => {
95+ if ( part . added ) {
96+ return chalk . green ( part . value ) ;
97+ }
98+ if ( part . removed ) {
99+ return chalk . red ( part . value ) ;
100+ }
101+ return chalk . gray ( part . value ) ;
102+ } )
103+ . join ( "" ) ;
104+ }
84105 }
85106 }
86107 }
0 commit comments