Skip to content

Commit f623901

Browse files
authored
Task local to opt out of XCTModify exhaustivity. (#102)
1 parent e9d1284 commit f623901

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

Sources/CasePaths/XCTUnwrap.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ public func XCTModify<Root, Case>(
6767
return
6868
}
6969

70-
if let isEqual = _isEqual(before, value), isEqual {
70+
if
71+
XCTModifyLocals.isExhaustive,
72+
let isEqual = _isEqual(before, value),
73+
isEqual
74+
{
7175
XCTFail(
7276
"""
7377
XCTModify failed: expected "\(Case.self)" value to be modified but it was unchanged.
@@ -77,4 +81,8 @@ public func XCTModify<Root, Case>(
7781
root = casePath.embed(value)
7882
}
7983

84+
@_spi(Internals) public enum XCTModifyLocals {
85+
@TaskLocal public static var isExhaustive = true
86+
}
87+
8088
private struct UnwrappingCase: Error {}

Tests/CasePathsTests/XCTModifyTests.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#if DEBUG && (os(iOS) || os(macOS) || os(tvOS) || os(watchOS))
2-
import CasePaths
2+
@_spi(Internals) import CasePaths
33
import XCTest
44

55
final class XCTModifyTests: XCTestCase {
@@ -117,6 +117,17 @@
117117
}
118118
XCTAssertEqual(result, .success(2))
119119
}
120+
121+
func testXCTModifyFailUnchangedEquatable_NonExhaustive() throws {
122+
try XCTSkipIf(ProcessInfo.processInfo.environment["CI"] != nil)
123+
124+
var result = Result<Int, SomeError>.success(2)
125+
XCTModifyLocals.$isExhaustive.withValue(false) {
126+
XCTModify(&result, case: /Result.success) {
127+
_ = $0
128+
}}
129+
XCTAssertEqual(result, .success(2))
130+
}
120131
}
121132

122133
private struct SomeError: Error, Equatable {}

0 commit comments

Comments
 (0)