11'use strict' ;
2+
23const common = require ( '../common' ) ;
34const assert = require ( 'assert' ) ;
45const util = require ( 'util' ) ;
6+ const { AssertionError } = assert ;
57
68// Template tag function turning an error message into a RegExp
79// for assert.throws()
@@ -25,7 +27,7 @@ function re(literals, ...values) {
2527// That is why we discourage using deepEqual in our own tests.
2628
2729// Turn off no-restricted-properties because we are testing deepEqual!
28- /* eslint-disable no-restricted-properties */
30+ /* eslint-disable no-restricted-properties, prefer-common-expectserror */
2931
3032const arr = new Uint8Array ( [ 120 , 121 , 122 , 10 ] ) ;
3133const buf = Buffer . from ( arr ) ;
@@ -545,4 +547,299 @@ assertDeepAndStrictEqual(-0, -0);
545547 assertDeepAndStrictEqual ( a , b ) ;
546548}
547549
550+ assert . doesNotThrow (
551+ ( ) => assert . deepEqual ( new Date ( 2000 , 3 , 14 ) , new Date ( 2000 , 3 , 14 ) ) ,
552+ 'deepEqual(new Date(2000, 3, 14), new Date(2000, 3, 14))' ) ;
553+
554+ assert . throws ( ( ) => assert . deepEqual ( new Date ( ) , new Date ( 2000 , 3 , 14 ) ) ,
555+ AssertionError ,
556+ 'deepEqual(new Date(), new Date(2000, 3, 14))' ) ;
557+
558+ assert . throws (
559+ ( ) => assert . notDeepEqual ( new Date ( 2000 , 3 , 14 ) , new Date ( 2000 , 3 , 14 ) ) ,
560+ AssertionError ,
561+ 'notDeepEqual(new Date(2000, 3, 14), new Date(2000, 3, 14))'
562+ ) ;
563+
564+ assert . doesNotThrow (
565+ ( ) => assert . notDeepEqual ( new Date ( ) , new Date ( 2000 , 3 , 14 ) ) ,
566+ 'notDeepEqual(new Date(), new Date(2000, 3, 14))'
567+ ) ;
568+
569+ assert . doesNotThrow ( ( ) => assert . deepEqual ( / a / , / a / ) ) ;
570+ assert . doesNotThrow ( ( ) => assert . deepEqual ( / a / g, / a / g) ) ;
571+ assert . doesNotThrow ( ( ) => assert . deepEqual ( / a / i, / a / i) ) ;
572+ assert . doesNotThrow ( ( ) => assert . deepEqual ( / a / m, / a / m) ) ;
573+ assert . doesNotThrow ( ( ) => assert . deepEqual ( / a / igm, / a / igm) ) ;
574+ assert . throws ( ( ) => assert . deepEqual ( / a b / , / a / ) ,
575+ {
576+ code : 'ERR_ASSERTION' ,
577+ name : 'AssertionError [ERR_ASSERTION]' ,
578+ message : '/ab/ deepEqual /a/'
579+ } ) ;
580+ assert . throws ( ( ) => assert . deepEqual ( / a / g, / a / ) ,
581+ {
582+ code : 'ERR_ASSERTION' ,
583+ name : 'AssertionError [ERR_ASSERTION]' ,
584+ message : '/a/g deepEqual /a/'
585+ } ) ;
586+ assert . throws ( ( ) => assert . deepEqual ( / a / i, / a / ) ,
587+ {
588+ code : 'ERR_ASSERTION' ,
589+ name : 'AssertionError [ERR_ASSERTION]' ,
590+ message : '/a/i deepEqual /a/'
591+ } ) ;
592+ assert . throws ( ( ) => assert . deepEqual ( / a / m, / a / ) ,
593+ {
594+ code : 'ERR_ASSERTION' ,
595+ name : 'AssertionError [ERR_ASSERTION]' ,
596+ message : '/a/m deepEqual /a/'
597+ } ) ;
598+ assert . throws ( ( ) => assert . deepEqual ( / a / igm, / a / im) ,
599+ {
600+ code : 'ERR_ASSERTION' ,
601+ name : 'AssertionError [ERR_ASSERTION]' ,
602+ message : '/a/gim deepEqual /a/im'
603+ } ) ;
604+
605+ {
606+ const re1 = / a / g;
607+ re1 . lastIndex = 3 ;
608+ assert . doesNotThrow ( ( ) => assert . deepEqual ( re1 , / a / g) ) ;
609+ }
610+
611+ assert . doesNotThrow ( ( ) => assert . deepEqual ( 4 , '4' ) , 'deepEqual(4, \'4\')' ) ;
612+ assert . doesNotThrow ( ( ) => assert . deepEqual ( true , 1 ) , 'deepEqual(true, 1)' ) ;
613+ assert . throws ( ( ) => assert . deepEqual ( 4 , '5' ) ,
614+ AssertionError ,
615+ 'deepEqual( 4, \'5\')' ) ;
616+
617+ // Having the same number of owned properties && the same set of keys.
618+ assert . doesNotThrow ( ( ) => assert . deepEqual ( { a : 4 } , { a : 4 } ) ) ;
619+ assert . doesNotThrow ( ( ) => assert . deepEqual ( { a : 4 , b : '2' } , { a : 4 , b : '2' } ) ) ;
620+ assert . doesNotThrow ( ( ) => assert . deepEqual ( [ 4 ] , [ '4' ] ) ) ;
621+ assert . throws (
622+ ( ) => assert . deepEqual ( { a : 4 } , { a : 4 , b : true } ) , AssertionError ) ;
623+ assert . doesNotThrow ( ( ) => assert . deepEqual ( [ 'a' ] , { 0 : 'a' } ) ) ;
624+ assert . doesNotThrow ( ( ) => assert . deepEqual ( { a : 4 , b : '1' } , { b : '1' , a : 4 } ) ) ;
625+ const a1 = [ 1 , 2 , 3 ] ;
626+ const a2 = [ 1 , 2 , 3 ] ;
627+ a1 . a = 'test' ;
628+ a1 . b = true ;
629+ a2 . b = true ;
630+ a2 . a = 'test' ;
631+ assert . throws ( ( ) => assert . deepEqual ( Object . keys ( a1 ) , Object . keys ( a2 ) ) ,
632+ AssertionError ) ;
633+ assert . doesNotThrow ( ( ) => assert . deepEqual ( a1 , a2 ) ) ;
634+
635+ // Having an identical prototype property.
636+ const nbRoot = {
637+ toString ( ) { return `${ this . first } ${ this . last } ` ; }
638+ } ;
639+
640+ function nameBuilder ( first , last ) {
641+ this . first = first ;
642+ this . last = last ;
643+ return this ;
644+ }
645+ nameBuilder . prototype = nbRoot ;
646+
647+ function nameBuilder2 ( first , last ) {
648+ this . first = first ;
649+ this . last = last ;
650+ return this ;
651+ }
652+ nameBuilder2 . prototype = nbRoot ;
653+
654+ const nb1 = new nameBuilder ( 'Ryan' , 'Dahl' ) ;
655+ let nb2 = new nameBuilder2 ( 'Ryan' , 'Dahl' ) ;
656+
657+ assert . doesNotThrow ( ( ) => assert . deepEqual ( nb1 , nb2 ) ) ;
658+
659+ nameBuilder2 . prototype = Object ;
660+ nb2 = new nameBuilder2 ( 'Ryan' , 'Dahl' ) ;
661+ assert . doesNotThrow ( ( ) => assert . deepEqual ( nb1 , nb2 ) ) ;
662+
663+ // Primitives and object.
664+ assert . throws ( ( ) => assert . deepEqual ( null , { } ) , AssertionError ) ;
665+ assert . throws ( ( ) => assert . deepEqual ( undefined , { } ) , AssertionError ) ;
666+ assert . throws ( ( ) => assert . deepEqual ( 'a' , [ 'a' ] ) , AssertionError ) ;
667+ assert . throws ( ( ) => assert . deepEqual ( 'a' , { 0 : 'a' } ) , AssertionError ) ;
668+ assert . throws ( ( ) => assert . deepEqual ( 1 , { } ) , AssertionError ) ;
669+ assert . throws ( ( ) => assert . deepEqual ( true , { } ) , AssertionError ) ;
670+ assert . throws ( ( ) => assert . deepEqual ( Symbol ( ) , { } ) , AssertionError ) ;
671+
672+ // Primitive wrappers and object.
673+ assert . doesNotThrow ( ( ) => assert . deepEqual ( new String ( 'a' ) , [ 'a' ] ) ,
674+ AssertionError ) ;
675+ assert . doesNotThrow ( ( ) => assert . deepEqual ( new String ( 'a' ) , { 0 : 'a' } ) ,
676+ AssertionError ) ;
677+ assert . doesNotThrow ( ( ) => assert . deepEqual ( new Number ( 1 ) , { } ) , AssertionError ) ;
678+ assert . doesNotThrow ( ( ) => assert . deepEqual ( new Boolean ( true ) , { } ) ,
679+ AssertionError ) ;
680+
681+ // Same number of keys but different key names.
682+ assert . throws ( ( ) => assert . deepEqual ( { a : 1 } , { b : 1 } ) , AssertionError ) ;
683+
684+ assert . doesNotThrow (
685+ ( ) => assert . deepStrictEqual ( new Date ( 2000 , 3 , 14 ) , new Date ( 2000 , 3 , 14 ) ) ,
686+ 'deepStrictEqual(new Date(2000, 3, 14), new Date(2000, 3, 14))'
687+ ) ;
688+
689+ assert . throws (
690+ ( ) => assert . deepStrictEqual ( new Date ( ) , new Date ( 2000 , 3 , 14 ) ) ,
691+ AssertionError ,
692+ 'deepStrictEqual(new Date(), new Date(2000, 3, 14))'
693+ ) ;
694+
695+ assert . throws (
696+ ( ) => assert . notDeepStrictEqual ( new Date ( 2000 , 3 , 14 ) , new Date ( 2000 , 3 , 14 ) ) ,
697+ AssertionError ,
698+ 'notDeepStrictEqual(new Date(2000, 3, 14), new Date(2000, 3, 14))'
699+ ) ;
700+
701+ assert . doesNotThrow (
702+ ( ) => assert . notDeepStrictEqual ( new Date ( ) , new Date ( 2000 , 3 , 14 ) ) ,
703+ 'notDeepStrictEqual(new Date(), new Date(2000, 3, 14))'
704+ ) ;
705+
706+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( / a / , / a / ) ) ;
707+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( / a / g, / a / g) ) ;
708+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( / a / i, / a / i) ) ;
709+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( / a / m, / a / m) ) ;
710+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( / a / igm, / a / igm) ) ;
711+ assert . throws (
712+ ( ) => assert . deepStrictEqual ( / a b / , / a / ) ,
713+ {
714+ code : 'ERR_ASSERTION' ,
715+ name : 'AssertionError [ERR_ASSERTION]' ,
716+ message : '/ab/ deepStrictEqual /a/'
717+ } ) ;
718+ assert . throws (
719+ ( ) => assert . deepStrictEqual ( / a / g, / a / ) ,
720+ {
721+ code : 'ERR_ASSERTION' ,
722+ name : 'AssertionError [ERR_ASSERTION]' ,
723+ message : '/a/g deepStrictEqual /a/'
724+ } ) ;
725+ assert . throws (
726+ ( ) => assert . deepStrictEqual ( / a / i, / a / ) ,
727+ {
728+ code : 'ERR_ASSERTION' ,
729+ name : 'AssertionError [ERR_ASSERTION]' ,
730+ message : '/a/i deepStrictEqual /a/'
731+ } ) ;
732+ assert . throws (
733+ ( ) => assert . deepStrictEqual ( / a / m, / a / ) ,
734+ {
735+ code : 'ERR_ASSERTION' ,
736+ name : 'AssertionError [ERR_ASSERTION]' ,
737+ message : '/a/m deepStrictEqual /a/'
738+ } ) ;
739+ assert . throws (
740+ ( ) => assert . deepStrictEqual ( / a / igm, / a / im) ,
741+ {
742+ code : 'ERR_ASSERTION' ,
743+ name : 'AssertionError [ERR_ASSERTION]' ,
744+ message : '/a/gim deepStrictEqual /a/im'
745+ } ) ;
746+
747+ {
748+ const re1 = / a / ;
749+ re1 . lastIndex = 3 ;
750+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( re1 , / a / ) ) ;
751+ }
752+
753+ assert . throws ( ( ) => assert . deepStrictEqual ( 4 , '4' ) ,
754+ AssertionError ,
755+ 'deepStrictEqual(4, \'4\')' ) ;
756+
757+ assert . throws ( ( ) => assert . deepStrictEqual ( true , 1 ) ,
758+ AssertionError ,
759+ 'deepStrictEqual(true, 1)' ) ;
760+
761+ assert . throws ( ( ) => assert . deepStrictEqual ( 4 , '5' ) ,
762+ AssertionError ,
763+ 'deepStrictEqual(4, \'5\')' ) ;
764+
765+ // Having the same number of owned properties && the same set of keys.
766+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( { a : 4 } , { a : 4 } ) ) ;
767+ assert . doesNotThrow (
768+ ( ) => assert . deepStrictEqual ( { a : 4 , b : '2' } , { a : 4 , b : '2' } ) ) ;
769+ assert . throws ( ( ) => assert . deepStrictEqual ( [ 4 ] , [ '4' ] ) ,
770+ {
771+ code : 'ERR_ASSERTION' ,
772+ name : 'AssertionError [ERR_ASSERTION]' ,
773+ message : "[ 4 ] deepStrictEqual [ '4' ]"
774+ } ) ;
775+ assert . throws ( ( ) => assert . deepStrictEqual ( { a : 4 } , { a : 4 , b : true } ) ,
776+ {
777+ code : 'ERR_ASSERTION' ,
778+ name : 'AssertionError [ERR_ASSERTION]' ,
779+ message : '{ a: 4 } deepStrictEqual { a: 4, b: true }'
780+ } ) ;
781+ assert . throws ( ( ) => assert . deepStrictEqual ( [ 'a' ] , { 0 : 'a' } ) ,
782+ {
783+ code : 'ERR_ASSERTION' ,
784+ name : 'AssertionError [ERR_ASSERTION]' ,
785+ message : "[ 'a' ] deepStrictEqual { '0': 'a' }"
786+ } ) ;
787+
548788/* eslint-enable */
789+
790+ assert . doesNotThrow (
791+ ( ) => assert . deepStrictEqual ( { a : 4 , b : '1' } , { b : '1' , a : 4 } ) ) ;
792+
793+ assert . throws (
794+ ( ) => assert . deepStrictEqual ( [ 0 , 1 , 2 , 'a' , 'b' ] , [ 0 , 1 , 2 , 'b' , 'a' ] ) ,
795+ AssertionError ) ;
796+
797+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( a1 , a2 ) ) ;
798+
799+ // Prototype check.
800+ function Constructor1 ( first , last ) {
801+ this . first = first ;
802+ this . last = last ;
803+ }
804+
805+ function Constructor2 ( first , last ) {
806+ this . first = first ;
807+ this . last = last ;
808+ }
809+
810+ const obj1 = new Constructor1 ( 'Ryan' , 'Dahl' ) ;
811+ let obj2 = new Constructor2 ( 'Ryan' , 'Dahl' ) ;
812+
813+ assert . throws ( ( ) => assert . deepStrictEqual ( obj1 , obj2 ) , AssertionError ) ;
814+
815+ Constructor2 . prototype = Constructor1 . prototype ;
816+ obj2 = new Constructor2 ( 'Ryan' , 'Dahl' ) ;
817+
818+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( obj1 , obj2 ) ) ;
819+
820+ // primitives
821+ assert . throws ( ( ) => assert . deepStrictEqual ( 4 , '4' ) , AssertionError ) ;
822+ assert . throws ( ( ) => assert . deepStrictEqual ( true , 1 ) , AssertionError ) ;
823+ assert . throws ( ( ) => assert . deepStrictEqual ( Symbol ( ) , Symbol ( ) ) ,
824+ AssertionError ) ;
825+
826+ const s = Symbol ( ) ;
827+ assert . doesNotThrow ( ( ) => assert . deepStrictEqual ( s , s ) ) ;
828+
829+ // Primitives and object.
830+ assert . throws ( ( ) => assert . deepStrictEqual ( null , { } ) , AssertionError ) ;
831+ assert . throws ( ( ) => assert . deepStrictEqual ( undefined , { } ) , AssertionError ) ;
832+ assert . throws ( ( ) => assert . deepStrictEqual ( 'a' , [ 'a' ] ) , AssertionError ) ;
833+ assert . throws ( ( ) => assert . deepStrictEqual ( 'a' , { 0 : 'a' } ) , AssertionError ) ;
834+ assert . throws ( ( ) => assert . deepStrictEqual ( 1 , { } ) , AssertionError ) ;
835+ assert . throws ( ( ) => assert . deepStrictEqual ( true , { } ) , AssertionError ) ;
836+ assert . throws ( ( ) => assert . deepStrictEqual ( Symbol ( ) , { } ) , AssertionError ) ;
837+
838+ // Primitive wrappers and object.
839+ assert . throws ( ( ) => assert . deepStrictEqual ( new String ( 'a' ) , [ 'a' ] ) ,
840+ AssertionError ) ;
841+ assert . throws ( ( ) => assert . deepStrictEqual ( new String ( 'a' ) , { 0 : 'a' } ) ,
842+ AssertionError ) ;
843+ assert . throws ( ( ) => assert . deepStrictEqual ( new Number ( 1 ) , { } ) , AssertionError ) ;
844+ assert . throws ( ( ) => assert . deepStrictEqual ( new Boolean ( true ) , { } ) ,
845+ AssertionError ) ;
0 commit comments