Skip to content

Commit 9e27f04

Browse files
author
Konstiantyn Gominyuk
committed
Improve Error to NSError conversion
Darwin Foundation converts to NSError any type, which conforms Error protocol and doesn't conform CustomNSError, the same way as if it conforms CustomNSError with default implementation. Foundation should behave the same way on other platforms.
1 parent 46b20d4 commit 9e27f04

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)