Merge pull request #159 from hpux735/master

Adding support for ARMv7 on linux
diff --git a/CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h b/CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h
index 592cc11..bc1e9e9 100644
--- a/CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h
+++ b/CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h
@@ -177,6 +177,10 @@
                            const unsigned char *SystemID);
 };
 
+struct _NSRunLoop {
+    _Nonnull CFTypeRef (*_Nonnull _new)(CFRunLoopRef rl);
+};
+
 struct _CFSwiftBridge {
     struct _NSObjectBridge NSObject;
     struct _NSArrayBridge NSArray;
@@ -188,6 +192,7 @@
     struct _NSStringBridge NSString;
     struct _NSMutableStringBridge NSMutableString;
     struct _NSXMLParserBridge NSXMLParser;
+    struct _NSRunLoop NSRunLoop;
 };
 
 __attribute__((__visibility__("hidden"))) extern struct _CFSwiftBridge __CFSwiftBridge;
@@ -264,6 +269,8 @@
 
 CFHashCode CFStringHashNSString(CFStringRef str);
 
+extern CFTypeRef _CFRunLoopGet2(CFRunLoopRef rl);
+
 extern CFIndex __CFStringEncodeByteStream(CFStringRef string, CFIndex rangeLoc, CFIndex rangeLen, Boolean generatingExternalFile, CFStringEncoding encoding, uint8_t lossByte,  UInt8 * _Nullable buffer, CFIndex max, CFIndex * _Nullable usedBufLen);
 
 typedef	unsigned char __cf_uuid[16];
diff --git a/CoreFoundation/RunLoop.subproj/CFRunLoop.c b/CoreFoundation/RunLoop.subproj/CFRunLoop.c
index 7a68fe9..a224286 100644
--- a/CoreFoundation/RunLoop.subproj/CFRunLoop.c
+++ b/CoreFoundation/RunLoop.subproj/CFRunLoop.c
@@ -1526,7 +1526,12 @@
     }
     if (rl && CFRunLoopGetMain() != rl) { // protect against cooperative threads
         if (NULL != rl->_counterpart) {
+#if DEPLOYMENT_RUNTIME_SWIFT
+            extern void swift_release(void *);
+            swift_release((void *)rl->_counterpart);
+#else
             CFRelease(rl->_counterpart);
+#endif
 	    rl->_counterpart = NULL;
         }
 	// purge all sources before deallocation
@@ -1549,6 +1554,12 @@
 CF_EXPORT CFTypeRef _CFRunLoopGet2(CFRunLoopRef rl) {
     CFTypeRef ret = NULL;
     __CFLock(&loopsLock);
+#if DEPLOYMENT_RUNTIME_SWIFT
+    if (rl->_counterpart == NULL) {
+        CFTypeRef ns = __CFSwiftBridge.NSRunLoop._new(rl); // returns retained so we will claim ownership of that return value by just assigning (the release is balanced in the destruction of the CFRunLoop
+        rl->_counterpart = ns;
+    }
+#endif
     ret = rl->_counterpart;
     __CFUnlock(&loopsLock);
     return ret;
diff --git a/Foundation/NSArray.swift b/Foundation/NSArray.swift
index e1c178a..4ff21ee 100644
--- a/Foundation/NSArray.swift
+++ b/Foundation/NSArray.swift
@@ -393,13 +393,18 @@
     }
 
     internal func sortedArrayFromRange(range: NSRange, options: NSSortOptions, usingComparator cmptr: NSComparator) -> [AnyObject] {
+        // The sort options are not available. We use the Array's sorting algorithm. It is not stable neither concurrent.
+        guard options.isEmpty else {
+            NSUnimplemented()
+        }
+
         let count = self.count
         if range.length == 0 || count == 0 {
             return []
         }
 
         return allObjects.sort { lhs, rhs in
-            return cmptr(lhs, rhs) == .OrderedSame
+            return cmptr(lhs, rhs) == .OrderedAscending
         }
     }
     
@@ -412,14 +417,36 @@
     }
 
     public func indexOfObject(obj: AnyObject, inSortedRange r: NSRange, options opts: NSBinarySearchingOptions, usingComparator cmp: NSComparator) -> Int {
-        guard (r.location + r.length) <= count else {
-            NSInvalidArgument("range \(r) extends beyond bounds [0 .. \(count - 1)]")
+        let lastIndex = r.location + r.length - 1
+        
+        // argument validation
+        guard lastIndex < count else {
+            let bounds = count == 0 ? "for empty array" : "[0 .. \(count - 1)]"
+            NSInvalidArgument("range \(r) extends beyond bounds \(bounds)")
         }
         
         if opts.contains(.FirstEqual) && opts.contains(.LastEqual) {
             NSInvalidArgument("both NSBinarySearching.FirstEqual and NSBinarySearching.LastEqual options cannot be specified")
         }
         
+        let searchForInsertionIndex = opts.contains(.InsertionIndex)
+        
+        // fringe cases
+        if r.length == 0 {
+            return  searchForInsertionIndex ? r.location : NSNotFound
+        }
+        
+        let leastObj = objectAtIndex(r.location)
+        if cmp(obj, leastObj) == .OrderedAscending {
+            return searchForInsertionIndex ? r.location : NSNotFound
+        }
+        
+        let greatestObj = objectAtIndex(lastIndex)
+        if cmp(obj, greatestObj) == .OrderedDescending {
+            return searchForInsertionIndex ? lastIndex + 1 : NSNotFound
+        }
+        
+        // common processing
         let firstEqual = opts.contains(.FirstEqual)
         let lastEqual = opts.contains(.LastEqual)
         let anyEqual = !(firstEqual || lastEqual)
@@ -427,7 +454,7 @@
         var result = NSNotFound
         var indexOfLeastGreaterThanObj = NSNotFound
         var start = r.location
-        var end = r.location + r.length - 1
+        var end = lastIndex
         
         loop: while start <= end {
             let middle = start + (end - start) / 2
@@ -459,7 +486,7 @@
             }
         }
         
-        guard opts.contains(.InsertionIndex) && lastEqual else {
+        guard searchForInsertionIndex && lastEqual else {
             return result
         }
         
@@ -467,10 +494,6 @@
             return result + 1
         }
         
-        guard indexOfLeastGreaterThanObj != NSNotFound else {
-            return count
-        }
-        
         return indexOfLeastGreaterThanObj
     }
     
diff --git a/Foundation/NSDecimalNumber.swift b/Foundation/NSDecimalNumber.swift
index c597788..927be14 100644
--- a/Foundation/NSDecimalNumber.swift
+++ b/Foundation/NSDecimalNumber.swift
@@ -84,7 +84,7 @@
     public func decimalNumberByRoundingAccordingToBehavior(behavior: NSDecimalNumberBehaviors?) -> NSDecimalNumber { NSUnimplemented() }
     // Round to the scale of the behavior.
     
-    public func compare(decimalNumber: NSNumber) -> NSComparisonResult { NSUnimplemented() }
+    public override func compare(decimalNumber: NSNumber) -> NSComparisonResult { NSUnimplemented() }
     // compare two NSDecimalNumbers
     
     public class func setDefaultBehavior(behavior: NSDecimalNumberBehaviors) { NSUnimplemented() }
diff --git a/Foundation/NSFileManager.swift b/Foundation/NSFileManager.swift
index de07ae9..e1cb69b 100644
--- a/Foundation/NSFileManager.swift
+++ b/Foundation/NSFileManager.swift
@@ -191,20 +191,115 @@
         }
     }
     
