mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Instead, use the `%target-swift-5.1-abi-triple` substitution to compile the tests for deployment to the minimum OS versions required for use of _Concurrency APIs.
86 lines
2.3 KiB
Swift
86 lines
2.3 KiB
Swift
// RUN: %target-run-simple-swift( -target %target-swift-5.1-abi-triple %import-libdispatch -parse-as-library)
|
|
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: concurrency
|
|
// REQUIRES: libdispatch
|
|
|
|
// rdar://76038845
|
|
// REQUIRES: concurrency_runtime
|
|
// UNSUPPORTED: back_deployment_runtime
|
|
|
|
import Dispatch
|
|
|
|
enum HomeworkError: Error, Equatable {
|
|
case dogAteIt(String)
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
func formGreeting(name: String) async -> String {
|
|
return "Hello \(name) from async world"
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
func testSimple(
|
|
name: String, dogName: String, shouldThrow: Bool, doSuspend: Bool
|
|
) async {
|
|
print("Testing name: \(name), dog: \(dogName), shouldThrow: \(shouldThrow) doSuspend: \(doSuspend)")
|
|
|
|
var completed = false
|
|
|
|
let taskHandle: Task.Handle<String, Error> = detach {
|
|
let greeting = await formGreeting(name: name)
|
|
|
|
// If the intent is to test suspending, wait a bit so the second task
|
|
// can complete.
|
|
if doSuspend {
|
|
print("- Future sleeping")
|
|
await Task.sleep(1_000_000_000)
|
|
}
|
|
|
|
if (shouldThrow) {
|
|
print("- Future throwing")
|
|
throw HomeworkError.dogAteIt(dogName + " the dog")
|
|
}
|
|
|
|
print("- Future returning normally")
|
|
return greeting + "!"
|
|
}
|
|
|
|
// If the intent is not to test suspending, wait a bit so the first task
|
|
// can complete.
|
|
if !doSuspend {
|
|
print("+ Reader sleeping")
|
|
await Task.sleep(1_000_000_000)
|
|
}
|
|
|
|
do {
|
|
print("+ Reader waiting for the result")
|
|
let result = try await taskHandle.get()
|
|
completed = true
|
|
print("+ Normal return: \(result)")
|
|
assert(result == "Hello \(name) from async world!")
|
|
} catch HomeworkError.dogAteIt(let badDog) {
|
|
completed = true
|
|
print("+ Error return: HomeworkError.dogAteIt(\(badDog))")
|
|
assert(badDog == dogName + " the dog")
|
|
} catch {
|
|
fatalError("Caught a different exception?")
|
|
}
|
|
|
|
assert(completed)
|
|
print("Finished test")
|
|
}
|
|
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
@main struct Main {
|
|
static func main() async {
|
|
await testSimple(name: "Ted", dogName: "Hazel", shouldThrow: false, doSuspend: false)
|
|
await testSimple(name: "Ted", dogName: "Hazel", shouldThrow: true, doSuspend: false)
|
|
await testSimple(name: "Ted", dogName: "Hazel", shouldThrow: false, doSuspend: true)
|
|
await testSimple(name: "Ted", dogName: "Hazel", shouldThrow: true, doSuspend: true)
|
|
|
|
print("Done")
|
|
}
|
|
}
|