Skip to content

Commit aff2ab1

Browse files
anferbuistmontgomery
authored andcommitted
XCTUnwrap API
Adds a new API `XCTUnwrap` which asserts that an expression is non-nil, and returns the unwrapped value. This matches a new API added in Apple's ObjC XCTest framework in Xcode 11 Beta 1 (see [release notes](https://developer.apple.com/documentation/xcode_release_notes/xcode_11_beta_2_release_notes#3318281).) - Adds an internal user info key `XCTestErrorUserInfoKeyShouldIgnore` which will cause errors not to be recorded as failures at the end of a test. This will make sure that errors from `XCTUnwrap` are not recorded twice (the assertion failure _and_ the thrown error). This can then be further extended to any errors that should be ignored by the framework. - Adds `XCTUnwrap`, which either returns the unwrapped value or records a failure and raises an error. The error includes `XCTestErrorUserInfoKeyShouldIgnore`. - Adds unit tests for `XCTUnwrap`. rdar://problem/48810220
1 parent a15b58d commit aff2ab1

File tree

6 files changed

+244
-8
lines changed

6 files changed

+244
-8
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ add_swift_library(XCTest
7070
Sources/XCTest/Private/ArgumentParser.swift
7171
Sources/XCTest/Private/SourceLocation.swift
7272
Sources/XCTest/Private/WaiterManager.swift
73+
Sources/XCTest/Private/IgnoredErrors.swift
7374
Sources/XCTest/Public/XCTestRun.swift
7475
Sources/XCTest/Public/XCTestMain.swift
7576
Sources/XCTest/Public/XCTestCase.swift
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// This source file is part of the Swift.org open source project
2+
//
3+
// Copyright (c) 2019 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+
// IgnoredErrors.swift
11+
//
12+
13+
/// The user info key used by errors so that they are ignored by the XCTest library.
14+
internal let XCTestErrorUserInfoKeyShouldIgnore = "XCTestErrorUserInfoKeyShouldIgnore"
15+
16+
/// The error type thrown by `XCTUnwrap` on assertion failure.
17+
internal struct XCTestErrorWhileUnwrappingOptional: Error, CustomNSError {
18+
static var errorDomain: String = XCTestErrorDomain
19+
20+
var errorCode: Int = 105
21+
22+
var errorUserInfo: [String : Any] {
23+
return [XCTestErrorUserInfoKeyShouldIgnore: true]
24+
}
25+
}

Sources/XCTest/Public/XCTAssert.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ private enum _XCTAssertion {
2121
case notEqualWithAccuracy
2222
case `nil`
2323
case notNil
24+
case unwrap
2425
case `true`
2526
case `false`
2627
case fail
@@ -39,6 +40,7 @@ private enum _XCTAssertion {
3940
case .notEqualWithAccuracy: return "XCTAssertNotEqual"
4041
case .`nil`: return "XCTAssertNil"
4142
case .notNil: return "XCTAssertNotNil"
43+
case .unwrap: return "XCTUnwrap"
4244
case .`true`: return "XCTAssertTrue"
4345
case .`false`: return "XCTAssertFalse"
4446
case .throwsError: return "XCTAssertThrowsError"
@@ -289,6 +291,47 @@ public func XCTAssertNotNil(_ expression: @autoclosure () throws -> Any?, _ mess
289291
}
290292
}
291293

294+
/// Asserts that an expression is not `nil`, and returns its unwrapped value.
295+
///
296+
/// Generates a failure if `expression` returns `nil`.
297+
///
298+
/// - Parameters:
299+
/// - expression: An expression of type `T?` to compare against `nil`. Its type will determine the type of the
300+
/// returned value.
301+
/// - message: An optional description of the failure.
302+
/// - file: The file in which failure occurred. Defaults to the file name of the test case in which this function was
303+
/// called.
304+
/// - line: The line number on which failure occurred. Defaults to the line number on which this function was called.
305+
/// - Returns: A value of type `T`, the result of evaluating and unwrapping the given `expression`.
306+
/// - Throws: An error if `expression` returns `nil`. If `expression` throws an error, then that error will be rethrown instead.
307+
public func XCTUnwrap<T>(_ expression: @autoclosure () throws -> T?, _ message: @autoclosure () -> String = "", file: StaticString = #file, line: UInt = #line) throws -> T {
308+
var value: T?
309+
var caughtErrorOptional: Swift.Error?
310+
311+
_XCTEvaluateAssertion(.unwrap, message: message(), file: file, line: line) {
312+
do {
313+
value = try expression()
314+
} catch {
315+
caughtErrorOptional = error
316+
return .unexpectedFailure(error)
317+
}
318+
319+
if value != nil {
320+
return .success
321+
} else {
322+
return .expectedFailure("expected non-nil value of type \"\(T.self)\"")
323+
}
324+
}
325+
326+
if let unwrappedValue = value {
327+
return unwrappedValue
328+
} else if let error = caughtErrorOptional {
329+
throw error
330+
} else {
331+
throw XCTestErrorWhileUnwrappingOptional()
332+
}
333+
}
334+
292335
public func XCTAssertTrue(_ expression: @autoclosure () throws -> Bool, _ message: @autoclosure () -> String = "", file: StaticString = #file, line: UInt = #line) {
293336
_XCTEvaluateAssertion(.`true`, message: message(), file: file, line: line) {
294337
let value = try expression()

Sources/XCTest/Public/XCTestCase.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,19 @@ open class XCTestCase: XCTest {
118118
do {
119119
try testClosure(self)
120120
} catch {
121-
recordFailure(
122-
withDescription: "threw error \"\(error)\"",
123-
inFile: "<EXPR>",
124-
atLine: 0,
125-
expected: false)
121+
var shouldIgnore = false
122+
if let userInfo = (error as? CustomNSError)?.errorUserInfo,
123+
let shouldIgnoreValue = userInfo[XCTestErrorUserInfoKeyShouldIgnore] as? NSNumber {
124+
shouldIgnore = shouldIgnoreValue.boolValue
125+
}
126+
127+
if !shouldIgnore {
128+
recordFailure(
129+
withDescription: "threw error \"\(error)\"",
130+
inFile: "<EXPR>",
131+
atLine: 0,
132+
expected: false)
133+
}
126134
}
127135
tearDown()
128136
}

Tests/Functional/ErrorHandling/main.swift

Lines changed: 157 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,20 @@ class ErrorHandling: XCTestCase {
3030
// Tests for XCTAssertNoThrow
3131
("test_shouldNotThrowErrorDefiningSuccess", test_shouldNotThrowErrorDefiningSuccess),
3232
("test_shouldThrowErrorDefiningFailure", test_shouldThrowErrorDefiningFailure),
33+
34+
// Tests for XCTUnwrap
35+
("test_shouldNotThrowErrorOnUnwrapSuccess", test_shouldNotThrowErrorOnUnwrapSuccess),
36+
("test_shouldThrowErrorOnUnwrapFailure", test_shouldThrowErrorOnUnwrapFailure),
37+
("test_shouldThrowErrorOnEvaluationFailure", test_shouldThrowErrorOnEvaluationFailure),
38+
("test_implicitlyUnwrappedOptional_notNil", test_implicitlyUnwrappedOptional_notNil),
39+
("test_implicitlyUnwrappedOptional_nil", test_implicitlyUnwrappedOptional_nil),
40+
("test_unwrapAnyOptional_notNil", test_unwrapAnyOptional_notNil),
41+
("test_unwrapAnyOptional_nil", test_unwrapAnyOptional_nil),
42+
("test_shouldReportFailureOnUnwrapFailure_catchUnwrapFailure", test_shouldReportFailureOnUnwrapFailure_catchUnwrapFailure),
43+
("test_shouldReportFailureOnUnwrapFailure_catchExpressionFailure", test_shouldReportFailureOnUnwrapFailure_catchExpressionFailure),
44+
("test_shouldReportCorrectTypeOnUnwrapFailure", test_shouldReportCorrectTypeOnUnwrapFailure),
45+
("test_shouldReportCustomFileLineLocation", test_shouldReportCustomFileLineLocation),
46+
("test_shouldReportFailureNotOnMainThread", test_shouldReportFailureNotOnMainThread),
3347
]
3448
}()
3549

@@ -38,6 +52,7 @@ class ErrorHandling: XCTestCase {
3852

3953
enum SomeError: Swift.Error {
4054
case anError(String)
55+
case shouldNotBeReached
4156
}
4257

4358
func functionThatDoesThrowError() throws {
@@ -63,6 +78,8 @@ class ErrorHandling: XCTestCase {
6378
switch thrownError {
6479
case .anError(let message):
6580
XCTAssertEqual(message, "an error message")
81+
default:
82+
XCTFail("Unexpected error: \(thrownError)")
6683
}
6784
}
6885
}
@@ -80,6 +97,8 @@ class ErrorHandling: XCTestCase {
8097
switch thrownError {
8198
case .anError(let message):
8299
XCTAssertEqual(message, "")
100+
default:
101+
XCTFail("Unexpected error: \(thrownError)")
83102
}
84103
}
85104
}
@@ -121,14 +140,149 @@ class ErrorHandling: XCTestCase {
121140
func test_shouldThrowErrorDefiningFailure() {
122141
XCTAssertNoThrow(try functionThatDoesThrowError())
123142
}
143+
144+
func functionShouldReturnOptionalButThrows() throws -> String? {
145+
throw SomeError.anError("an error message")
146+
}
147+
148+
// CHECK: Test Case 'ErrorHandling.test_shouldNotThrowErrorOnUnwrapSuccess' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
149+
// CHECK: Test Case 'ErrorHandling.test_shouldNotThrowErrorOnUnwrapSuccess' passed \(\d+\.\d+ seconds\)
150+
func test_shouldNotThrowErrorOnUnwrapSuccess() throws {
151+
let optional: String? = "is not nil"
152+
153+
let unwrapped = try XCTUnwrap(optional)
154+
XCTAssertEqual(unwrapped, optional)
155+
}
156+
157+
// CHECK: Test Case 'ErrorHandling.test_shouldThrowErrorOnUnwrapFailure' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
158+
// CHECK: .*[/\\]ErrorHandling[/\\]main.swift:[[@LINE+4]]: error: ErrorHandling.test_shouldThrowErrorOnUnwrapFailure : XCTUnwrap failed: expected non-nil value of type "String" -
159+
// CHECK: Test Case 'ErrorHandling.test_shouldThrowErrorOnUnwrapFailure' failed \(\d+\.\d+ seconds\)
160+
func test_shouldThrowErrorOnUnwrapFailure() throws {
161+
let optional: String? = nil
162+
_ = try XCTUnwrap(optional)
163+
164+
// Should not be reached:
165+
throw SomeError.shouldNotBeReached
166+
}
167+
168+
// CHECK: Test Case 'ErrorHandling.test_shouldThrowErrorOnEvaluationFailure' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
169+
// CHECK: .*[/\\]ErrorHandling[/\\]main.swift:[[@LINE+4]]: error: ErrorHandling.test_shouldThrowErrorOnEvaluationFailure : XCTUnwrap threw error "anError\("an error message"\)" - Failure error message
170+
// CHECK: \<EXPR\>:0: error: ErrorHandling.test_shouldThrowErrorOnEvaluationFailure : threw error "anError\("an error message"\)"
171+
// CHECK: Test Case 'ErrorHandling.test_shouldThrowErrorOnEvaluationFailure' failed \(\d+\.\d+ seconds\)
172+
func test_shouldThrowErrorOnEvaluationFailure() throws {
173+
_ = try XCTUnwrap(functionShouldReturnOptionalButThrows(), "Failure error message")
174+
175+
// Should not be reached:
176+
throw SomeError.shouldNotBeReached
177+
}
178+
179+
// CHECK: Test Case 'ErrorHandling.test_implicitlyUnwrappedOptional_notNil' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
180+
// CHECK: Test Case 'ErrorHandling.test_implicitlyUnwrappedOptional_notNil' passed \(\d+\.\d+ seconds\)
181+
func test_implicitlyUnwrappedOptional_notNil() throws {
182+
let implicitlyUnwrappedOptional: String! = "is not nil"
183+
184+
let unwrapped = try XCTUnwrap(implicitlyUnwrappedOptional)
185+
XCTAssertEqual(unwrapped, implicitlyUnwrappedOptional)
186+
}
187+
188+
// CHECK: Test Case 'ErrorHandling.test_implicitlyUnwrappedOptional_nil' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
189+
// CHECK: .*[/\\]ErrorHandling[/\\]main.swift:[[@LINE+4]]: error: ErrorHandling.test_implicitlyUnwrappedOptional_nil : XCTUnwrap failed: expected non-nil value of type "String" - Failure error message
190+
// CHECK: Test Case 'ErrorHandling.test_implicitlyUnwrappedOptional_nil' failed \(\d+\.\d+ seconds\)
191+
func test_implicitlyUnwrappedOptional_nil() throws {
192+
let implicitlyUnwrappedOptional: String! = nil
193+
_ = try XCTUnwrap(implicitlyUnwrappedOptional, "Failure error message")
194+
195+
// Should not be reached:
196+
throw SomeError.shouldNotBeReached
197+
}
198+
199+
// CHECK: Test Case 'ErrorHandling.test_unwrapAnyOptional_notNil' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
200+
// CHECK: Test Case 'ErrorHandling.test_unwrapAnyOptional_notNil' passed \(\d+\.\d+ seconds\)
201+
func test_unwrapAnyOptional_notNil() throws {
202+
let anyOptional: Any? = "is not nil"
203+
204+
let unwrapped = try XCTUnwrap(anyOptional)
205+
XCTAssertEqual(unwrapped as! String, anyOptional as! String)
206+
}
207+
208+
// CHECK: Test Case 'ErrorHandling.test_unwrapAnyOptional_nil' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
209+
// CHECK: .*[/\\]ErrorHandling[/\\]main.swift:[[@LINE+4]]: error: ErrorHandling.test_unwrapAnyOptional_nil : XCTUnwrap failed: expected non-nil value of type "Any" - Failure error message
210+
// CHECK: Test Case 'ErrorHandling.test_unwrapAnyOptional_nil' failed \(\d+\.\d+ seconds\)
211+
func test_unwrapAnyOptional_nil() throws {
212+
let anyOptional: Any? = nil
213+
_ = try XCTUnwrap(anyOptional, "Failure error message")
214+
215+
// Should not be reached:
216+
throw SomeError.shouldNotBeReached
217+
}
218+
219+
// CHECK: Test Case 'ErrorHandling.test_shouldReportFailureOnUnwrapFailure_catchUnwrapFailure' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
220+
// CHECK: .*[/\\]ErrorHandling[/\\]main.swift:[[@LINE+5]]: error: ErrorHandling.test_shouldReportFailureOnUnwrapFailure_catchUnwrapFailure : XCTUnwrap failed: expected non-nil value of type "String" -
221+
// CHECK: Test Case 'ErrorHandling.test_shouldReportFailureOnUnwrapFailure_catchUnwrapFailure' failed \(\d+\.\d+ seconds\)
222+
func test_shouldReportFailureOnUnwrapFailure_catchUnwrapFailure() {
223+
do {
224+
let optional: String? = nil
225+
_ = try XCTUnwrap(optional)
226+
} catch {}
227+
}
228+
229+
// CHECK: Test Case 'ErrorHandling.test_shouldReportFailureOnUnwrapFailure_catchExpressionFailure' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
230+
// CHECK: .*[/\\]ErrorHandling[/\\]main.swift:[[@LINE+4]]: error: ErrorHandling.test_shouldReportFailureOnUnwrapFailure_catchExpressionFailure : XCTUnwrap threw error "anError\("an error message"\)" -
231+
// CHECK: Test Case 'ErrorHandling.test_shouldReportFailureOnUnwrapFailure_catchExpressionFailure' failed \(\d+\.\d+ seconds\)
232+
func test_shouldReportFailureOnUnwrapFailure_catchExpressionFailure() {
233+
do {
234+
_ = try XCTUnwrap(functionShouldReturnOptionalButThrows())
235+
} catch {}
236+
}
237+
238+
struct CustomType {
239+
var name: String
240+
}
241+
242+
// CHECK: Test Case 'ErrorHandling.test_shouldReportCorrectTypeOnUnwrapFailure' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
243+
// CHECK: .*[/\\]ErrorHandling[/\\]main.swift:[[@LINE+4]]: error: ErrorHandling.test_shouldReportCorrectTypeOnUnwrapFailure : XCTUnwrap failed: expected non-nil value of type "CustomType" -
244+
// CHECK: Test Case 'ErrorHandling.test_shouldReportCorrectTypeOnUnwrapFailure' failed \(\d+\.\d+ seconds\)
245+
func test_shouldReportCorrectTypeOnUnwrapFailure() throws {
246+
let customTypeOptional: CustomType? = nil
247+
_ = try XCTUnwrap(customTypeOptional)
248+
249+
// Should not be reached:
250+
throw SomeError.shouldNotBeReached
251+
}
252+
253+
// CHECK: Test Case 'ErrorHandling.test_shouldReportCustomFileLineLocation' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
254+
// CHECK: custom_file.swift:1234: error: ErrorHandling.test_shouldReportCustomFileLineLocation : XCTUnwrap failed: expected non-nil value of type "CustomType" -
255+
// CHECK: Test Case 'ErrorHandling.test_shouldReportCustomFileLineLocation' failed \(\d+\.\d+ seconds\)
256+
func test_shouldReportCustomFileLineLocation() throws {
257+
let customTypeOptional: CustomType? = nil
258+
_ = try XCTUnwrap(customTypeOptional, file: "custom_file.swift", line: 1234)
259+
260+
// Should not be reached:
261+
throw SomeError.shouldNotBeReached
262+
}
263+
264+
// CHECK: Test Case 'ErrorHandling.test_shouldReportFailureNotOnMainThread' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
265+
// CHECK: .*[/\\]ErrorHandling[/\\]main.swift:[[@LINE+7]]: error: ErrorHandling.test_shouldReportFailureNotOnMainThread : XCTUnwrap failed: expected non-nil value of type "CustomType" -
266+
// CHECK: Test Case 'ErrorHandling.test_shouldReportFailureNotOnMainThread' failed \(\d+\.\d+ seconds\)
267+
func test_shouldReportFailureNotOnMainThread() throws {
268+
let queue = DispatchQueue(label: "Test")
269+
let semaphore = DispatchSemaphore(value: 0)
270+
queue.async {
271+
let customTypeOptional: CustomType? = nil
272+
_ = try? XCTUnwrap(customTypeOptional)
273+
semaphore.signal()
274+
}
275+
276+
semaphore.wait()
277+
}
124278
}
125279

126280
// CHECK: Test Suite 'ErrorHandling' failed at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
127-
// CHECK: \t Executed \d+ tests, with \d+ failures \(2 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
281+
// CHECK: \t Executed \d+ tests, with \d+ failures \(5 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
128282

129283
XCTMain([testCase(ErrorHandling.allTests)])
130284

131285
// CHECK: Test Suite '.*\.xctest' failed at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
132-
// CHECK: \t Executed \d+ tests, with \d+ failures \(2 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
286+
// CHECK: \t Executed \d+ tests, with \d+ failures \(5 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
133287
// CHECK: Test Suite 'All tests' failed at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
134-
// CHECK: \t Executed \d+ tests, with \d+ failures \(2 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
288+
// CHECK: \t Executed \d+ tests, with \d+ failures \(5 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds

XCTest.xcodeproj/project.pbxproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
AE63767E1D01ED17002C0EA8 /* TestListing.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE63767D1D01ED17002C0EA8 /* TestListing.swift */; };
3737
DA9D441B1D920A3500108768 /* XCTestCase+Asynchronous.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9D44161D920A3500108768 /* XCTestCase+Asynchronous.swift */; };
3838
DA9D441C1D920A3500108768 /* XCTestExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9D44171D920A3500108768 /* XCTestExpectation.swift */; };
39+
E1495C80224276A600CDEB7D /* IgnoredErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1495C7F224276A600CDEB7D /* IgnoredErrors.swift */; };
3940
/* End PBXBuildFile section */
4041

