@@ -56,6 +56,7 @@ const {
5656 StringPrototypeIndexOf,
5757 StringPrototypeSlice,
5858 StringPrototypeSplit,
59+ Symbol,
5960 SymbolIterator,
6061 TypedArrayPrototypeGetLength,
6162 Uint8Array,
@@ -497,6 +498,17 @@ function partiallyCompareSets(actual, expected, comparedObjects) {
497498 return true ;
498499}
499500
501+ const minusZeroSymbol = Symbol ( '-0' ) ;
502+ const zeroSymbol = Symbol ( '0' ) ;
503+
504+ // Helper function to get a unique key for 0, -0 to avoid collisions
505+ function getZeroKey ( item ) {
506+ if ( item === 0 ) {
507+ return ObjectIs ( item , - 0 ) ? minusZeroSymbol : zeroSymbol ;
508+ }
509+ return item ;
510+ }
511+
500512function partiallyCompareArrays ( actual , expected , comparedObjects ) {
501513 if ( expected . length > actual . length ) {
502514 return false ;
@@ -506,39 +518,58 @@ function partiallyCompareArrays(actual, expected, comparedObjects) {
506518
507519 // Create a map to count occurrences of each element in the expected array
508520 const expectedCounts = new SafeMap ( ) ;
509- for ( const expectedItem of expected ) {
510- let found = false ;
511- for ( const { 0 : key , 1 : count } of expectedCounts ) {
512- if ( isDeepStrictEqual ( key , expectedItem ) ) {
513- expectedCounts . set ( key , count + 1 ) ;
514- found = true ;
515- break ;
521+ const safeExpected = new SafeArrayIterator ( expected ) ;
522+
523+ for ( const expectedItem of safeExpected ) {
524+ // Check if the item is a zero or a -0, as these need to be handled separately
525+ if ( expectedItem === 0 ) {
526+ const zeroKey = getZeroKey ( expectedItem ) ;
527+ expectedCounts . set ( zeroKey , ( expectedCounts . get ( zeroKey ) ?. count || 0 ) + 1 ) ;
528+ } else {
529+ let found = false ;
530+ for ( const { 0 : key , 1 : count } of expectedCounts ) {
531+ if ( isDeepStrictEqual ( key , expectedItem ) ) {
532+ expectedCounts . set ( key , count + 1 ) ;
533+ found = true ;
534+ break ;
535+ }
536+ }
537+ if ( ! found ) {
538+ expectedCounts . set ( expectedItem , 1 ) ;
516539 }
517- }
518- if ( ! found ) {
519- expectedCounts . set ( expectedItem , 1 ) ;
520540 }
521541 }
522542
523543 const safeActual = new SafeArrayIterator ( actual ) ;
524544
525- // Create a map to count occurrences of relevant elements in the actual array
526545 for ( const actualItem of safeActual ) {
527- for ( const { 0 : key , 1 : count } of expectedCounts ) {
528- if ( isDeepStrictEqual ( key , actualItem ) ) {
546+ // Check if the item is a zero or a -0, as these need to be handled separately
547+ if ( actualItem === 0 ) {
548+ const zeroKey = getZeroKey ( actualItem ) ;
549+
550+ if ( expectedCounts . has ( zeroKey ) ) {
551+ const count = expectedCounts . get ( zeroKey ) ;
529552 if ( count === 1 ) {
530- expectedCounts . delete ( key ) ;
553+ expectedCounts . delete ( zeroKey ) ;
531554 } else {
532- expectedCounts . set ( key , count - 1 ) ;
555+ expectedCounts . set ( zeroKey , count - 1 ) ;
556+ }
557+ }
558+ } else {
559+ for ( const { 0 : expectedItem , 1 : count } of expectedCounts ) {
560+ if ( isDeepStrictEqual ( expectedItem , actualItem ) ) {
561+ if ( count === 1 ) {
562+ expectedCounts . delete ( expectedItem ) ;
563+ } else {
564+ expectedCounts . set ( expectedItem , count - 1 ) ;
565+ }
566+ break ;
533567 }
534- break ;
535568 }
536569 }
537570 }
538571
539- const { size } = expectedCounts ;
540- expectedCounts . clear ( ) ;
541- return size === 0 ;
572+ return expectedCounts . size === 0 ;
542573}
543574
544575/**
0 commit comments