2017-04-06 16:17:43 +08:00
"use strict" ;
2025-07-02 20:10:54 +08:00
2019-06-11 19:09:42 +08:00
const fs = require ( "graceful-fs" ) ;
2017-04-06 16:17:43 +08:00
const path = require ( "path" ) ;
2014-06-18 04:34:30 +08:00
2018-12-19 01:29:12 +08:00
const check = ( expected , actual ) => {
2019-02-19 15:58:46 +08:00
if ( expected instanceof RegExp ) {
2018-12-19 01:29:12 +08:00
expected = { message : expected } ;
}
2021-04-13 23:29:10 +08:00
if ( Array . isArray ( expected ) ) {
return expected . every ( e => check ( e , actual ) ) ;
}
2018-12-19 01:29:12 +08:00
return Object . keys ( expected ) . every ( key => {
let value = actual [ key ] ;
2019-02-19 15:58:46 +08:00
if ( typeof value === "object" ) {
2018-12-19 01:29:12 +08:00
value = JSON . stringify ( value ) ;
}
return expected [ key ] . test ( value ) ;
2019-02-19 15:58:46 +08:00
} ) ;
} ;
2018-12-19 01:29:12 +08:00
const explain = object => {
2019-02-19 15:58:46 +08:00
if ( object instanceof RegExp ) {
2018-12-19 01:29:12 +08:00
object = { message : object } ;
}
2019-02-19 15:58:46 +08:00
return Object . keys ( object )
. map ( key => {
let value = object [ key ] ;
if ( typeof value === "object" && ! ( value instanceof RegExp ) ) {
value = JSON . stringify ( value ) ;
}
let msg = ` ${ key } = ${ value } ` ;
2025-07-02 20:10:54 +08:00
if ( key !== "stack" && key !== "details" && msg . length > 100 ) {
2024-07-31 10:39:30 +08:00
msg = ` ${ msg . slice ( 0 , 97 ) } ... ` ;
2025-07-02 20:10:54 +08:00
}
2019-02-19 15:58:46 +08:00
return msg ;
} )
. join ( "; " ) ;
} ;
2018-12-19 01:29:12 +08:00
2021-04-13 23:29:10 +08:00
const diffItems = ( actual , expected , kind ) => {
const tooMuch = actual . slice ( ) ;
const missing = expected . slice ( ) ;
for ( let i = 0 ; i < missing . length ; i ++ ) {
const current = missing [ i ] ;
for ( let j = 0 ; j < tooMuch . length ; j ++ ) {
if ( check ( current , tooMuch [ j ] ) ) {
tooMuch . splice ( j , 1 ) ;
missing . splice ( i , 1 ) ;
i -- ;
break ;
}
}
}
const diff = [ ] ;
if ( missing . length > 0 ) {
diff . push ( ` The following expected ${ kind } s are missing:
2021-11-03 01:16:59 +08:00
$ { missing . map ( item => ` ${ explain ( item ) } ` ) . join ( "\n\n" ) } ` );
2021-04-13 23:29:10 +08:00
}
if ( tooMuch . length > 0 ) {
diff . push ( ` The following ${ kind } s are unexpected:
$ { tooMuch . map ( item => ` ${ explain ( item ) } ` ) . join ( "\n\n" ) } ` );
}
return diff . join ( "\n\n" ) ;
} ;
2018-02-25 09:00:20 +08:00
module . exports = function checkArrayExpectation (
testDirectory ,
object ,
kind ,
filename ,
upperCaseKind ,
2024-11-01 21:55:49 +08:00
options ,
2018-02-25 09:00:20 +08:00
done
) {
if ( ! done ) {
2024-11-01 21:55:49 +08:00
done = options ;
options = upperCaseKind ;
2016-07-03 19:13:01 +08:00
upperCaseKind = filename ;
2017-04-06 16:17:43 +08:00
filename = ` ${ kind } s ` ;
2016-07-03 19:13:01 +08:00
}
2018-09-07 20:11:48 +08:00
let array = object [ ` ${ kind } s ` ] ;
2024-08-02 02:36:27 +08:00
if ( Array . isArray ( array ) && kind === "warning" ) {
array = array . filter ( item => ! /from Terser/ . test ( item ) ) ;
2018-12-30 18:50:04 +08:00
}
2018-02-25 09:00:20 +08:00
if ( fs . existsSync ( path . join ( testDirectory , ` ${ filename } .js ` ) ) ) {
2017-04-06 16:17:43 +08:00
const expectedFilename = path . join ( testDirectory , ` ${ filename } .js ` ) ;
2025-07-02 20:10:54 +08:00
2024-11-01 21:55:49 +08:00
let expected = require ( expectedFilename ) ;
2025-07-02 20:10:54 +08:00
2024-11-01 21:55:49 +08:00
if ( typeof expected === "function" ) {
expected = expected ( options ) ;
}
2021-04-13 23:29:10 +08:00
const diff = diffItems ( array , expected , kind ) ;
2018-12-30 18:50:04 +08:00
if ( expected . length < array . length ) {
2018-02-25 09:00:20 +08:00
return (
done (
new Error (
2021-04-13 23:29:10 +08:00
` More ${ kind } s ( ${ array . length } instead of ${ expected . length } ) while compiling than expected: \n \n ${ diff } \n \n Check expected ${ kind } s: ${ expectedFilename } `
2018-02-25 09:00:20 +08:00
)
) ,
true
) ;
2018-12-30 18:50:04 +08:00
} else if ( expected . length > array . length ) {
2018-02-25 09:00:20 +08:00
return (
done (
new Error (
2021-04-13 23:29:10 +08:00
` Less ${ kind } s ( ${ array . length } instead of ${ expected . length } ) while compiling than expected: \n \n ${ diff } \n \n Check expected ${ kind } s: ${ expectedFilename } `
2018-02-25 09:00:20 +08:00
)
) ,
true
) ;
2018-12-30 18:50:04 +08:00
}
2018-02-25 09:00:20 +08:00
for ( let i = 0 ; i < array . length ; i ++ ) {
if ( Array . isArray ( expected [ i ] ) ) {
2025-05-28 22:40:54 +08:00
for ( const expectedItem of expected [ i ] ) {
if ( ! check ( expectedItem , array [ i ] ) ) {
2018-02-25 09:00:20 +08:00
return (
done (
new Error (
2019-02-19 15:58:46 +08:00
` ${ upperCaseKind } ${ i } : ${ explain (
array [ i ]
2025-05-28 22:40:54 +08:00
) } doesn ' t match $ { explain ( expectedItem ) } `
2018-02-25 09:00:20 +08:00
)
) ,
true
) ;
2018-12-30 18:50:04 +08:00
}
2014-06-18 04:34:30 +08:00
}
2024-03-14 00:12:18 +08:00
} else if ( ! check ( expected [ i ] , array [ i ] ) ) {
2018-02-25 09:00:20 +08:00
return (
done (
new Error (
2019-02-19 15:58:46 +08:00
` ${ upperCaseKind } ${ i } : ${ explain (
array [ i ]
) } doesn ' t match $ { explain ( expected [ i ] ) } `
2018-02-25 09:00:20 +08:00
)
) ,
true
) ;
2024-03-14 00:12:18 +08:00
}
2014-06-18 04:34:30 +08:00
}
2018-02-25 09:00:20 +08:00
} else if ( array . length > 0 ) {
return (
done (
2019-02-19 15:58:46 +08:00
new Error (
` ${ upperCaseKind } s while compiling: \n \n ${ array
. map ( explain )
. join ( "\n\n" ) } `
)
2018-02-25 09:00:20 +08:00
) ,
true
) ;
2014-06-18 04:34:30 +08:00
}
2017-11-15 21:08:11 +08:00
} ;