Skip to content

Commit

Permalink
Make Optional generate nil as a placeholder (#43)
Browse files Browse the repository at this point in the history
* Make `_DefaultInitializable?` conform to `_DefaultInitializable`

* Make all `Optional` generate `nil` as placeholder
  • Loading branch information
tgrapperon authored Jul 30, 2023
1 parent 50843cb commit 3028917
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 42 deletions.
16 changes: 13 additions & 3 deletions Sources/XCTestDynamicOverlay/Internal/GeneratePlaceholder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@ private func _placeholder<Result>() -> Result? {
}
}

private protocol _OptionalProtocol { static var none: Self { get }}
extension Optional: _OptionalProtocol {}
private func _optionalPlaceholder<Result>() throws -> Result {
if let result = (Result.self as? any _OptionalProtocol.Type) {
return result.none as! Result
}
throw PlaceholderGenerationFailure()
}

private func _rawRepresentable<Result>() -> Result? {
func posiblePlaceholder<T: RawRepresentable>(for type: T.Type) -> T? {
(_placeholder() as T.RawValue?).flatMap(T.init(rawValue:))
Expand Down Expand Up @@ -140,7 +149,8 @@ extension Witness: AnyCaseIterable where Value: CaseIterable {

#endif

func _generatePlaceholder<Result>() -> Result? {
struct PlaceholderGenerationFailure: Error {}
func _generatePlaceholder<Result>() throws -> Result {
if let result = _placeholder() as Result? {
return result
}
Expand All @@ -152,6 +162,6 @@ func _generatePlaceholder<Result>() -> Result? {
if let result = _caseIterable() as Result? {
return result
}

return nil
return try _optionalPlaceholder()
}
104 changes: 65 additions & 39 deletions Sources/XCTestDynamicOverlay/Unimplemented.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@ public func unimplemented<Result>(
return {
let description = description()
_fail(description, nil, fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand All @@ -47,9 +49,11 @@ public func unimplemented<Result>(
) -> Result {
let description = description()
_fail(description, nil, fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}

public func unimplemented<A, Result>(
Expand All @@ -73,9 +77,11 @@ public func unimplemented<A, Result>(
return {
let description = description()
_fail(description, $0, fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand All @@ -100,9 +106,11 @@ public func unimplemented<A, B, Result>(
return {
let description = description()
_fail(description, ($0, $1), fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand All @@ -127,9 +135,11 @@ public func unimplemented<A, B, C, Result>(
return {
let description = description()
_fail(description, ($0, $1, $2), fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand All @@ -154,9 +164,11 @@ public func unimplemented<A, B, C, D, Result>(
return {
let description = description()
_fail(description, ($0, $1, $2, $3), fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand All @@ -181,9 +193,11 @@ public func unimplemented<A, B, C, D, E, Result>(
return {
let description = description()
_fail(description, ($0, $1, $2, $3, $4), fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand Down Expand Up @@ -284,9 +298,11 @@ public func unimplemented<Result>(
return {
let description = description()
_fail(description, nil, fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand Down Expand Up @@ -320,9 +336,11 @@ public func unimplemented<A, Result>(
return {
let description = description()
_fail(description, $0, fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand All @@ -347,9 +365,11 @@ public func unimplemented<A, B, Result>(
return {
let description = description()
_fail(description, ($0, $1), fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand All @@ -374,9 +394,11 @@ public func unimplemented<A, B, C, Result>(
return {
let description = description()
_fail(description, ($0, $1, $2), fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand All @@ -401,9 +423,11 @@ public func unimplemented<A, B, C, D, Result>(
return {
let description = description()
_fail(description, ($0, $1, $2, $3), fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand All @@ -428,9 +452,11 @@ public func unimplemented<A, B, C, D, E, Result>(
return {
let description = description()
_fail(description, ($0, $1, $2, $3, $4), fileID: fileID, line: line)
guard let placeholder: Result = _generatePlaceholder()
else { _unimplementedFatalError(description, file: file, line: line) }
return placeholder
do {
return try _generatePlaceholder()
} catch {
_unimplementedFatalError(description, file: file, line: line)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
let set: () -> Set<Int> = unimplemented("set")
XCTAssertEqual(XCTExpectFailure(failingBlock: set), Set<Int>())

let optionalInt: () -> Int? = unimplemented("optionalInt")
XCTAssertNil(XCTExpectFailure(failingBlock: optionalInt))

let stream: () -> AsyncStream<Int> = unimplemented("stream")
for await _ in XCTExpectFailure(failingBlock: stream) {
XCTFail("Stream should be finished")
Expand Down

0 comments on commit 3028917

Please sign in to comment.