Skip to content

Commit

Permalink
Merge branch 'main' into xct-expect-failure
Browse files Browse the repository at this point in the history
  • Loading branch information
stephencelis authored Jan 23, 2024
2 parents 6cf2de8 + 104326b commit 4069009
Show file tree
Hide file tree
Showing 8 changed files with 222 additions and 158 deletions.
32 changes: 28 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,40 @@ jobs:
run: make test-linux

wasm:
name: SwiftWASM
name: Wasm
runs-on: ubuntu-latest
strategy:
matrix:
include:
- { toolchain: wasm-5.6.0-RELEASE }
- { toolchain: wasm-5.7.1-RELEASE }

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- run: echo "${{ matrix.toolchain }}" > .swift-version
- uses: swiftwasm/swiftwasm-action@v5.6
- uses: swiftwasm/swiftwasm-action@v5.7
with:
shell-action: swift build

windows:
name: Windows
strategy:
matrix:
os: [windows-latest]
config: ['debug', 'release']
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- uses: compnerd/gha-setup-swift@main
with:
branch: swift-5.8.1-release
tag: 5.8.1-RELEASE
- uses: actions/checkout@v3
- name: Build
run: swift build -c ${{ matrix.config }}
- name: Run tests (debug only)
# There is an issue that exists in the 5.8.1 toolchain
# which fails on release configuration testing, but
# this issue is fixed 5.9 so we can remove the if once
# that is generally available.
if: ${{ matrix.config == 'debug' }}
run: swift test
4 changes: 2 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:5.5
// swift-tools-version:5.7

import PackageDescription

Expand All @@ -22,7 +22,7 @@ let package = Package(
]
)

#if swift(>=5.6)
#if !os(Windows)
// Add the documentation compiler plugin if possible
package.dependencies.append(
.package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0")
Expand Down
108 changes: 11 additions & 97 deletions Sources/XCTestDynamicOverlay/Internal/GeneratePlaceholder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,14 @@ extension ExpressibleByIntegerLiteral { fileprivate static var placeholder: Self
extension ExpressibleByUnicodeScalarLiteral { fileprivate static var placeholder: Self { " " } }
extension RangeReplaceableCollection { fileprivate static var placeholder: Self { Self() } }

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

private func _placeholder<Result>() -> Result? {
switch Result.self {
Expand Down Expand Up @@ -46,101 +53,8 @@ private func _caseIterable<Result>() -> Result? {
}
}

#else

private func _placeholder<Result>() -> Result? {
if let result = (Result.self as? _DefaultInitializable.Type)?.placeholder {
return result as? Result
}

if Result.self == Void.self {
return () as? Result
}

switch Witness<Result>.self {
case let type as AnyRangeReplaceableCollection.Type: return type.placeholder as? Result
case let type as AnyAdditiveArithmetic.Type: return type.placeholder as? Result
case let type as AnyExpressibleByArrayLiteral.Type: return type.placeholder as? Result
case let type as AnyExpressibleByBooleanLiteral.Type: return type.placeholder as? Result
case let type as AnyExpressibleByDictionaryLiteral.Type: return type.placeholder as? Result
case let type as AnyExpressibleByFloatLiteral.Type: return type.placeholder as? Result
case let type as AnyExpressibleByIntegerLiteral.Type: return type.placeholder as? Result
case let type as AnyExpressibleByUnicodeScalarLiteral.Type: return type.placeholder as? Result
default: return nil
}
}

private func _rawRepresentable<Result>() -> Result? {
(Witness<Result>.self as? AnyRawRepresentable.Type).flatMap {
$0.possiblePlaceholder as? Result
}
}

private func _caseIterable<Result>() -> Result? {
(Witness<Result>.self as? AnyCaseIterable.Type).flatMap {
$0.firstCase as? Result
}
}

private enum Witness<Value> {}
private protocol AnyAdditiveArithmetic { static var placeholder: Any { get } }
extension Witness: AnyAdditiveArithmetic where Value: AdditiveArithmetic {
fileprivate static var placeholder: Any { Value.placeholder }
}

private protocol AnyExpressibleByArrayLiteral { static var placeholder: Any { get } }
extension Witness: AnyExpressibleByArrayLiteral where Value: ExpressibleByArrayLiteral {
fileprivate static var placeholder: Any { Value.placeholder }
}

private protocol AnyExpressibleByBooleanLiteral { static var placeholder: Any { get } }
extension Witness: AnyExpressibleByBooleanLiteral where Value: ExpressibleByBooleanLiteral {
fileprivate static var placeholder: Any { Value.placeholder }
}

private protocol AnyExpressibleByDictionaryLiteral { static var placeholder: Any { get } }
extension Witness: AnyExpressibleByDictionaryLiteral where Value: ExpressibleByDictionaryLiteral {
fileprivate static var placeholder: Any { Value.placeholder }
}

private protocol AnyExpressibleByFloatLiteral { static var placeholder: Any { get } }
extension Witness: AnyExpressibleByFloatLiteral where Value: ExpressibleByFloatLiteral {
fileprivate static var placeholder: Any { Value.placeholder }
}

private protocol AnyExpressibleByIntegerLiteral { static var placeholder: Any { get } }
extension Witness: AnyExpressibleByIntegerLiteral where Value: ExpressibleByIntegerLiteral {
fileprivate static var placeholder: Any { Value.placeholder }
}

private protocol AnyExpressibleByUnicodeScalarLiteral { static var placeholder: Any { get } }
extension Witness: AnyExpressibleByUnicodeScalarLiteral
where Value: ExpressibleByUnicodeScalarLiteral {
fileprivate static var placeholder: Any { Value.placeholder }
}

private protocol AnyRangeReplaceableCollection { static var placeholder: Any { get } }
extension Witness: AnyRangeReplaceableCollection where Value: RangeReplaceableCollection {
fileprivate static var placeholder: Any { Value.placeholder }
}

private protocol AnyRawRepresentable { static var possiblePlaceholder: Any? { get } }
extension Witness: AnyRawRepresentable where Value: RawRepresentable {
fileprivate static var possiblePlaceholder: Any? {
(_placeholder() as Value.RawValue?).flatMap(Value.init(rawValue:))
}
}

private protocol AnyCaseIterable { static var firstCase: Any? { get } }
extension Witness: AnyCaseIterable where Value: CaseIterable {
fileprivate static var firstCase: Any? {
Value.allCases.first
}
}

#endif

func _generatePlaceholder<Result>() -> Result? {
struct PlaceholderGenerationFailure: Error {}
func _generatePlaceholder<Result>() throws -> Result {
if let result = _placeholder() as Result? {
return result
}
Expand All @@ -153,5 +67,5 @@ func _generatePlaceholder<Result>() -> 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
Loading

0 comments on commit 4069009

Please sign in to comment.