23
23
const {
24
24
ArrayBufferIsView,
25
25
ArrayBufferPrototypeGetByteLength,
26
- ArrayFrom,
27
26
ArrayIsArray,
28
27
ArrayPrototypeIndexOf,
29
28
ArrayPrototypeJoin,
@@ -395,12 +394,11 @@ function partiallyCompareMaps(actual, expected, comparedObjects) {
395
394
const expectedIterator = FunctionPrototypeCall ( SafeMap . prototype [ SymbolIterator ] , expected ) ;
396
395
397
396
for ( const { 0 : key , 1 : expectedValue } of expectedIterator ) {
398
- if ( ! MapPrototypeHas ( actual , key ) ) {
397
+ const actualValue = MapPrototypeGet ( actual , key ) ;
398
+ if ( actualValue === undefined && ! MapPrototypeHas ( actual , key ) ) {
399
399
return false ;
400
400
}
401
401
402
- const actualValue = MapPrototypeGet ( actual , key ) ;
403
-
404
402
if ( ! compareBranch ( actualValue , expectedValue , comparedObjects ) ) {
405
403
return false ;
406
404
}
@@ -481,18 +479,30 @@ function partiallyCompareSets(actual, expected, comparedObjects) {
481
479
482
480
if ( isDeepEqual === undefined ) lazyLoadComparison ( ) ;
483
481
484
- const actualArray = ArrayFrom ( FunctionPrototypeCall ( SafeSet . prototype [ SymbolIterator ] , actual ) ) ;
482
+ // Create a map for faster lookups and counts
483
+ const actualMap = new SafeMap ( ) ;
484
+ const actualIterator = FunctionPrototypeCall ( SafeSet . prototype [ SymbolIterator ] , actual ) ;
485
485
const expectedIterator = FunctionPrototypeCall ( SafeSet . prototype [ SymbolIterator ] , expected ) ;
486
- const usedIndices = new SafeSet ( ) ;
487
486
488
- expectedIteration: for ( const expectedItem of expectedIterator ) {
489
- for ( let actualIdx = 0 ; actualIdx < actualArray . length ; actualIdx ++ ) {
490
- if ( ! usedIndices . has ( actualIdx ) && isDeepStrictEqual ( actualArray [ actualIdx ] , expectedItem ) ) {
491
- usedIndices . add ( actualIdx ) ;
492
- continue expectedIteration;
487
+ for ( const actualItem of actualIterator ) {
488
+ actualMap . set ( actualItem , ( actualMap . get ( actualItem ) || 0 ) + 1 ) ;
489
+ }
490
+
491
+ const actualMapIterator = FunctionPrototypeCall ( SafeMap . prototype [ SymbolIterator ] , actualMap ) ;
492
+
493
+ for ( const expectedItem of expectedIterator ) {
494
+ let foundMatch = false ;
495
+ for ( const { 0 : actualItem , 1 : count } of actualMapIterator ) {
496
+ if ( count > 0 && isDeepStrictEqual ( actualItem , expectedItem ) ) {
497
+ actualMap . set ( actualItem , count - 1 ) ;
498
+ foundMatch = true ;
499
+ break ;
493
500
}
494
501
}
495
- return false ;
502
+
503
+ if ( ! foundMatch ) {
504
+ return false ;
505
+ }
496
506
}
497
507
498
508
return true ;
@@ -514,17 +524,15 @@ function partiallyCompareArrays(actual, expected, comparedObjects) {
514
524
return false ;
515
525
}
516
526
517
- if ( isDeepEqual === undefined ) lazyLoadComparison ( ) ;
527
+ if ( typeof isDeepStrictEqual === ' undefined' ) lazyLoadComparison ( ) ;
518
528
519
529
// Create a map to count occurrences of each element in the expected array
520
530
const expectedCounts = new SafeMap ( ) ;
521
- const safeExpected = new SafeArrayIterator ( expected ) ;
522
531
523
- for ( const expectedItem of safeExpected ) {
524
- // Check if the item is a zero or a -0, as these need to be handled separately
532
+ for ( const expectedItem of new SafeArrayIterator ( expected ) ) {
525
533
if ( expectedItem === 0 ) {
526
534
const zeroKey = getZeroKey ( expectedItem ) ;
527
- expectedCounts . set ( zeroKey , ( expectedCounts . get ( zeroKey ) ?. count || 0 ) + 1 ) ;
535
+ expectedCounts . set ( zeroKey , ( expectedCounts . get ( zeroKey ) || 0 ) + 1 ) ;
528
536
} else {
529
537
let found = false ;
530
538
for ( const { 0 : key , 1 : count } of expectedCounts ) {
@@ -540,10 +548,7 @@ function partiallyCompareArrays(actual, expected, comparedObjects) {
540
548
}
541
549
}
542
550
543
- const safeActual = new SafeArrayIterator ( actual ) ;
544
-
545
- for ( const actualItem of safeActual ) {
546
- // Check if the item is a zero or a -0, as these need to be handled separately
551
+ for ( const actualItem of new SafeArrayIterator ( actual ) ) {
547
552
if ( actualItem === 0 ) {
548
553
const zeroKey = getZeroKey ( actualItem ) ;
549
554
@@ -554,6 +559,7 @@ function partiallyCompareArrays(actual, expected, comparedObjects) {
554
559
} else {
555
560
expectedCounts . set ( zeroKey , count - 1 ) ;
556
561
}
562
+ continue ;
557
563
}
558
564
} else {
559
565
for ( const { 0 : expectedItem , 1 : count } of expectedCounts ) {
0 commit comments