From db6608571aab1a6b7a3f7a342d7746288a32ef78 Mon Sep 17 00:00:00 2001 From: Ilya Kulakov Date: Tue, 4 Jan 2011 16:53:56 +0600 Subject: [PATCH] Refs #1071. indexOfObject:inSortedRange:options:usingComparator is incorrectly implemented. Add more tests to cover more features of the indexOfObject:inSortedRange:options:usingComparator method --- Foundation/CPArray/CPArray.j | 8 ++--- Tests/Foundation/CPArrayTest.j | 66 ++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 7 deletions(-) diff --git a/Foundation/CPArray/CPArray.j b/Foundation/CPArray/CPArray.j index 8daaf4e2a..11abdfeeb 100755 --- a/Foundation/CPArray/CPArray.j +++ b/Foundation/CPArray/CPArray.j @@ -440,13 +440,13 @@ CPBinarySearchingInsertionIndex = 1 << 10; else { if (options & CPBinarySearchingFirstEqual) - while (middle++ < count - 1 && - aComparator(anObject, [self objectAtIndex:middle]) === CPOrderedSame); + while (middle > first && aComparator(anObject, [self objectAtIndex:middle - 1]) === CPOrderedSame) + --middle; else if (options & CPBinarySearchingLastEqual) { - while (middle-- > 0 && - aComparator(anObject, [self objectAtIndex:middle]) === CPOrderedSame); + while (middle < last && aComparator(anObject, [self objectAtIndex:middle + 1]) === CPOrderedSame) + ++middle; if (options & CPBinarySearchingInsertionIndex) ++middle; diff --git a/Tests/Foundation/CPArrayTest.j b/Tests/Foundation/CPArrayTest.j index 91c1f2522..abac66c85 100644 --- a/Tests/Foundation/CPArrayTest.j +++ b/Tests/Foundation/CPArrayTest.j @@ -142,10 +142,70 @@ - (void)testIndexOfObject_inSortedRange_options_usingComparator_ { - var array = [0, 1, 2, 3, 4, 7]; + var array = [0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 7]; + var numComparator = function(a, b){ return a - b; }; - [self assert:[array indexOfObject:3 inSortedRange:nil options:0 usingComparator:function(a, b){ return a - b; }] equals:3]; - [self assert:[[array arrayByReversingArray] indexOfObject:3 inSortedRange:nil options:0 usingComparator:function(a, b){ return a - b; }] equals:2]; + var index = [array indexOfObject:1 + inSortedRange:nil + options:0 + usingComparator:numComparator]; + [self assertTrue:[[1, 2, 3] containsObject:index]]; + [self assert:[array indexOfObject:1 + inSortedRange:nil + options:CPBinarySearchingFirstEqual + usingComparator:numComparator] + equals:1]; + [self assert:[array indexOfObject:1 + inSortedRange:nil + options:CPBinarySearchingLastEqual + usingComparator:numComparator] + equals:3]; + index = [array indexOfObject:1 + inSortedRange:nil + options:CPBinarySearchingInsertionIndex + usingComparator:numComparator]; + [self assertTrue:[[1, 2, 3, 4] containsObject:index]]; + [self assert:[array indexOfObject:1 + inSortedRange:nil + options:CPBinarySearchingFirstEqual | CPBinarySearchingInsertionIndex + usingComparator:numComparator] + equals:1]; + [self assert:[array indexOfObject:1 + inSortedRange:nil + options:CPBinarySearchingLastEqual | CPBinarySearchingInsertionIndex + usingComparator:numComparator] + equals:4]; + + index = [array indexOfObject:2 + inSortedRange:CPMakeRange(2, 5) // [ -, -, 1, 1, 2, 2, 3, -, -, -, -] + options:0 + usingComparator:numComparator]; + [self assertTrue:[[4, 5] containsObject:index]]; + [self assert:[array indexOfObject:2 + inSortedRange:CPMakeRange(2, 5) // [ -, -, 1, 1, 2, 2, 3, -, -, -, -] + options:CPBinarySearchingFirstEqual + usingComparator:numComparator] + equals:4]; + [self assert:[array indexOfObject:2 + inSortedRange:CPMakeRange(2, 5) // [ -, -, 1, 1, 2, 2, 3, -, -, -, -] + options:CPBinarySearchingLastEqual + usingComparator:numComparator] + equals:5]; + index = [array indexOfObject:2 + inSortedRange:CPMakeRange(2, 5) // [ -, -, 1, 1, 2, 2, 3, -, -, -, -] + options:CPBinarySearchingInsertionIndex + usingComparator:numComparator]; + [self assertTrue:[[4, 5, 6] containsObject:index]]; + [self assert:[array indexOfObject:2 + inSortedRange:CPMakeRange(2, 5) // [ -, -, 1, 1, 2, 2, 3, -, -, -, -] + options:CPBinarySearchingFirstEqual | CPBinarySearchingInsertionIndex + usingComparator:numComparator] + equals:4]; + [self assert:[array indexOfObject:2 + inSortedRange:CPMakeRange(2, 5) // [ -, -, 1, 1, 2, 2, 3, -, -, -, -] + options:CPBinarySearchingLastEqual | CPBinarySearchingInsertionIndex + usingComparator:numComparator] + equals:6]; } - (void)testIndexOutOfBounds