-    /* contentsOfDirectoryAtPath:error: returns an NSArray of NSStrings representing the filenames of the items in the directory. If this method returns 'nil', an NSError will be returned by reference in the 'error' parameter. If the directory contains no items, this method will return the empty array.
+    /**
+     Performs a shallow search of the specified directory and returns the paths of any contained items.
      
-        This method replaces directoryContentsAtPath:
+     This method performs a shallow search of the directory and therefore does not traverse symbolic links or return the contents of any subdirectories. This method also does not return URLs for the current directory (“.”), parent directory (“..”) but it does return other hidden files (files that begin with a period character).
+     
+     The order of the files in the returned array is undefined.
+     
+     - Parameter path: The path to the directory whose contents you want to enumerate.
+     
+     - Throws: `NSError` if the directory does not exist, this error is thrown with the associated error code.
+     
+     - Returns: An array of String each of which identifies a file, directory, or symbolic link contained in `path`. The order of the files returned is undefined.
      */
     public func contentsOfDirectoryAtPath(path: String) throws -> [String] {
-        NSUnimplemented()
+        var contents : [String] = [String]()
+        
+        let dir = opendir(path)
+        
+        if dir == nil {
+            throw NSError(domain: NSCocoaErrorDomain, code: NSCocoaError.FileReadNoSuchFileError.rawValue, userInfo: [NSFilePathErrorKey: path])
+        }
+        
+        defer {
+            closedir(dir)
+        }
+        
+        var entry: UnsafeMutablePointer<dirent> = readdir(dir)
+        
+        while entry != nil {
+            if let entryName = withUnsafePointer(&entry.memory.d_name, { (ptr) -> String? in
+                let int8Ptr = unsafeBitCast(ptr, UnsafePointer<Int8>.self)
+                return String.fromCString(int8Ptr)
+            }) {
+                // TODO: `entryName` should be limited in length to `entry.memory.d_namlen`.
+                if entryName != "." && entryName != ".." {
+                    contents.append(entryName)
+                }
+            }
+            
+            entry = readdir(dir)
+        }
+        
+        return contents
     }
     
