Skip to content

Commit a79bb6e

Browse files
committed
add implementation for NSRangeFromString and testNSRange.swift
1 parent df08be3 commit a79bb6e

File tree

5 files changed

+95
-2
lines changed

5 files changed

+95
-2
lines changed

Foundation.xcodeproj/project.pbxproj

+4
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@
197197
EA66F64E1BF1619600136161 /* TestNSIndexSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA66F63E1BF1619600136161 /* TestNSIndexSet.swift */; };
198198
EA66F6501BF1619600136161 /* TestNSNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA66F63F1BF1619600136161 /* TestNSNumber.swift */; };
199199
EA66F6521BF1619600136161 /* TestNSPropertyList.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA66F6401BF1619600136161 /* TestNSPropertyList.swift */; };
200+
E876A73E1C1180E000F279EC /* TestNSRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = E876A73D1C1180E000F279EC /* TestNSRange.swift */; };
200201
EA66F6541BF1619600136161 /* TestNSSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA66F6411BF1619600136161 /* TestNSSet.swift */; };
201202
EA66F6561BF1619600136161 /* TestNSString.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA66F6421BF1619600136161 /* TestNSString.swift */; };
202203
EA66F6581BF1619600136161 /* TestNSURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA66F6431BF1619600136161 /* TestNSURL.swift */; };
@@ -503,6 +504,7 @@
503504
5BDC3FCF1BCF17E600ED97BB /* NSCFSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSCFSet.swift; sourceTree = "<group>"; };
504505
5BDC405C1BD6D83B00ED97BB /* TestFoundation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestFoundation.app; sourceTree = BUILT_PRODUCTS_DIR; };
505506
5BF7AEC21BCD568D008F214A /* ForSwiftFoundationOnly.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ForSwiftFoundationOnly.h; sourceTree = "<group>"; };
507+
E876A73D1C1180E000F279EC /* TestNSRange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestNSRange.swift; sourceTree = "<group>"; };
506508
EA313DFC1BE7F2E90060A403 /* CFURLComponents_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFURLComponents_Internal.h; sourceTree = "<group>"; };
507509
EA313DFD1BE7F2E90060A403 /* CFURLComponents_URIParser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = CFURLComponents_URIParser.c; sourceTree = "<group>"; };
508510
EA313DFE1BE7F2E90060A403 /* CFURLComponents.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = CFURLComponents.c; sourceTree = "<group>"; };
@@ -991,6 +993,7 @@
991993
EA66F63E1BF1619600136161 /* TestNSIndexSet.swift */,
992994
EA66F63F1BF1619600136161 /* TestNSNumber.swift */,
993995
EA66F6401BF1619600136161 /* TestNSPropertyList.swift */,
996+
E876A73D1C1180E000F279EC /* TestNSRange.swift */,
994997
EA66F6411BF1619600136161 /* TestNSSet.swift */,
995998
EA66F6421BF1619600136161 /* TestNSString.swift */,
996999
EA66F6431BF1619600136161 /* TestNSURL.swift */,
@@ -1678,6 +1681,7 @@
16781681
files = (
16791682
525AECED1BF2C9C500D15BB0 /* TestNSFileManager.swift in Sources */,
16801683
EA66F6501BF1619600136161 /* TestNSNumber.swift in Sources */,
1684+
E876A73E1C1180E000F279EC /* TestNSRange.swift in Sources */,
16811685
EA66F6521BF1619600136161 /* TestNSPropertyList.swift in Sources */,
16821686
EA66F64E1BF1619600136161 /* TestNSIndexSet.swift in Sources */,
16831687
EA66F6541BF1619600136161 /* TestNSSet.swift in Sources */,

Foundation/NSRange.swift

+29-1
Original file line numberDiff line numberDiff line change
@@ -99,5 +99,33 @@ public func NSStringFromRange(range: NSRange) -> String {
9999
}
100100

101101
public func NSRangeFromString(aString: String) -> NSRange {
102-
NSUnimplemented()
102+
let emptyRange = NSMakeRange(0, 0)
103+
if aString.isEmpty {
104+
// fail early if the string is empty
105+
return emptyRange
106+
}
107+
let scanner = NSScanner(string: aString)
108+
let digitSet = NSCharacterSet.decimalDigitCharacterSet()
109+
scanner.scanUpToCharactersFromSet(digitSet)
110+
if scanner.atEnd {
111+
// fail early if there are no decimal digits
112+
return emptyRange
113+
}
114+
guard let location = scanner.scanInteger() else {
115+
return emptyRange
116+
}
117+
let partialRange = NSMakeRange(location, 0)
118+
if scanner.atEnd {
119+
// return early if there are no more characters after the first int in the string
120+
return partialRange
121+
}
122+
scanner.scanUpToCharactersFromSet(digitSet)
123+
if scanner.atEnd {
124+
// return early if there are no integer characters after the first int in the string
125+
return partialRange
126+
}
127+
guard let length = scanner.scanInteger() else {
128+
return partialRange
129+
}
130+
return NSMakeRange(location, length)
103131
}

TestFoundation/TestNSRange.swift

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// This source file is part of the Swift.org open source project
2+
//
3+
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
4+
// Licensed under Apache License v2.0 with Runtime Library Exception
5+
//
6+
// See http://swift.org/LICENSE.txt for license information
7+
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
8+
//
9+
10+
11+
#if DEPLOYMENT_RUNTIME_OBJC || os(Linux)
12+
import Foundation
13+
import XCTest
14+
#else
15+
import SwiftFoundation
16+
import SwiftXCTest
17+
#endif
18+
19+
20+
class TestNSRange : XCTestCase {
21+
22+
var allTests : [(String, () -> ())] {
23+
return [
24+
("test_NSRangeFromString", test_NSRangeFromString ),
25+
]
26+
}
27+
28+
func test_NSRangeFromString() {
29+
let emptyRangeStrings = [
30+
"",
31+
"{}",
32+
"{a, b}",
33+
]
34+
let emptyRange = NSMakeRange(0, 0)
35+
for string in emptyRangeStrings {
36+
XCTAssert(NSEqualRanges(NSRangeFromString(string), emptyRange))
37+
}
38+
39+
let partialRangeStrings = [
40+
"12",
41+
"[12]",
42+
"{12",
43+
"{12,",
44+
]
45+
let partialRange = NSMakeRange(12, 0)
46+
for string in partialRangeStrings {
47+
XCTAssert(NSEqualRanges(NSRangeFromString(string), partialRange))
48+
}
49+
50+
let fullRangeStrings = [
51+
"{12, 34}",
52+
"[12, 34]",
53+
"12.34",
54+
]
55+
let fullRange = NSMakeRange(12, 34)
56+
for string in fullRangeStrings {
57+
XCTAssert(NSEqualRanges(NSRangeFromString(string), fullRange))
58+
}
59+
}
60+
}

TestFoundation/main.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@ internal func testBundle() -> NSBundle {
2020
}
2121

2222
// For the Swift version of the Foundation tests, we must manually list all test cases here.
23-
XCTMain([TestNSString(), TestNSArray(), TestNSDictionary(), TestNSSet(), TestNSNumber(), TestNSPropertyList(), TestNSURL(), TestNSIndexSet(), TestNSCharacterSet(), TestNSFileManger()])
23+
XCTMain([TestNSString(), TestNSArray(), TestNSDictionary(), TestNSSet(), TestNSNumber(), TestNSPropertyList(), TestNSURL(), TestNSIndexSet(), TestNSCharacterSet(), TestNSFileManger(), TestNSRange()])

build.py

+1
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@
352352
'TestFoundation/TestNSDictionary.swift',
353353
'TestFoundation/TestNSNumber.swift',
354354
'TestFoundation/TestNSPropertyList.swift',
355+
'TestFoundation/TestNSRange.swift',
355356
'TestFoundation/TestNSSet.swift',
356357
'TestFoundation/TestNSString.swift',
357358
'TestFoundation/TestNSURL.swift',

0 commit comments

Comments
 (0)