Skip to content

Commit 7c09116

Browse files
author
Konstiantyn Gominyuk
committed
Improve Error to NSError conversion
Error->NSError conversion in Darwin Foundation fills `domain` and `code` even if provided Error does not conform to CustomNSError. This patch brings same behavior to swift-corelibs-foundation.
1 parent 46b20d4 commit 7c09116

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-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: 59 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,59 @@ 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+
enum SwiftError: Error {
153+
case one
154+
case two
155+
case three(String)
156+
case four
157+
case five(String)
158+
}
159+
160+
XCTAssertEqual((SwiftError.one as NSError).code, 2)
161+
XCTAssertEqual((SwiftError.two as NSError).code, 3)
162+
XCTAssertEqual((SwiftError.three("three") as NSError).code, 0)
163+
XCTAssertEqual((SwiftError.four as NSError).code, 4)
164+
XCTAssertEqual((SwiftError.five("five") as NSError).code, 1)
165+
}
166+
109167
}
110168

111169
class TestURLError: XCTestCase {

0 commit comments

Comments
 (0)