Skip to content

Commit 3028917

Browse files
authored
Make Optional generate nil as a placeholder (#43)
* Make `_DefaultInitializable?` conform to `_DefaultInitializable` * Make all `Optional` generate `nil` as placeholder
1 parent 50843cb commit 3028917

File tree

3 files changed

+81
-42
lines changed

3 files changed

+81
-42
lines changed

Sources/XCTestDynamicOverlay/Internal/GeneratePlaceholder.swift

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ private func _placeholder<Result>() -> Result? {
2626
}
2727
}
2828

29+
private protocol _OptionalProtocol { static var none: Self { get }}
30+
extension Optional: _OptionalProtocol {}
31+
private func _optionalPlaceholder<Result>() throws -> Result {
32+
if let result = (Result.self as? any _OptionalProtocol.Type) {
33+
return result.none as! Result
34+
}
35+
throw PlaceholderGenerationFailure()
36+
}
37+
2938
private func _rawRepresentable<Result>() -> Result? {
3039
func posiblePlaceholder<T: RawRepresentable>(for type: T.Type) -> T? {
3140
(_placeholder() as T.RawValue?).flatMap(T.init(rawValue:))
@@ -140,7 +149,8 @@ extension Witness: AnyCaseIterable where Value: CaseIterable {
140149

141150
#endif
142151

143-
func _generatePlaceholder<Result>() -> Result? {
152+
struct PlaceholderGenerationFailure: Error {}
153+
func _generatePlaceholder<Result>() throws -> Result {
144154
if let result = _placeholder() as Result? {
145155
return result
146156
}
@@ -152,6 +162,6 @@ func _generatePlaceholder<Result>() -> Result? {
152162
if let result = _caseIterable() as Result? {
153163
return result
154164
}
155-
156-
return nil
165+
166+
return try _optionalPlaceholder()
157167
}

Sources/XCTestDynamicOverlay/Unimplemented.swift

Lines changed: 65 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ public func unimplemented<Result>(
2121
return {
2222
let description = description()
2323
_fail(description, nil, fileID: fileID, line: line)
24-
guard let placeholder: Result = _generatePlaceholder()
25-
else { _unimplementedFatalError(description, file: file, line: line) }
26-
return placeholder
24+
do {
25+
return try _generatePlaceholder()
26+
} catch {
27+
_unimplementedFatalError(description, file: file, line: line)
28+
}
2729
}
2830
}
2931

@@ -47,9 +49,11 @@ public func unimplemented<Result>(
4749
) -> Result {
4850
let description = description()
4951
_fail(description, nil, fileID: fileID, line: line)
50-
guard let placeholder: Result = _generatePlaceholder()
51-
else { _unimplementedFatalError(description, file: file, line: line) }
52-
return placeholder
52+
do {
53+
return try _generatePlaceholder()
54+
} catch {
55+
_unimplementedFatalError(description, file: file, line: line)
56+
}
5357
}
5458

5559
public func unimplemented<A, Result>(
@@ -73,9 +77,11 @@ public func unimplemented<A, Result>(
7377
return {
7478
let description = description()
7579
_fail(description, $0, fileID: fileID, line: line)
76-
guard let placeholder: Result = _generatePlaceholder()
77-
else { _unimplementedFatalError(description, file: file, line: line) }
78-
return placeholder
80+
do {
81+
return try _generatePlaceholder()
82+
} catch {
83+
_unimplementedFatalError(description, file: file, line: line)
84+
}
7985
}
8086
}
8187

@@ -100,9 +106,11 @@ public func unimplemented<A, B, Result>(
100106
return {
101107
let description = description()
102108
_fail(description, ($0, $1), fileID: fileID, line: line)
103-
guard let placeholder: Result = _generatePlaceholder()
104-
else { _unimplementedFatalError(description, file: file, line: line) }
105-
return placeholder
109+
do {
110+
return try _generatePlaceholder()
111+
} catch {
112+
_unimplementedFatalError(description, file: file, line: line)
113+
}
106114
}
107115
}
108116

@@ -127,9 +135,11 @@ public func unimplemented<A, B, C, Result>(
127135
return {
128136
let description = description()
129137
_fail(description, ($0, $1, $2), fileID: fileID, line: line)
130-
guard let placeholder: Result = _generatePlaceholder()
131-
else { _unimplementedFatalError(description, file: file, line: line) }
132-
return placeholder
138+
do {
139+
return try _generatePlaceholder()
140+
} catch {
141+
_unimplementedFatalError(description, file: file, line: line)
142+
}
133143
}
134144
}
135145

@@ -154,9 +164,11 @@ public func unimplemented<A, B, C, D, Result>(
154164
return {
155165
let description = description()
156166
_fail(description, ($0, $1, $2, $3), fileID: fileID, line: line)
157-
guard let placeholder: Result = _generatePlaceholder()
158-
else { _unimplementedFatalError(description, file: file, line: line) }
159-
return placeholder
167+
do {
168+
return try _generatePlaceholder()
169+
} catch {
170+
_unimplementedFatalError(description, file: file, line: line)
171+
}
160172
}
161173
}
162174

@@ -181,9 +193,11 @@ public func unimplemented<A, B, C, D, E, Result>(
181193
return {
182194
let description = description()
183195
_fail(description, ($0, $1, $2, $3, $4), fileID: fileID, line: line)
184-
guard let placeholder: Result = _generatePlaceholder()
185-
else { _unimplementedFatalError(description, file: file, line: line) }
186-
return placeholder
196+
do {
197+
return try _generatePlaceholder()
198+
} catch {
199+
_unimplementedFatalError(description, file: file, line: line)
200+
}
187201
}
188202
}
189203

@@ -284,9 +298,11 @@ public func unimplemented<Result>(
284298
return {
285299
let description = description()
286300
_fail(description, nil, fileID: fileID, line: line)
287-
guard let placeholder: Result = _generatePlaceholder()
288-
else { _unimplementedFatalError(description, file: file, line: line) }
289-
return placeholder
301+
do {
302+
return try _generatePlaceholder()
303+
} catch {
304+
_unimplementedFatalError(description, file: file, line: line)
305+
}
290306
}
291307
}
292308

@@ -320,9 +336,11 @@ public func unimplemented<A, Result>(
320336
return {
321337
let description = description()
322338
_fail(description, $0, fileID: fileID, line: line)
323-
guard let placeholder: Result = _generatePlaceholder()
324-
else { _unimplementedFatalError(description, file: file, line: line) }
325-
return placeholder
339+
do {
340+
return try _generatePlaceholder()
341+
} catch {
342+
_unimplementedFatalError(description, file: file, line: line)
343+
}
326344
}
327345
}
328346

@@ -347,9 +365,11 @@ public func unimplemented<A, B, Result>(
347365
return {
348366
let description = description()
349367
_fail(description, ($0, $1), fileID: fileID, line: line)
350-
guard let placeholder: Result = _generatePlaceholder()
351-
else { _unimplementedFatalError(description, file: file, line: line) }
352-
return placeholder
368+
do {
369+
return try _generatePlaceholder()
370+
} catch {
371+
_unimplementedFatalError(description, file: file, line: line)
372+
}
353373
}
354374
}
355375

@@ -374,9 +394,11 @@ public func unimplemented<A, B, C, Result>(
374394
return {
375395
let description = description()
376396
_fail(description, ($0, $1, $2), fileID: fileID, line: line)
377-
guard let placeholder: Result = _generatePlaceholder()
378-
else { _unimplementedFatalError(description, file: file, line: line) }
379-
return placeholder
397+
do {
398+
return try _generatePlaceholder()
399+
} catch {
400+
_unimplementedFatalError(description, file: file, line: line)
401+
}
380402
}
381403
}
382404

@@ -401,9 +423,11 @@ public func unimplemented<A, B, C, D, Result>(
401423
return {
402424
let description = description()
403425
_fail(description, ($0, $1, $2, $3), fileID: fileID, line: line)
404-
guard let placeholder: Result = _generatePlaceholder()
405-
else { _unimplementedFatalError(description, file: file, line: line) }
406-
return placeholder
426+
do {
427+
return try _generatePlaceholder()
428+
} catch {
429+
_unimplementedFatalError(description, file: file, line: line)
430+
}
407431
}
408432
}
409433

@@ -428,9 +452,11 @@ public func unimplemented<A, B, C, D, E, Result>(
428452
return {
429453
let description = description()
430454
_fail(description, ($0, $1, $2, $3, $4), fileID: fileID, line: line)
431-
guard let placeholder: Result = _generatePlaceholder()
432-
else { _unimplementedFatalError(description, file: file, line: line) }
433-
return placeholder
455+
do {
456+
return try _generatePlaceholder()
457+
} catch {
458+
_unimplementedFatalError(description, file: file, line: line)
459+
}
434460
}
435461
}
436462

Tests/XCTestDynamicOverlayTests/GeneratePlaceholderTests.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
let set: () -> Set<Int> = unimplemented("set")
2626
XCTAssertEqual(XCTExpectFailure(failingBlock: set), Set<Int>())
2727

28+
let optionalInt: () -> Int? = unimplemented("optionalInt")
29+
XCTAssertNil(XCTExpectFailure(failingBlock: optionalInt))
30+
2831
let stream: () -> AsyncStream<Int> = unimplemented("stream")
2932
for await _ in XCTExpectFailure(failingBlock: stream) {
3033
XCTFail("Stream should be finished")

0 commit comments

Comments
 (0)