Files
swift-mirror/test/Concurrency/Runtime/async_taskgroup_asynciterator_semantics.swift
Ben Barham c163e0fe5e [Tests] Make OS features consistent
lit.py currently allows any substring of `target_triple` to be used as a
feature in REQUIRES/UNSUPPORTED/XFAIL. This results in various forms of
the OS spread across the tests and is also somewhat confusing since they
aren't actually listed in the available features.

Modify all OS-related features to use the `OS=` version that Swift adds
instead. We can later remove `config.target_triple` so that these don't
the non-OS versions don't work in the first place.
2022-05-20 19:51:23 -07:00

159 lines
3.7 KiB
Swift

// RUN: %target-run-simple-swift( -Xfrontend -disable-availability-checking -parse-as-library) | %FileCheck %s --dump-input=always
// REQUIRES: executable_test
// REQUIRES: concurrency
// REQUIRES: concurrency_runtime
// UNSUPPORTED: back_deployment_runtime
// UNSUPPORTED: OS=linux-gnu
// REQUIRES: rdar86028226
struct Boom: Error {}
func boom() async throws -> Int {
throw Boom()
}
@available(SwiftStdlib 5.1, *)
func test_taskGroup_next() async {
let sum = await withThrowingTaskGroup(of: Int.self, returning: Int.self) { group in
for n in 1...10 {
group.spawn {
return n.isMultiple(of: 3) ? try await boom() : n
}
}
var sum = 0
var catches = 0
for _ in 1...5 {
do {
while let r = try await group.next() {
sum += r
print("add \(r) -> sum: \(sum)")
}
} catch {
catches += 1
print("catch: \(catches)")
}
}
// CHECK: catches with group.next(): 3
print("catches with group.next(): \(catches)")
return sum
}
// CHECK: result with group.next(): 37
print("result with group.next(): \(sum)")
}
@available(SwiftStdlib 5.1, *)
func test_taskGroup_for_in() async {
let sum = await withThrowingTaskGroup(of: Int.self, returning: Int.self) { group in
for n in 1...10 {
group.spawn {
return n.isMultiple(of: 3) ? try await boom() : n
}
}
var sum = 0
var catches = 0
for _ in 1...5 {
do {
for try await r in group {
sum += r
}
} catch {
catches += 1
}
}
// CHECK: catches with for-in: 3
print("catches with for-in: \(catches)")
return sum
}
// CHECK: result with for-in: 37
print("result with for-in: \(sum)")
}
@available(SwiftStdlib 5.1, *)
func test_taskGroup_asyncIterator() async {
let sum = await withThrowingTaskGroup(of: Int.self, returning: Int.self) { group in
for n in 1...10 {
group.spawn {
return n.isMultiple(of: 3) ? try await boom() : n
}
}
var sum = 0
var catches = 0
for _ in 1...5 {
var iterator = group.makeAsyncIterator()
do {
while let r = try await iterator.next() {
sum += r
}
if try! await iterator.next() != nil {
fatalError("Element returned from iterator after nil")
}
} catch {
catches += 1
if try! await iterator.next() != nil {
fatalError("Element returned from iterator after throw")
}
}
}
// CHECK: catches with for-in: 3
print("catches with for-in: \(catches)")
return sum
}
// CHECK: result with async iterator: 37
print("result with async iterator: \(sum)")
}
@available(SwiftStdlib 5.1, *)
func test_taskGroup_contains() async {
let sum = await withTaskGroup(of: Int.self, returning: Int.self) { group in
for n in 1...4 {
group.spawn {
return n
}
}
let three = await group.contains(3)
print("three = \(three)") // CHECK: three = true
for n in 5...7 {
group.spawn {
return n
}
}
let six = await group.contains(6)
print("six = \(six)") // CHECK: six = true
let sixAgain = await group.contains(6)
print("six again = \(sixAgain)") // CHECK: six again = false
return 0
}
// CHECK: result with async iterator: 0
print("result with async iterator: \(sum)")
}
@available(SwiftStdlib 5.1, *)
@main struct Main {
static func main() async {
await test_taskGroup_next()
await test_taskGroup_for_in()
await test_taskGroup_asyncIterator()
await test_taskGroup_contains()
}
}