@@ -611,20 +611,32 @@ exports.isAlive = function isAlive(pid) {
611611 }
612612} ;
613613
614- function expectWarning ( name , expectedMessages ) {
614+ exports . noWarnCode = 'no_expected_warning_code' ;
615+
616+ function expectWarning ( name , expected ) {
617+ const map = new Map ( expected ) ;
615618 return exports . mustCall ( ( warning ) => {
616619 assert . strictEqual ( warning . name , name ) ;
617- assert . ok ( expectedMessages . includes ( warning . message ) ,
620+ assert . ok ( map . has ( warning . message ) ,
618621 `unexpected error message: "${ warning . message } "` ) ;
622+ const code = map . get ( warning . message ) ;
623+ if ( code === undefined ) {
624+ throw new Error ( 'An error code must be specified or use ' +
625+ 'common.noWarnCode if there is no error code. The error ' +
626+ `code for this warning was ${ warning . code } ` ) ;
627+ }
628+ if ( code !== exports . noWarnCode ) {
629+ assert . strictEqual ( warning . code , code ) ;
630+ }
619631 // Remove a warning message after it is seen so that we guarantee that we
620632 // get each message only once.
621- expectedMessages . splice ( expectedMessages . indexOf ( warning . message ) , 1 ) ;
622- } , expectedMessages . length ) ;
633+ map . delete ( expected ) ;
634+ } , map . size ) ;
623635}
624636
625- function expectWarningByName ( name , expected ) {
637+ function expectWarningByName ( name , expected , code ) {
626638 if ( typeof expected === 'string' ) {
627- expected = [ expected ] ;
639+ expected = [ [ expected , code ] ] ;
628640 }
629641 process . on ( 'warning' , expectWarning ( name , expected ) ) ;
630642}
@@ -633,8 +645,15 @@ function expectWarningByMap(warningMap) {
633645 const catchWarning = { } ;
634646 Object . keys ( warningMap ) . forEach ( ( name ) => {
635647 let expected = warningMap [ name ] ;
636- if ( typeof expected === 'string' ) {
637- expected = [ expected ] ;
648+ if ( ! Array . isArray ( expected ) ) {
649+ throw new Error ( 'warningMap entries must be arrays consisting of two ' +
650+ 'entries: [message, warningCode]' ) ;
651+ }
652+ if ( ! ( Array . isArray ( expected [ 0 ] ) ) ) {
653+ if ( expected . length === 0 ) {
654+ return ;
655+ }
656+ expected = [ [ expected [ 0 ] , expected [ 1 ] ] ] ;
638657 }
639658 catchWarning [ name ] = expectWarning ( name , expected ) ;
640659 } ) ;
@@ -644,9 +663,9 @@ function expectWarningByMap(warningMap) {
644663// accepts a warning name and description or array of descriptions or a map
645664// of warning names to description(s)
646665// ensures a warning is generated for each name/description pair
647- exports . expectWarning = function ( nameOrMap , expected ) {
666+ exports . expectWarning = function ( nameOrMap , expected , code ) {
648667 if ( typeof nameOrMap === 'string' ) {
649- expectWarningByName ( nameOrMap , expected ) ;
668+ expectWarningByName ( nameOrMap , expected , code ) ;
650669 } else {
651670 expectWarningByMap ( nameOrMap ) ;
652671 }
0 commit comments