Skip to content

Commit fc09501

Browse files
authored
Merge pull request #2912 from readdle/improve-error-to-nserror-conversion
Improve Error to NSError conversion
2 parents 849d2b7 + 9dfb052 commit fc09501

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

Sources/Foundation/NSError.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,8 +1410,8 @@ func _convertErrorToNSError(_ error: Error) -> NSError {
14101410
code = error.errorCode
14111411
userInfo = error.errorUserInfo
14121412
} else {
1413-
domain = "SwiftError"
1414-
code = 0
1413+
domain = error._domain
1414+
code = error._code
14151415
userInfo = (_swift_Foundation_getErrorDefaultUserInfo(error) as? [String : Any]) ?? [:]
14161416
}
14171417

Tests/Foundation/Tests/TestNSError.swift

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ class TestNSError : XCTestCase {
2222
("test_CustomNSError_errorCode", test_CustomNSError_errorCode),
2323
("test_CustomNSError_errorCodeRawInt", test_CustomNSError_errorCodeRawInt),
2424
("test_CustomNSError_errorCodeRawUInt", test_CustomNSError_errorCodeRawUInt),
25-
("test_errorConvenience", test_errorConvenience)
25+
("test_errorConvenience", test_errorConvenience),
26+
("test_ConvertErrorToNSError_domain", test_ConvertErrorToNSError_domain),
27+
("test_ConvertErrorToNSError_errorCode", test_ConvertErrorToNSError_errorCode),
28+
("test_ConvertErrorToNSError_errorCodeRawInt", test_ConvertErrorToNSError_errorCodeRawInt),
29+
("test_ConvertErrorToNSError_errorCodeRawUInt", test_ConvertErrorToNSError_errorCodeRawUInt),
30+
("test_ConvertErrorToNSError_errorCodeWithAssosiatedValue", test_ConvertErrorToNSError_errorCodeWithAssosiatedValue),
2631
]
2732
}
2833

@@ -106,6 +111,60 @@ class TestNSError : XCTestCase {
106111
XCTFail()
107112
}
108113
}
114+
115+
func test_ConvertErrorToNSError_domain() {
116+
struct CustomSwiftError: Error {
117+
}
118+
XCTAssertTrue((CustomSwiftError() as NSError).domain.contains("CustomSwiftError"))
119+
}
120+
121+
func test_ConvertErrorToNSError_errorCode() {
122+
enum SwiftError: Error {
123+
case zero
124+
case one
125+
case two
126+
}
127+
128+
XCTAssertEqual((SwiftError.zero as NSError).code, 0)
129+
XCTAssertEqual((SwiftError.one as NSError).code, 1)
130+
XCTAssertEqual((SwiftError.two as NSError).code, 2)
131+
}
132+
133+
func test_ConvertErrorToNSError_errorCodeRawInt() {
134+
enum SwiftError: Int, Error {
135+
case minusOne = -1
136+
case fortyTwo = 42
137+
}
138+
139+
XCTAssertEqual((SwiftError.minusOne as NSError).code, -1)
140+
XCTAssertEqual((SwiftError.fortyTwo as NSError).code, 42)
141+
}
142+
143+
func test_ConvertErrorToNSError_errorCodeRawUInt() {
144+
enum SwiftError: UInt, Error {
145+
case fortyTwo = 42
146+
}
147+
148+
XCTAssertEqual((SwiftError.fortyTwo as NSError).code, 42)
149+
}
150+
151+
func test_ConvertErrorToNSError_errorCodeWithAssosiatedValue() {
152+
// Default error code for enum case is based on EnumImplStrategy::getTagIndex
153+
enum SwiftError: Error {
154+
case one // 2
155+
case two // 3
156+
case three(String) // 0
157+
case four // 4
158+
case five(String) // 1
159+
}
160+
161+
XCTAssertEqual((SwiftError.one as NSError).code, 2)
162+
XCTAssertEqual((SwiftError.two as NSError).code, 3)
163+
XCTAssertEqual((SwiftError.three("three") as NSError).code, 0)
164+
XCTAssertEqual((SwiftError.four as NSError).code, 4)
165+
XCTAssertEqual((SwiftError.five("five") as NSError).code, 1)
166+
}
167+
109168
}
110169

111170
class TestURLError: XCTestCase {

0 commit comments

Comments
 (0)