4142
/* Begin PBXContainerItemProxy section */
@@ -84,6 +85,7 @@
8485
DA7805F91C6704A2003C6636 /* SwiftFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftFoundation.framework; path = "../swift-corelibs-foundation/build/Debug/SwiftFoundation.framework"; sourceTree = "<group>"; };
8586
DA9D44161D920A3500108768 /* XCTestCase+Asynchronous.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Asynchronous.swift"; sourceTree = "<group>"; };
8687
DA9D44171D920A3500108768 /* XCTestExpectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestExpectation.swift; sourceTree = "<group>"; };
88+
E1495C7F224276A600CDEB7D /* IgnoredErrors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IgnoredErrors.swift; sourceTree = "<group>"; };
8789
EA3E74BB1BF2B6D500635A73 /* build_script.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = build_script.py; sourceTree = "<group>"; };
8890
/* End PBXFileReference section */
8991

@@ -123,6 +125,7 @@
123125
AE2FE0E81CFE86A5003EF0D7 /* Private */ = {
124126
isa = PBXGroup;
125127
children = (
128+
E1495C7F224276A600CDEB7D /* IgnoredErrors.swift */,
126129
AE2FE10C1CFE86E6003EF0D7 /* ArgumentParser.swift */,
127130
AE2FE10D1CFE86E6003EF0D7 /* ObjectWrapper.swift */,
128131
AE2FE10E1CFE86E6003EF0D7 /* PerformanceMeter.swift */,
@@ -296,6 +299,7 @@
296299
developmentRegion = en;
297300
hasScannedForEncodings = 0;
298301
knownRegions = (
302+
English,
299303
en,
300304
Base,
301305
);
@@ -326,6 +330,7 @@
326330
buildActionMask = 2147483647;
327331
files = (
328332
AE2FE1071CFE86DB003EF0D7 /* XCTestObservationCenter.swift in Sources */,
333+
E1495C80224276A600CDEB7D /* IgnoredErrors.swift in Sources */,
329334
DA9D441C1D920A3500108768 /* XCTestExpectation.swift in Sources */,
330335
AE2FE1011CFE86DB003EF0D7 /* XCTestCase+Performance.swift in Sources */,
331336
DA9D441B1D920A3500108768 /* XCTestCase+Asynchronous.swift in Sources */,

0 commit comments

Comments
 (0)