Skip to content

Commit be92bd8

Browse files
committed
The sortedArrayUsingComparator method didn't work correctly. Fixed the root cause and implemented unit tests.
1 parent 32cc070 commit be92bd8

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

Foundation/NSArray.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,13 +393,18 @@ public class NSArray : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NS
393393
}
394394

395395
internal func sortedArrayFromRange(range: NSRange, options: NSSortOptions, usingComparator cmptr: NSComparator) -> [AnyObject] {
396+
// The sort options are not available. We use the Array's sorting algorithm. It is not stable neither concurrent.
397+
guard options.isEmpty else {
398+
NSUnimplemented()
399+
}
400+
396401
let count = self.count
397402
if range.length == 0 || count == 0 {
398403
return []
399404
}
400405

401406
return allObjects.sort { lhs, rhs in
402-
return cmptr(lhs, rhs) == .OrderedSame
407+
return cmptr(lhs, rhs) == .OrderedAscending
403408
}
404409
}
405410

TestFoundation/TestNSArray.swift

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class TestNSArray : XCTestCase {
3131
("test_binarySearch", test_binarySearch),
3232
("test_replaceObjectsInRange_withObjectsFromArray", test_replaceObjectsInRange_withObjectsFromArray),
3333
("test_replaceObjectsInRange_withObjectsFromArray_range", test_replaceObjectsInRange_withObjectsFromArray_range),
34+
("test_sortedArrayUsingComparator", test_sortedArrayUsingComparator),
35+
("test_sortedArrayWithOptionsUsingComparator", test_sortedArrayWithOptionsUsingComparator)
3436
]
3537
}
3638

@@ -198,4 +200,47 @@ class TestNSArray : XCTestCase {
198200
XCTAssertEqual(array1[2] as? NSString, "baz2".bridge(), "Expected baz2 but was \(array1[2])")
199201
XCTAssertEqual(array1[3] as? NSString, "baz1".bridge(), "Expected baz1 but was \(array1[3])")
200202
}
203+
204+
func test_sortedArrayUsingComparator() {
205+
// sort with localized caseInsensitive compare
206+
let input = ["this", "is", "a", "test", "of", "sort", "with", "strings"]
207+
let expectedResult: Array<String> = input.sort()
208+
let result = input.bridge().sortedArrayUsingComparator { left, right -> NSComparisonResult in
209+
let l = left as! NSString
210+
let r = right as! NSString
211+
return l.localizedCaseInsensitiveCompare(r.bridge())
212+
} as! [NSString]
213+
XCTAssertEqual(result.map { $0.bridge()} , expectedResult)
214+
215+
// sort empty array
216+
let emptyArray = NSArray().sortedArrayUsingComparator { _,_ in .OrderedSame }
217+
XCTAssertTrue(emptyArray.isEmpty)
218+
219+
// sort numbers
220+
let inputNumbers = [0, 10, 25, 100, 21, 22]
221+
let expectedNumbers = inputNumbers.sort()
222+
let resultNumbers = inputNumbers.bridge().sortedArrayUsingComparator { left, right -> NSComparisonResult in
223+
let l = (left as! NSNumber).integerValue
224+
let r = (right as! NSNumber).integerValue
225+
return l < r ? .OrderedAscending : (l > r ? .OrderedSame : .OrderedDescending)
226+
} as! [NSNumber]
227+
XCTAssertEqual(resultNumbers.map { $0.integerValue}, expectedNumbers)
228+
}
229+
230+
func test_sortedArrayWithOptionsUsingComparator() {
231+
// check that sortedArrayWithOptions:comparator: works in the way sortedArrayUsingComparator does
232+
let input = ["this", "is", "a", "test", "of", "sort", "with", "strings"].bridge()
233+
let comparator: (AnyObject, AnyObject) -> NSComparisonResult = { left, right -> NSComparisonResult in
234+
let l = left as! NSString
235+
let r = right as! NSString
236+
return l.localizedCaseInsensitiveCompare(r.bridge())
237+
}
238+
let result1 = input.sortedArrayUsingComparator(comparator) as! [NSString]
239+
let result2 = input.sortedArrayWithOptions([], usingComparator: comparator) as! [NSString]
240+
XCTAssertEqual(result1, result2)
241+
242+
// sort empty array
243+
let emptyArray = NSArray().sortedArrayWithOptions([]) { _,_ in .OrderedSame }
244+
XCTAssertTrue(emptyArray.isEmpty)
245+
}
201246
}

0 commit comments

Comments
 (0)