-    /* subpathsOfDirectoryAtPath:error: returns an NSArray of NSStrings representing the filenames of the items in the specified directory and all its subdirectories recursively. If this method returns 'nil', an NSError will be returned by reference in the 'error' parameter. If the directory contains no items, this method will return the empty array.
-     
-        This method replaces subpathsAtPath:
-     */
+    /**
+    Performs a deep enumeration of the specified directory and returns the paths of all of the contained subdirectories.
+    
+    This method recurses the specified directory and its subdirectories. The method skips the “.” and “..” directories at each level of the recursion.
+    
+    Because this method recurses the directory’s contents, you might not want to use it in performance-critical code. Instead, consider using the enumeratorAtURL:includingPropertiesForKeys:options:errorHandler: or enumeratorAtPath: method to enumerate the directory contents yourself. Doing so gives you more control over the retrieval of items and more opportunities to abort the enumeration or perform other tasks at the same time.
+    
+    - Parameter path: The path of the directory to list.
+    
+    - Throws: `NSError` if the directory does not exist, this error is thrown with the associated error code.
+    
+    - Returns: An array of NSString objects, each of which contains the path of an item in the directory specified by path. If path is a symbolic link, this method traverses the link. This method returns nil if it cannot retrieve the device of the linked-to file.
+    */
     public func subpathsOfDirectoryAtPath(path: String) throws -> [String] {
-        NSUnimplemented()
+        var contents : [String] = [String]()
+        
+        let dir = opendir(path)
+        
+        if dir == nil {
+            throw NSError(domain: NSCocoaErrorDomain, code: NSCocoaError.FileReadNoSuchFileError.rawValue, userInfo: [NSFilePathErrorKey: path])
+        }
+        
+        defer {
+            closedir(dir)
+        }
+        
+        var entry = readdir(dir)
+        
+        while entry != nil {
+            if let entryName = withUnsafePointer(&entry.memory.d_name, { (ptr) -> String? in
+                let int8Ptr = unsafeBitCast(ptr, UnsafePointer<Int8>.self)
+                return String.fromCString(int8Ptr)
+            }) {
+                // TODO: `entryName` should be limited in length to `entry.memory.d_namlen`.
+                if entryName != "." && entryName != ".." {
+                    contents.append(entryName)
+                    
+                    if let entryType = withUnsafePointer(&entry.memory.d_type, { (ptr) -> Int32? in
+                        let int32Ptr = unsafeBitCast(ptr, UnsafePointer<UInt8>.self)
+                        return Int32(int32Ptr.memory)
+                    }) {
+                        #if os(OSX) || os(iOS)
+                            if entryType == DT_DIR {
+                                let subPath: String = path + "/" + entryName
+                                
+                                let entries =  try subpathsOfDirectoryAtPath(subPath)
+                                contents.appendContentsOf(entries.map({file in "\(entryName)/\(file)"}))
+                            }
+                        #elseif os(Linux)
+                            if Int(entryType) == DT_DIR {
+                                let subPath: String = path + "/" + entryName
+                                
+                                let entries =  try subpathsOfDirectoryAtPath(subPath)
+                                contents.appendContentsOf(entries.map({file in "\(entryName)/\(file)"}))
+                            }
+                        #endif
+                    }
+                }
+            }
+            
+            entry = readdir(dir)
+        }
+        
+        return contents
     }
     
     /* attributesOfItemAtPath:error: returns an NSDictionary of key/value pairs containing the attributes of the item (file, directory, symlink, etc.) at the path in question. If this method returns 'nil', an NSError will be returned by reference in the 'error' parameter. This method does not traverse a terminal symlink.
diff --git a/Foundation/NSGeometry.swift b/Foundation/NSGeometry.swift
index f5ff78a..5d7ef89 100644
--- a/Foundation/NSGeometry.swift
+++ b/Foundation/NSGeometry.swift
@@ -485,7 +485,50 @@
     return result
 }
 
-public func NSDivideRect(inRect: NSRect, _ slice: UnsafeMutablePointer<NSRect>, _ rem: UnsafeMutablePointer<NSRect>, _ amount: CGFloat, _ edge: NSRectEdge) { NSUnimplemented() }
+public func NSDivideRect(inRect: NSRect, _ slice: UnsafeMutablePointer<NSRect>, _ rem: UnsafeMutablePointer<NSRect>, _ amount: CGFloat, _ edge: NSRectEdge) {
+    if NSIsEmptyRect(inRect) {
+        slice.memory = NSZeroRect
+        rem.memory = NSZeroRect
+        return
+    }
+
+    let width = NSWidth(inRect)
+    let height = NSHeight(inRect)
+
+    switch (edge, amount) {
+    case (.MinX, let amount) where amount > width:
+        slice.memory = inRect
+        rem.memory = NSMakeRect(NSMaxX(inRect), NSMinY(inRect), CGFloat(0.0), height)
+
+    case (.MinX, _):
+        slice.memory = NSMakeRect(NSMinX(inRect), NSMinY(inRect), amount, height)
+        rem.memory = NSMakeRect(NSMaxX(slice.memory), NSMinY(inRect), NSMaxX(inRect) - NSMaxX(slice.memory), height)
+
+    case (.MinY, let amount) where amount > height:
+        slice.memory = inRect
+        rem.memory = NSMakeRect(NSMinX(inRect), NSMaxY(inRect), width, CGFloat(0.0))
+
+    case (.MinY, _):
+        slice.memory = NSMakeRect(NSMinX(inRect), NSMinY(inRect), width, amount)
+        rem.memory = NSMakeRect(NSMinX(inRect), NSMaxY(slice.memory), width, NSMaxY(inRect) - NSMaxY(slice.memory))
+
+    case (.MaxX, let amount) where amount > width:
+        slice.memory = inRect
+        rem.memory = NSMakeRect(NSMinX(inRect), NSMinY(inRect), CGFloat(0.0), height)
+
+    case (.MaxX, _):
+        slice.memory = NSMakeRect(NSMaxX(inRect) - amount, NSMinY(inRect), amount, height)
+        rem.memory = NSMakeRect(NSMinX(inRect), NSMinY(inRect), NSMinX(slice.memory) - NSMinX(inRect), height)
+
+    case (.MaxY, let amount) where amount > height:
+        slice.memory = inRect
+        rem.memory = NSMakeRect(NSMinX(inRect), NSMinY(inRect), width, CGFloat(0.0))
+
+    case (.MaxY, _):
+        slice.memory = NSMakeRect(NSMinX(inRect), NSMaxY(inRect) - amount, width, amount)
+        rem.memory = NSMakeRect(NSMinX(inRect), NSMinY(inRect), width, NSMinY(slice.memory) - NSMinY(inRect))
+    }
+}
 
 public func NSPointInRect(aPoint: NSPoint, _ aRect: NSRect) -> Bool {
     return NSMouseInRect(aPoint, aRect, true)
diff --git a/Foundation/NSHost.swift b/Foundation/NSHost.swift
index f35574d..c29d82d 100644
--- a/Foundation/NSHost.swift
+++ b/Foundation/NSHost.swift
@@ -84,9 +84,11 @@
             if r != 0 {
                 return
             }
-            for var res: UnsafeMutablePointer<addrinfo> = res0; res != nil; res = res.memory.ai_next {
+            var res: UnsafeMutablePointer<addrinfo> = res0
+            while res != nil {
                 let family = res.memory.ai_family
                 if family != AF_INET && family != AF_INET6 {
+                    res = res.memory.ai_next
                     continue
                 }
                 let sa_len: socklen_t = socklen_t((family == AF_INET6) ? sizeof(sockaddr_in6) : sizeof(sockaddr_in))
@@ -101,6 +103,7 @@
                 lookupInfo(&_addresses, NI_NUMERICHOST)
                 lookupInfo(&_names, NI_NAMEREQD)
                 lookupInfo(&_names, NI_NOFQDN|NI_NAMEREQD)
+                res = res.memory.ai_next
             }
             
             freeaddrinfo(res0)
diff --git a/Foundation/NSIndexSet.swift b/Foundation/NSIndexSet.swift
index f9add53..38eba65 100644
--- a/Foundation/NSIndexSet.swift
+++ b/Foundation/NSIndexSet.swift
@@ -556,7 +556,7 @@
                 // Nothing to add
                 return
             } else if range.location >= curRange.location && range.location <= curEnd && addEnd > curEnd {
-                _replaceRangeAtIndex(rangeIndex, withRange: NSMakeRange(addEnd - curRange.location, curRange.location))
+                _replaceRangeAtIndex(rangeIndex, withRange: NSMakeRange(curRange.location, addEnd - curRange.location))
                 replacedRangeIndex = rangeIndex
                 // Proceed to merging
                 break
diff --git a/Foundation/NSNumber.swift b/Foundation/NSNumber.swift
index ccf5037..8898cf1 100644
--- a/Foundation/NSNumber.swift
+++ b/Foundation/NSNumber.swift
@@ -381,6 +381,10 @@
     public required convenience init(booleanLiteral value: Bool) {
         self.init(bool: value)
     }
+
+    public func compare(otherNumber: NSNumber) -> NSComparisonResult {
+        return ._fromCF(CFNumberCompare(_cfObject, otherNumber._cfObject, nil))
+    }
     
     override internal var _cfTypeID: CFTypeID {
         return CFNumberGetTypeID()
diff --git a/Foundation/NSObjCRuntime.swift b/Foundation/NSObjCRuntime.swift
index 51e0605..4cb3a39 100644
--- a/Foundation/NSObjCRuntime.swift
+++ b/Foundation/NSObjCRuntime.swift
@@ -80,7 +80,7 @@
     fatalError("\(fn) is not yet implemented")
 }
 
-@noreturn func NSInvalidArgument(message: String, method: String = __FUNCTION__) {
+@noreturn internal func NSInvalidArgument(message: String, method: String = __FUNCTION__) {
     fatalError("\(method): \(message)")
 }
 
diff --git a/Foundation/NSRunLoop.swift b/Foundation/NSRunLoop.swift
index 54de1f8..98c12e1 100644
--- a/Foundation/NSRunLoop.swift
+++ b/Foundation/NSRunLoop.swift
@@ -12,22 +12,24 @@
 public let NSDefaultRunLoopMode: String = kCFRunLoopDefaultMode._swiftObject
 public let NSRunLoopCommonModes: String = kCFRunLoopCommonModes._swiftObject
 
+internal func _NSRunLoopNew(cf: CFRunLoopRef) -> Unmanaged<AnyObject> {
+    let rl = Unmanaged<NSRunLoop>.passRetained(NSRunLoop(cfObject: cf))
+    return unsafeBitCast(rl, Unmanaged<AnyObject>.self) // this retain is balanced on the other side of the CF fence
+}
+
 public class NSRunLoop : NSObject {
     internal var _cfRunLoop : CFRunLoopRef!
-    internal static var _mainRunLoop : NSRunLoop = {
-        return NSRunLoop(cfObject: CFRunLoopGetMain())
-    }()
     
     internal init(cfObject : CFRunLoopRef) {
         _cfRunLoop = cfObject
     }
     
     public class func currentRunLoop() -> NSRunLoop {
-        return NSRunLoop(cfObject: CFRunLoopGetCurrent())
+        return _CFRunLoopGet2(CFRunLoopGetCurrent()) as! NSRunLoop
     }
     
     public class func mainRunLoop() -> NSRunLoop {
-        return _mainRunLoop
+        return _CFRunLoopGet2(CFRunLoopGetMain()) as! NSRunLoop
     }
     
     public var currentMode: String? {
diff --git a/Foundation/NSScanner.swift b/Foundation/NSScanner.swift
index c115772..16ea935 100644
--- a/Foundation/NSScanner.swift
+++ b/Foundation/NSScanner.swift
@@ -182,7 +182,7 @@
     
     var location: Int {
         get {
-            return _stringLoc
+            return _stringLoc + bufferLoc - 1
         }
         mutating set {
             if newValue < _stringLoc || newValue >= _stringLoc + bufferLen {
diff --git a/Foundation/NSSwiftRuntime.swift b/Foundation/NSSwiftRuntime.swift
index ac30289..ea3bf79 100644
--- a/Foundation/NSSwiftRuntime.swift
+++ b/Foundation/NSSwiftRuntime.swift
@@ -199,6 +199,8 @@
     __CFSwiftBridge.NSXMLParser.comment = _NSXMLParserComment
     __CFSwiftBridge.NSXMLParser.externalSubset = _NSXMLParserExternalSubset
     
+    __CFSwiftBridge.NSRunLoop._new = _NSRunLoopNew
+    
     __CFDefaultEightBitStringEncoding = UInt32(kCFStringEncodingUTF8)
 }
 
@@ -255,6 +257,16 @@
         return str._nsObjectRepresentation()
     } else if let obj = value as? NSObject {
         return obj
+    } else if let obj = value as? Int {
+        return obj._bridgeToObject()
+    } else if let obj = value as? UInt {
+        return obj._bridgeToObject()
+    } else if let obj = value as? Float {
+        return obj._bridgeToObject()
+    } else if let obj = value as? Double {
+        return obj._bridgeToObject()
+    } else if let obj = value as? Bool {
+        return obj._bridgeToObject()
     }
     fatalError("Unable to convert value of type \(value.dynamicType)")
 }
diff --git a/Foundation/NSXMLParser.swift b/Foundation/NSXMLParser.swift
index afd50a0..d27b350 100644
--- a/Foundation/NSXMLParser.swift
+++ b/Foundation/NSXMLParser.swift
@@ -247,7 +247,7 @@
     var nsDict = [String:String]()
     var attrDict = [String:String]()
     if nb_attributes + nb_namespaces > 0 {
-        for var idx = 0; idx < Int(nb_namespaces) * 2; idx += 2 {
+        for idx in 0.stride(to: Int(nb_namespaces) * 2, by: 2) {
             var namespaceNameString: String?
             var asAttrNamespaceNameString: String?
             if namespaces[idx] != nil {
@@ -277,7 +277,7 @@
         parser._pushNamespaces(nsDict)
     }
     
-    for var idx = 0; idx < Int(nb_attributes) * 5; idx += 5 {
+    for idx in 0.stride(to: Int(nb_attributes) * 5, by: 5) {
         if attributes[idx] == nil {
             continue
         }
diff --git a/TestFoundation/TestNSArray.swift b/TestFoundation/TestNSArray.swift
index 45b2684..c414ae3 100644
--- a/TestFoundation/TestNSArray.swift
+++ b/TestFoundation/TestNSArray.swift
@@ -29,8 +29,13 @@
             ("test_getObjects", test_getObjects),
             ("test_objectAtIndex", test_objectAtIndex),
             ("test_binarySearch", test_binarySearch),
+            ("test_binarySearchFringeCases", test_binarySearchFringeCases),
             ("test_replaceObjectsInRange_withObjectsFromArray", test_replaceObjectsInRange_withObjectsFromArray),
             ("test_replaceObjectsInRange_withObjectsFromArray_range", test_replaceObjectsInRange_withObjectsFromArray_range),
+            ("test_sortedArrayUsingComparator", test_sortedArrayUsingComparator),
+            ("test_sortedArrayWithOptionsUsingComparator", test_sortedArrayWithOptionsUsingComparator),
+            ("test_arrayReplacement", test_arrayReplacement),
+            ("test_arrayReplaceObjectsInRangeFromRange", test_arrayReplaceObjectsInRangeFromRange),
         ]
     }
     
@@ -140,8 +145,63 @@
         let indexOfLeastGreaterObjectThanFive = objectIndexInArray(array, value: 5, startingFrom: 0, length: 10, options: [.InsertionIndex, .LastEqual])
         XCTAssertTrue(indexOfLeastGreaterObjectThanFive == 7, "If both .InsertionIndex and .LastEqual are specified NSArray returns the index of the least greater object...")
         
-        let endOfArray = objectIndexInArray(array, value: 10, startingFrom: 0, length: 13, options: [.InsertionIndex, .LastEqual])
-        XCTAssertTrue(endOfArray == array.count, "...or the index at the end of the array if the object is larger than all other elements.")
+        let rangeStart = 0
+        let rangeLength = 13
+        let endOfArray = objectIndexInArray(array, value: 10, startingFrom: rangeStart, length: rangeLength, options: [.InsertionIndex, .LastEqual])
+        XCTAssertTrue(endOfArray == (rangeStart + rangeLength), "...or the index at the end of the array if the object is larger than all other elements.")
+    }
+
+
+    func test_arrayReplacement() {
+        let array = NSMutableArray(array: [
+                               NSNumber(int: 0), NSNumber(int: 1), NSNumber(int: 2), NSNumber(int: 3),
+                               NSNumber(int: 4), NSNumber(int: 5), NSNumber(int: 7)])
+        array.replaceObjectsInRange(NSRange(location: 0, length: 2), withObjectsFromArray: [NSNumber(int: 8), NSNumber(int: 9)])
+        XCTAssertTrue((array[0] as! NSNumber).integerValue == 8)
+        XCTAssertTrue((array[1] as! NSNumber).integerValue == 9)
+        XCTAssertTrue((array[2] as! NSNumber).integerValue == 2)
+    }
+
+    func test_arrayReplaceObjectsInRangeFromRange() {
+        let array = NSMutableArray(array: [
+                                      NSNumber(int: 0), NSNumber(int: 1), NSNumber(int: 2), NSNumber(int: 3),
+                                      NSNumber(int: 4), NSNumber(int: 5), NSNumber(int: 7)])
+        array.replaceObjectsInRange(NSRange(location: 0, length: 2), withObjectsFromArray: [NSNumber(int: 8), NSNumber(int: 9), NSNumber(int: 10)], range: NSRange(location: 1, length: 2))
+        XCTAssertTrue((array[0] as! NSNumber).integerValue == 9)
+        XCTAssertTrue((array[1] as! NSNumber).integerValue == 10)
+        XCTAssertTrue((array[2] as! NSNumber).integerValue == 2)
+    }
+    
+    func test_binarySearchFringeCases() {
+        let array = NSArray(array: [
+            NSNumber(int: 0), NSNumber(int: 1), NSNumber(int: 2), NSNumber(int: 2), NSNumber(int: 3),
+            NSNumber(int: 4), NSNumber(int: 4), NSNumber(int: 6), NSNumber(int: 7), NSNumber(int: 7),
+            NSNumber(int: 7), NSNumber(int: 8), NSNumber(int: 9), NSNumber(int: 9)])
+        
+        let emptyArray = NSArray()
+//        Same as for non empty NSArray but error message ends with 'bounds for empty array'.
+//        let _ = objectIndexInArray(emptyArray, value: 0, startingFrom: 0, length: 1)
+        
+        let notFoundInEmptyArray = objectIndexInArray(emptyArray, value: 9, startingFrom: 0, length: 0)
+        XCTAssertEqual(notFoundInEmptyArray, NSNotFound, "Empty NSArray return NSNotFound for any valid arguments.")
+        
+        let startIndex = objectIndexInArray(emptyArray, value: 7, startingFrom: 0, length: 0, options: [.InsertionIndex])
+        XCTAssertTrue(startIndex == 0, "For Empty NSArray any objects should be inserted at start.")
+        
+        let rangeStart = 0
+        let rangeLength = 13
+        
+        let leastSearch = objectIndexInArray(array, value: -1, startingFrom: rangeStart, length: rangeLength)
+        XCTAssertTrue(leastSearch == NSNotFound, "If object is less than least object in the range then there is no change it could be found.")
+        
+        let greatestSearch = objectIndexInArray(array, value: 15, startingFrom: rangeStart, length: rangeLength)
+        XCTAssertTrue(greatestSearch == NSNotFound, "If object is greater than greatest object in the range then there is no change it could be found.")
+        
+        let leastInsert = objectIndexInArray(array, value: -1, startingFrom: rangeStart, length: rangeLength, options: .InsertionIndex)
+        XCTAssertTrue(leastInsert == rangeStart, "If object is less than least object in the range it should be inserted at range' location.")
+        
+        let greatestInsert = objectIndexInArray(array, value: 15, startingFrom: rangeStart, length: rangeLength, options: .InsertionIndex)
+        XCTAssertTrue(greatestInsert == (rangeStart + rangeLength), "If object is greater than greatest object in the range it should be inserted at range' end.")
     }
     
     func objectIndexInArray(array: NSArray, value: Int, startingFrom: Int, length: Int, options: NSBinarySearchingOptions = []) -> Int {
@@ -198,4 +258,48 @@
         XCTAssertEqual(array1[2] as? NSString, "baz2".bridge(), "Expected baz2 but was \(array1[2])")
         XCTAssertEqual(array1[3] as? NSString, "baz1".bridge(), "Expected baz1 but was \(array1[3])")
     }
+
+    func test_sortedArrayUsingComparator() {
+        // sort with localized caseInsensitive compare
+        let input = ["this", "is", "a", "test", "of", "sort", "with", "strings"]
+        let expectedResult: Array<String> = input.sort()
+        let result = input.bridge().sortedArrayUsingComparator { left, right -> NSComparisonResult in
+            let l = left as! NSString
+            let r = right as! NSString
+            return l.localizedCaseInsensitiveCompare(r.bridge())
+        }
+        XCTAssertEqual(result.map { ($0 as! NSString).bridge()} , expectedResult)
+
+        // sort empty array
+        let emptyArray = NSArray().sortedArrayUsingComparator { _,_ in .OrderedSame }
+        XCTAssertTrue(emptyArray.isEmpty)
+
+        // sort numbers
+        let inputNumbers = [0, 10, 25, 100, 21, 22]
+        let expectedNumbers = inputNumbers.sort()
+        let resultNumbers = inputNumbers.bridge().sortedArrayUsingComparator { left, right -> NSComparisonResult in
+            let l = (left as! NSNumber).integerValue
+            let r = (right as! NSNumber).integerValue
+            return l < r ? .OrderedAscending : (l > r ? .OrderedSame : .OrderedDescending)
+        }
+        XCTAssertEqual(resultNumbers.map { ($0 as! NSNumber).integerValue}, expectedNumbers)
+    }
+
+    func test_sortedArrayWithOptionsUsingComparator() {
+        // check that sortedArrayWithOptions:comparator: works in the way sortedArrayUsingComparator does
+        let input = ["this", "is", "a", "test", "of", "sort", "with", "strings"].bridge()
+        let comparator: (AnyObject, AnyObject) -> NSComparisonResult = { left, right -> NSComparisonResult in
+            let l = left as! NSString
+            let r = right as! NSString
+            return l.localizedCaseInsensitiveCompare(r.bridge())
+        }
+        let result1 = input.sortedArrayUsingComparator(comparator)
+        let result2 = input.sortedArrayWithOptions([], usingComparator: comparator)
+
+        XCTAssertTrue(result1.bridge().isEqualToArray(result2))
+
+        // sort empty array
+        let emptyArray = NSArray().sortedArrayWithOptions([]) { _,_ in .OrderedSame }
+        XCTAssertTrue(emptyArray.isEmpty)
+    }
 }
diff --git a/TestFoundation/TestNSCharacterSet.swift b/TestFoundation/TestNSCharacterSet.swift
index a35632f..dc9ea35 100644
--- a/TestFoundation/TestNSCharacterSet.swift
+++ b/TestFoundation/TestNSCharacterSet.swift
@@ -63,29 +63,29 @@
     
     func test_Range() {
         let cset1 = NSCharacterSet(range: NSMakeRange(0x20, 40))
-        for var idx: unichar = 0; idx < 0xFFFF; idx++ {
+        for idx: unichar in 0..<0xFFFF {
             XCTAssertEqual(cset1.characterIsMember(idx), (idx >= 0x20 && idx < 0x20 + 40 ? true : false))
         }
         
         let cset2 = NSCharacterSet(range: NSMakeRange(0x0000, 0xFFFF))
-        for var idx: unichar = 0; idx < 0xFFFF; idx++ {
+        for idx: unichar in 0..<0xFFFF {
             XCTAssertEqual(cset2.characterIsMember(idx), true)
         }
         
         let cset3 = NSCharacterSet(range: NSMakeRange(0x0000, 10))
-        for var idx: unichar = 0; idx < 0xFFFF; idx++ {
+        for idx: unichar in 0..<0xFFFF {
             XCTAssertEqual(cset3.characterIsMember(idx), (idx < 10 ? true : false))
         }
         
         let cset4 = NSCharacterSet(range: NSMakeRange(0x20, 0))
-        for var idx: unichar = 0; idx < 0xFFFF; idx++ {
+        for idx: unichar in 0..<0xFFFF {
             XCTAssertEqual(cset4.characterIsMember(idx), false)
         }
     }
     
     func test_String() {
         let cset = NSCharacterSet(charactersInString: "abcABC")
-        for var idx: unichar = 0; idx < 0xFFFF; idx++ {
+        for idx: unichar in 0..<0xFFFF {
             XCTAssertEqual(cset.characterIsMember(idx), (idx >= unichar(unicodeScalarLiteral: "a") && idx <= unichar(unicodeScalarLiteral: "c")) || (idx >= unichar(unicodeScalarLiteral: "A") && idx <= unichar(unicodeScalarLiteral: "C")) ? true : false)
         }
     }
diff --git a/TestFoundation/TestNSFileManager.swift b/TestFoundation/TestNSFileManager.swift
index 1f67afb..bd7f128 100644
--- a/TestFoundation/TestNSFileManager.swift
+++ b/TestFoundation/TestNSFileManager.swift
@@ -24,6 +24,8 @@
             ("test_fileSystemRepresentation", test_fileSystemRepresentation),
             ("test_fileAttributes", test_fileAttributes),
             ("test_directoryEnumerator", test_directoryEnumerator),
+            ("test_contentsOfDirectoryAtPath", test_contentsOfDirectoryAtPath),
+            ("test_subpathsOfDirectoryAtPath", test_subpathsOfDirectoryAtPath)
         ]
     }
     
@@ -239,4 +241,96 @@
         }
     }
     
+    func test_contentsOfDirectoryAtPath() {
+        let fm = NSFileManager.defaultManager()
+        let path = "/tmp/testdir"
+        let itemPath1 = "/tmp/testdir/item"
+        let itemPath2 = "/tmp/testdir/item2"
+        
+        ignoreError { try fm.removeItemAtPath(path) }
+        
+        do {
+            try fm.createDirectoryAtPath(path, withIntermediateDirectories: false, attributes: nil)
+            fm.createFileAtPath(itemPath1, contents: NSData(), attributes: nil)
+            fm.createFileAtPath(itemPath2, contents: NSData(), attributes: nil)
+        } catch _ {
+            XCTFail()
+        }
+        
+        do {
+            let entries = try fm.contentsOfDirectoryAtPath(path)
+            
+            XCTAssertEqual(2, entries.count)
+            XCTAssertTrue(entries.contains("item"))
+            XCTAssertTrue(entries.contains("item2"))
+        }
+        catch _ {
+            XCTFail()
+        }
+        
+        do {
+            try fm.contentsOfDirectoryAtPath("")
+            
+            XCTFail()
+        }
+        catch _ {
+            // Invalid directories should fail.
+        }
+        
+        do {
+            try fm.removeItemAtPath(path)
+        } catch {
+            XCTFail("Failed to clean up files")
+        }
+    }
+    
+    func test_subpathsOfDirectoryAtPath() {
+        let fm = NSFileManager.defaultManager()
+        let path = "/tmp/testdir"
+        let path2 = "/tmp/testdir/sub"
+        let itemPath1 = "/tmp/testdir/item"
+        let itemPath2 = "/tmp/testdir/item2"
+        let itemPath3 = "/tmp/testdir/sub/item3"
+                
+        ignoreError { try fm.removeItemAtPath(path) }
+        
+        do {
+            try fm.createDirectoryAtPath(path, withIntermediateDirectories: false, attributes: nil)
+            fm.createFileAtPath(itemPath1, contents: NSData(), attributes: nil)
+            fm.createFileAtPath(itemPath2, contents: NSData(), attributes: nil)
+            
+            try fm.createDirectoryAtPath(path2, withIntermediateDirectories: false, attributes: nil)
+            fm.createFileAtPath(itemPath3, contents: NSData(), attributes: nil)
+        } catch _ {
+            XCTFail()
+        }
+        
+        do {
+            let entries = try fm.subpathsOfDirectoryAtPath(path)
+            
+            XCTAssertEqual(4, entries.count)
+            XCTAssertTrue(entries.contains("item"))
+            XCTAssertTrue(entries.contains("item2"))
+            XCTAssertTrue(entries.contains("sub"))
+            XCTAssertTrue(entries.contains("sub/item3"))
+        }
+        catch _ {
+            XCTFail()
+        }
+        
+        do {
+            try fm.subpathsOfDirectoryAtPath("")
+            
+            XCTFail()
+        }
+        catch _ {
+            // Invalid directories should fail.
+        }
+        
+        do {
+            try fm.removeItemAtPath(path)
+        } catch {
+            XCTFail("Failed to clean up files")
+        }
+    }
 }
\ No newline at end of file
diff --git a/TestFoundation/TestNSGeometry.swift b/TestFoundation/TestNSGeometry.swift
index 7186c4f..e8f50f6 100644
--- a/TestFoundation/TestNSGeometry.swift
+++ b/TestFoundation/TestNSGeometry.swift
@@ -40,6 +40,7 @@
             ("test_NSIntersectsRect", test_NSIntersectsRect),
             ("test_NSIntegralRect", test_NSIntegralRect),
             ("test_NSIntegralRectWithOptions", test_NSIntegralRectWithOptions),
+            ("test_NSDivideRect", test_NSDivideRect)
         ]
     }
 
@@ -353,4 +354,97 @@
         XCTAssertEqual(result, expectedResult)
 
     }
+
+    func test_NSDivideRect() {
+
+        // divide empty rect
+        var inRect = NSZeroRect
+        var slice = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        var remainder = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        NSDivideRect(inRect, &slice, &remainder, CGFloat(0.0), .MaxX)
+        var expectedSlice = NSZeroRect
+        var expectedRemainder = NSZeroRect
+        XCTAssertEqual(slice, expectedSlice)
+        XCTAssertEqual(remainder, expectedRemainder)
+
+        // divide rect by MinX edge
+        inRect = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        slice = NSZeroRect
+        remainder = NSZeroRect
+        NSDivideRect(inRect, &slice, &remainder, CGFloat(10.0), .MinX)
+        expectedSlice = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(10.0), CGFloat(35.0))
+        expectedRemainder = NSMakeRect(CGFloat(10.0), CGFloat(-5.0), CGFloat(15.0), CGFloat(35.0))
+        XCTAssertEqual(slice, expectedSlice)
+        XCTAssertEqual(remainder, expectedRemainder)
+
+        // divide rect by MinX edge with amount > width
+        inRect = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        slice = NSZeroRect
+        remainder = NSZeroRect
+        NSDivideRect(inRect, &slice, &remainder, NSWidth(inRect) + CGFloat(1.0), .MinX)
+        expectedSlice = inRect
+        expectedRemainder = NSMakeRect(CGFloat(25.0), CGFloat(-5.0), CGFloat(0.0), CGFloat(35.0))
+        XCTAssertEqual(slice, expectedSlice)
+        XCTAssertEqual(remainder, expectedRemainder)
+
+        // divide rect by MinY edge
+        inRect = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        slice = NSZeroRect
+        remainder = NSZeroRect
+        NSDivideRect(inRect, &slice, &remainder, CGFloat(10.0), .MinY)
+        expectedSlice = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(10.0))
+        expectedRemainder = NSMakeRect(CGFloat(0.0), CGFloat(5.0), CGFloat(25.0), CGFloat(25.0))
+        XCTAssertEqual(slice, expectedSlice)
+        XCTAssertEqual(remainder, expectedRemainder)
+
+        // divide rect by MinY edge with amount > height
+        inRect = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        slice = NSZeroRect
+        remainder = NSZeroRect
+        NSDivideRect(inRect, &slice, &remainder, NSHeight(inRect) + CGFloat(1.0), .MinY)
+        expectedSlice = inRect
+        expectedRemainder = NSMakeRect(CGFloat(0.0), CGFloat(30.0), CGFloat(25.0), CGFloat(0.0))
+        XCTAssertEqual(slice, expectedSlice)
+        XCTAssertEqual(remainder, expectedRemainder)
+
+        // divide rect by MaxX edge
+        inRect = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        slice = NSZeroRect
+        remainder = NSZeroRect
+        NSDivideRect(inRect, &slice, &remainder, CGFloat(10.0), .MaxX)
+        expectedSlice = NSMakeRect(CGFloat(15.0), CGFloat(-5.0), CGFloat(10.0), CGFloat(35.0))
+        expectedRemainder = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(15.0), CGFloat(35.0))
+        XCTAssertEqual(slice, expectedSlice)
+        XCTAssertEqual(remainder, expectedRemainder)
+
+        // divide rect by MaxX edge with amount > width
+        inRect = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        slice = NSZeroRect
+        remainder = NSZeroRect
+        NSDivideRect(inRect, &slice, &remainder, NSWidth(inRect) + CGFloat(1.0), .MaxX)
+        expectedSlice = inRect
+        expectedRemainder = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(0.0), CGFloat(35.0))
+        XCTAssertEqual(slice, expectedSlice)
+        XCTAssertEqual(remainder, expectedRemainder)
+
+        // divide rect by MaxY edge
+        inRect = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        slice = NSZeroRect
+        remainder = NSZeroRect
+        NSDivideRect(inRect, &slice, &remainder, CGFloat(10.0), .MaxY)
+        expectedSlice = NSMakeRect(CGFloat(0.0), CGFloat(20.0), CGFloat(25.0), CGFloat(10.0))
+        expectedRemainder = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(25.0))
+        XCTAssertEqual(slice, expectedSlice)
+        XCTAssertEqual(remainder, expectedRemainder)
+
+        // divide rect by MaxY edge with amount > height
+        inRect = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(35.0))
+        slice = NSZeroRect
+        remainder = NSZeroRect
+        NSDivideRect(inRect, &slice, &remainder, NSHeight(inRect) + CGFloat(1.0), .MaxY)
+        expectedSlice = inRect
+        expectedRemainder = NSMakeRect(CGFloat(0.0), CGFloat(-5.0), CGFloat(25.0), CGFloat(0.0))
+        XCTAssertEqual(slice, expectedSlice)
+        XCTAssertEqual(remainder, expectedRemainder)
+    }
 }
diff --git a/TestFoundation/TestNSIndexSet.swift b/TestFoundation/TestNSIndexSet.swift
index 194a51b..14e7edf 100644
--- a/TestFoundation/TestNSIndexSet.swift
+++ b/TestFoundation/TestNSIndexSet.swift
@@ -25,6 +25,7 @@
             ("test_enumeration", test_enumeration),
             ("test_sequenceType", test_sequenceType),
             ("test_removal", test_removal),
+            ("test_addition",test_addition),
         ]
     }
     
@@ -103,4 +104,68 @@
         
     }
     
+    func test_addition() {
+        
+        let testSetA = NSMutableIndexSet(index: 0)
+        testSetA.addIndex(5)
+        testSetA.addIndex(6)
+        testSetA.addIndex(7)
+        testSetA.addIndex(8)
+        testSetA.addIndex(42)
+        
+        let testInputA1 = [0,5,6,7,8,42]
+        var i = 0
+        
+        if testInputA1.count == testSetA.count {
+            testSetA.enumerateIndexesUsingBlock { (idx, _) in
+                XCTAssertEqual(idx, testInputA1[i])
+                i++
+            }
+        }
+        else {
+            XCTFail("IndexSet does not contain correct number of indexes")
+        }
+        
+        
+        let testInputA2 = [NSMakeRange(0, 1),NSMakeRange(5, 4),NSMakeRange(42, 1)]
+        i = 0
+        
+        testSetA.enumerateRangesUsingBlock { (range, _) in
+            let testRange = testInputA2[i]
+            XCTAssertEqual(range.location, testRange.location)
+            XCTAssertEqual(range.length, testRange.length)
+            i++
+        }
+        
+        let testSetB = NSMutableIndexSet(indexesInRange: NSMakeRange(0,5))
+        testSetB.addIndexesInRange(NSMakeRange(42, 3))
+        testSetB.addIndexesInRange(NSMakeRange(2, 2))
+        testSetB.addIndexesInRange(NSMakeRange(18, 1))
+        
+        let testInputB1 = [0,1,2,3,4,18,42,43,44]
+        i = 0
+        
+        if testInputB1.count == testSetB.count {
+            testSetB.enumerateIndexesUsingBlock { (idx, _) in
+                XCTAssertEqual(idx, testInputB1[i])
+                i++
+            }
+        }
+        else {
+            XCTFail("IndexSet does not contain correct number of indexes")
+        }
+        
+        
+        let testInputB2 = [NSMakeRange(0, 5),NSMakeRange(18, 1),NSMakeRange(42, 3)]
+        i = 0
+        
+        testSetB.enumerateRangesUsingBlock { (range, _) in
+            let testRange = testInputB2[i]
+            XCTAssertEqual(range.location, testRange.location)
+            XCTAssertEqual(range.length, testRange.length)
+            i++
+        }
+    
+    }
+    
 }
\ No newline at end of file
diff --git a/TestFoundation/TestNSNumber.swift b/TestFoundation/TestNSNumber.swift
index 8f5ec65..6eef713 100644
--- a/TestFoundation/TestNSNumber.swift
+++ b/TestFoundation/TestNSNumber.swift
@@ -26,6 +26,12 @@
             ("test_numberWithShort", test_numberWithShort ),
             ("test_numberWithFloat", test_numberWithFloat ),
             ("test_numberWithDouble", test_numberWithDouble ),
+            ("test_compareNumberWithBool", test_compareNumberWithBool ),
+            ("test_compareNumberWithChar", test_compareNumberWithChar ),
+            ("test_compareNumberWithUnsignedChar", test_compareNumberWithUnsignedChar ),
+            ("test_compareNumberWithShort", test_compareNumberWithShort ),
+            ("test_compareNumberWithFloat", test_compareNumberWithFloat ),
+            ("test_compareNumberWithDouble", test_compareNumberWithDouble ),
         ]
     }
     
@@ -246,4 +252,116 @@
         XCTAssertEqual(NSNumber(double: Double(-37.5)).doubleValue, Double(-37.5))
         XCTAssertEqual(NSNumber(double: Double(42.1)).doubleValue, Double(42.1))
     }
-}
\ No newline at end of file
+
+    func test_compareNumberWithBool() {
+        XCTAssertEqual(NSNumber(bool: true).compare(NSNumber(bool: true)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(bool: true).compare(NSNumber(bool: false)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(bool: false).compare(NSNumber(bool: true)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(bool: false).compare(NSNumber(char: 0)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(bool: false).compare(NSNumber(char: -1)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(bool: false).compare(NSNumber(char: 1)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(bool: true).compare(NSNumber(char: 1)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(bool: true).compare(NSNumber(char: 0)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(bool: true).compare(NSNumber(char: 2)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(bool: false).compare(NSNumber(double: 0)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(bool: false).compare(NSNumber(double: -0.1)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(bool: false).compare(NSNumber(double: 0.1)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(bool: true).compare(NSNumber(double: 1)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(bool: true).compare(NSNumber(double: 0.9)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(bool: true).compare(NSNumber(double: 1.1)), NSComparisonResult.OrderedAscending)
+    }
+
+    func test_compareNumberWithChar() {
+        XCTAssertEqual(NSNumber(char: 42).compare(NSNumber(char: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(char: 42).compare(NSNumber(char: 0)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(char: -37).compare(NSNumber(char: 16)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(char: 1).compare(NSNumber(bool: true)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(char: 1).compare(NSNumber(bool: false)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(char: -37).compare(NSNumber(bool: true)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(char: 42).compare(NSNumber(unsignedChar: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(char: 42).compare(NSNumber(unsignedChar: 16)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(char: -37).compare(NSNumber(unsignedChar: 255)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(char: 42).compare(NSNumber(float: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(char: -16).compare(NSNumber(float: -37.5)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(char: 16).compare(NSNumber(float: 16.1)), NSComparisonResult.OrderedAscending)
+    }
+
+    func test_compareNumberWithUnsignedChar() {
+        XCTAssertEqual(NSNumber(unsignedChar: 42).compare(NSNumber(unsignedChar: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(unsignedChar: 42).compare(NSNumber(unsignedChar: 0)), NSComparisonResult.OrderedDescending)
+//        XCTAssertEqual(NSNumber(unsignedChar: 42).compare(NSNumber(unsignedChar: 255)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(unsignedChar: 1).compare(NSNumber(bool: true)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(unsignedChar: 1).compare(NSNumber(bool: false)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(unsignedChar: 0).compare(NSNumber(bool: true)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(unsignedChar: 42).compare(NSNumber(short: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(unsignedChar: 0).compare(NSNumber(short: -123)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(unsignedChar: 255).compare(NSNumber(short: 12345)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(unsignedChar: 42).compare(NSNumber(float: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(unsignedChar: 0).compare(NSNumber(float: -37.5)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(unsignedChar: 255).compare(NSNumber(float: 1234.5)), NSComparisonResult.OrderedAscending)
+    }
+
+    func test_compareNumberWithShort() {
+        XCTAssertEqual(NSNumber(short: 42).compare(NSNumber(short: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(short: 42).compare(NSNumber(short: 0)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(short: -37).compare(NSNumber(short: 12345)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(short: 1).compare(NSNumber(bool: true)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(short: 1).compare(NSNumber(bool: false)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(short: 0).compare(NSNumber(bool: true)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(short: 42).compare(NSNumber(unsignedChar: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(short: 42).compare(NSNumber(unsignedChar: 0)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(short: -37).compare(NSNumber(unsignedChar: 255)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(short: 42).compare(NSNumber(float: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(short: 0).compare(NSNumber(float: -37.5)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(short: 255).compare(NSNumber(float: 1234.5)), NSComparisonResult.OrderedAscending)
+    }
+
+    func test_compareNumberWithFloat() {
+        XCTAssertEqual(NSNumber(float: 42).compare(NSNumber(float: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(float: 42).compare(NSNumber(float: 0)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(float: -37).compare(NSNumber(float: 12345)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(float: 1).compare(NSNumber(bool: true)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(float: 0.1).compare(NSNumber(bool: false)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(float: 0.9).compare(NSNumber(bool: true)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(float: 42).compare(NSNumber(unsignedChar: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(float: 0.1).compare(NSNumber(unsignedChar: 0)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(float: -254.9).compare(NSNumber(unsignedChar: 255)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(float: 42).compare(NSNumber(double: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(float: 0).compare(NSNumber(double: -37.5)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(float: -37.5).compare(NSNumber(double: 1234.5)), NSComparisonResult.OrderedAscending)
+    }
+
+    func test_compareNumberWithDouble() {
+        XCTAssertEqual(NSNumber(double: 42).compare(NSNumber(double: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(double: 42).compare(NSNumber(double: 0)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(double: -37).compare(NSNumber(double: 12345)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(double: 1).compare(NSNumber(bool: true)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(double: 0.1).compare(NSNumber(bool: false)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(double: 0.9).compare(NSNumber(bool: true)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(double: 42).compare(NSNumber(unsignedChar: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(double: 0.1).compare(NSNumber(unsignedChar: 0)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(double: -254.9).compare(NSNumber(unsignedChar: 255)), NSComparisonResult.OrderedAscending)
+
+        XCTAssertEqual(NSNumber(double: 42).compare(NSNumber(float: 42)), NSComparisonResult.OrderedSame)
+        XCTAssertEqual(NSNumber(double: 0).compare(NSNumber(float: -37.5)), NSComparisonResult.OrderedDescending)
+        XCTAssertEqual(NSNumber(double: -37.5).compare(NSNumber(float: 1234.5)), NSComparisonResult.OrderedAscending)
+    }
+}
diff --git a/TestFoundation/TestNSRunLoop.swift b/TestFoundation/TestNSRunLoop.swift
index e25518c..9328dfd 100755
--- a/TestFoundation/TestNSRunLoop.swift
+++ b/TestFoundation/TestNSRunLoop.swift
@@ -31,6 +31,18 @@
         XCTAssertNotNil(mainRunLoop)
         let currentRunLoop = NSRunLoop.currentRunLoop()
         XCTAssertNotNil(currentRunLoop)
+
+        let secondAccessOfMainLoop = NSRunLoop.mainRunLoop()
+        XCTAssertEqual(mainRunLoop, secondAccessOfMainLoop, "fetching the main loop a second time should be equal")
+        XCTAssertTrue(mainRunLoop === secondAccessOfMainLoop, "fetching the main loop a second time should be identical")
+        
+        let secondAccessOfCurrentLoop = NSRunLoop.currentRunLoop()
+        XCTAssertEqual(currentRunLoop, secondAccessOfCurrentLoop, "fetching the current loop a second time should be equal")
+        XCTAssertTrue(currentRunLoop === secondAccessOfCurrentLoop, "fetching the current loop a second time should be identical")
+        
+        // We can assume that the tests will be run on the main run loop
+        // so the current loop should be the main loop
+        XCTAssertEqual(mainRunLoop, currentRunLoop, "the current run loop should be the main loop")
     }
     
     func test_runLoopRunMode() {
@@ -70,5 +82,4 @@
         
         XCTAssertLessThan(abs(timerTickInterval - expectedTimeInterval), 0.01)
     }
-    
 }
diff --git a/TestFoundation/TestNSString.swift b/TestFoundation/TestNSString.swift
index d3c1186..1ca2de1 100644
--- a/TestFoundation/TestNSString.swift
+++ b/TestFoundation/TestNSString.swift
@@ -45,6 +45,7 @@
             ("test_rangeOfCharacterFromSet", test_rangeOfCharacterFromSet ),
             ("test_CFStringCreateMutableCopy", test_CFStringCreateMutableCopy),
             ("test_swiftStringUTF16", test_swiftStringUTF16),
+            ("test_stringByTrimmingCharactersInSet", test_stringByTrimmingCharactersInSet),
         ]
     }
 
@@ -336,4 +337,10 @@
         
         XCTAssertTrue(newString.isEqualToString(testString))
     }
+
+    func test_stringByTrimmingCharactersInSet() {
+        let characterSet = NSCharacterSet.whitespaceCharacterSet()
+        let string: NSString = " abc   "
+        XCTAssertEqual(string.stringByTrimmingCharactersInSet(characterSet), "abc")
+    }
 }
diff --git a/TestFoundation/TestNSTimeZone.swift b/TestFoundation/TestNSTimeZone.swift
index c3fbec7..41cdf31 100644
--- a/TestFoundation/TestNSTimeZone.swift
+++ b/TestFoundation/TestNSTimeZone.swift
@@ -25,22 +25,26 @@
 
     var allTests : [(String, () -> Void)] {
         return [
-            ("test_abbreviation", test_abbreviation),
+            // Disabled see https://bugs.swift.org/browse/SR-300
+            // ("test_abbreviation", test_abbreviation),
             ("test_initializingTimeZoneWithOffset", test_initializingTimeZoneWithOffset),
-            ("test_systemTimeZoneUsesSystemTime", test_systemTimeZoneUsesSystemTime),
+            // Also disabled due to https://bugs.swift.org/browse/SR-300
+            // ("test_systemTimeZoneUsesSystemTime", test_systemTimeZoneUsesSystemTime),
         ]
     }
 
     func test_abbreviation() {
         let tz = NSTimeZone.systemTimeZone()
-        XCTAssertEqual(tz.abbreviation, tz.abbreviationForDate(NSDate()))
+        let abbreviation1 = tz.abbreviation
+        let abbreviation2 = tz.abbreviationForDate(NSDate())
+        XCTAssertEqual(abbreviation1, abbreviation2, "\(abbreviation1) should be equal to \(abbreviation2)")
     }
     
     func test_initializingTimeZoneWithOffset() {
         let tz = NSTimeZone(name: "GMT-0400")
         XCTAssertNotNil(tz)
         let seconds = tz?.secondsFromGMTForDate(NSDate())
-        XCTAssertEqual(seconds, -14400)
+        XCTAssertEqual(seconds, -14400, "GMT-0400 should be -14400 seconds but got \(seconds) instead")
     }
     
     func test_systemTimeZoneUsesSystemTime() {
@@ -50,6 +54,6 @@
         localtime_r(&t, &lt)
         let zoneName = NSTimeZone.systemTimeZone().abbreviation ?? "Invalid Abbreviation"
         let expectedName = NSString(CString: lt.tm_zone, encoding: NSASCIIStringEncoding)?.bridge() ?? "Invalid Zone"
-        XCTAssertEqual(zoneName, expectedName)
+        XCTAssertEqual(zoneName, expectedName, "expected name \"\(expectedName)\" is not equal to \"\(zoneName)\"")
     }
 }