From 503d535823e2f3aa4b1894cc3827afd10837c05c Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Thu, 15 Dec 2022 15:59:39 -0600 Subject: [PATCH] Fixes adding failures to NSErrors with nil localizedFailureReasons --- AltTests/AltTests.swift | 39 +++++++++++++++++++++++++++++++++ Shared/Errors/ALTWrappedError.m | 6 ++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/AltTests/AltTests.swift b/AltTests/AltTests.swift index f082ac1f..12d9d2b5 100644 --- a/AltTests/AltTests.swift +++ b/AltTests/AltTests.swift @@ -24,6 +24,7 @@ extension String static let testUnrecognizedFailureReason = "The alien invasion has begun." static let testUnrecognizedRecoverySuggestion = "Find your loved ones and pray the aliens are merciful." + static let testDescription = "The operation could not be completed because an error occured." static let testDebugDescription = "The very specific operation could not be completed because a detailed error occured. Code=101." } @@ -473,6 +474,44 @@ extension AltTests } } + func testSwiftErrorWithLocalizedFailure() async throws + { + enum MyError: Int, LocalizedError, CaseIterable + { + case strange + case nothing + + var errorDescription: String? { + switch self + { + case .strange: return "A strange error occured." + case .nothing: return nil + } + } + + var recoverySuggestion: String? { + return "Have you tried turning it off and on again?" + } + } + + for error in MyError.allCases + { + let nsError = (error as NSError).withLocalizedFailure(.testLocalizedFailure) + + ALTAssertErrorsEqual(nsError, error, ignoring: [NSLocalizedDescriptionKey, NSLocalizedFailureErrorKey]) + ALTAssertErrorFailureAndDescription(nsError, failure: .testLocalizedFailure, baseDescription: error.localizedDescription) + } + } + + func testNSErrorWithLocalizedFailure() async throws + { + let error = NSError(domain: .testDomain, code: 14, userInfo: [NSLocalizedDescriptionKey: String.testDescription]) + let nsError = (error as NSError).withLocalizedFailure(.testLocalizedFailure) + + ALTAssertErrorsEqual(nsError, error, ignoring: [NSLocalizedDescriptionKey, NSLocalizedFailureErrorKey]) + ALTAssertErrorFailureAndDescription(nsError, failure: .testLocalizedFailure, baseDescription: .testDescription) + } + func testReceivingAltServerError() async throws { for error in ALTServerError.testErrors diff --git a/Shared/Errors/ALTWrappedError.m b/Shared/Errors/ALTWrappedError.m index 82417fdd..b45d2631 100644 --- a/Shared/Errors/ALTWrappedError.m +++ b/Shared/Errors/ALTWrappedError.m @@ -36,12 +36,14 @@ - (NSString *)localizedDescription { + NSString *localizedFailureReason = self.wrappedError.localizedFailureReason ?: self.wrappedError.localizedDescription; + NSString *wrappedLocalizedDescription = self.wrappedError.userInfo[NSLocalizedDescriptionKey]; if (wrappedLocalizedDescription != nil) { NSString *localizedFailure = self.wrappedError.userInfo[NSLocalizedFailureErrorKey]; - NSString *fallbackDescription = localizedFailure != nil ? [NSString stringWithFormat:@"%@ %@", localizedFailure, self.wrappedError.localizedFailureReason] : self.wrappedError.localizedFailureReason; + NSString *fallbackDescription = localizedFailure != nil ? [NSString stringWithFormat:@"%@ %@", localizedFailure, localizedFailureReason] : localizedFailureReason; if (![wrappedLocalizedDescription isEqualToString:fallbackDescription]) { return wrappedLocalizedDescription; @@ -51,8 +53,6 @@ NSString *localizedFailure = self.userInfo[NSLocalizedFailureErrorKey]; if (localizedFailure != nil) { - NSString *localizedFailureReason = self.wrappedError.localizedFailureReason ?: self.wrappedError.localizedDescription; - NSString *localizedDescription = [NSString stringWithFormat:@"%@ %@", localizedFailure, localizedFailureReason]; return localizedDescription; }