@@ -31,7 +31,7 @@ final class TestShare: XCTestCase {
3131 var iterator = shared. makeAsyncIterator ( )
3232 gate1. open ( )
3333 await gate2. enter ( )
34- while let value = await iterator. next ( isolation : nil ) {
34+ while let value = await iterator. next ( ) {
3535 results. append ( value)
3636 }
3737 return results
@@ -42,7 +42,7 @@ final class TestShare: XCTestCase {
4242 var iterator = shared. makeAsyncIterator ( )
4343 gate2. open ( )
4444 await gate1. enter ( )
45- while let value = await iterator. next ( isolation : nil ) {
45+ while let value = await iterator. next ( ) {
4646 results. append ( value)
4747 }
4848 return results
@@ -94,13 +94,13 @@ final class TestShare: XCTestCase {
9494 gate1. open ( )
9595 await gate2. enter ( )
9696 // Consumer 1 reads first element
97- if let value = await iterator. next ( isolation : nil ) {
97+ if let value = await iterator. next ( ) {
9898 results1. withLock { $0. append ( value) }
9999 }
100100 // Delay to allow consumer 2 to get ahead
101101 try ? await Task . sleep ( nanoseconds: 10_000_000 )
102102 // Continue reading
103- while let value = await iterator. next ( isolation : nil ) {
103+ while let value = await iterator. next ( ) {
104104 results1. withLock { $0. append ( value) }
105105 }
106106 }
@@ -110,7 +110,7 @@ final class TestShare: XCTestCase {
110110 gate2. open ( )
111111 await gate1. enter ( )
112112 // Consumer 2 reads all elements quickly
113- while let value = await iterator. next ( isolation : nil ) {
113+ while let value = await iterator. next ( ) {
114114 results2. withLock { $0. append ( value) }
115115 }
116116 }
@@ -143,7 +143,7 @@ final class TestShare: XCTestCase {
143143 var iterator = shared. makeAsyncIterator ( )
144144 gate2. open ( )
145145 await gate1. enter ( )
146- while let value = await iterator. next ( isolation : nil ) {
146+ while let value = await iterator. next ( ) {
147147 results1. withLock { $0. append ( value) }
148148 // Add some delay to consumer 1
149149 try ? await Task . sleep ( nanoseconds: 1_000_000 )
@@ -154,7 +154,7 @@ final class TestShare: XCTestCase {
154154 var iterator = shared. makeAsyncIterator ( )
155155 gate1. open ( )
156156 await gate2. enter ( )
157- while let value = await iterator. next ( isolation : nil ) {
157+ while let value = await iterator. next ( ) {
158158 results2. withLock { $0. append ( value) }
159159 }
160160 }
@@ -179,7 +179,7 @@ final class TestShare: XCTestCase {
179179 var iterator = shared. makeAsyncIterator ( )
180180 gate2. open ( )
181181 await gate1. enter ( )
182- while let value = await iterator. next ( isolation : nil ) {
182+ while let value = await iterator. next ( ) {
183183 fastResults. withLock { $0. append ( value) }
184184 }
185185 }
@@ -189,13 +189,13 @@ final class TestShare: XCTestCase {
189189 gate1. open ( )
190190 await gate2. enter ( )
191191 // Read first element immediately
192- if let value = await iterator. next ( isolation : nil ) {
192+ if let value = await iterator. next ( ) {
193193 slowResults. withLock { $0. append ( value) }
194194 }
195195 // Add significant delay to let buffer fill up and potentially overflow
196196 try ? await Task . sleep ( nanoseconds: 50_000_000 )
197197 // Continue reading remaining elements
198- while let value = await iterator. next ( isolation : nil ) {
198+ while let value = await iterator. next ( ) {
199199 slowResults. withLock { $0. append ( value) }
200200 }
201201 }
@@ -251,7 +251,7 @@ final class TestShare: XCTestCase {
251251 var iterator = shared. makeAsyncIterator ( )
252252 gate2. open ( )
253253 await gate1. enter ( )
254- while let value = await iterator. next ( isolation : nil ) {
254+ while let value = await iterator. next ( ) {
255255 fastResults. withLock { $0. append ( value) }
256256 }
257257 }
@@ -261,13 +261,13 @@ final class TestShare: XCTestCase {
261261 gate1. open ( )
262262 await gate2. enter ( )
263263 // Read first element immediately
264- if let value = await iterator. next ( isolation : nil ) {
264+ if let value = await iterator. next ( ) {
265265 slowResults. withLock { $0. append ( value) }
266266 }
267267 // Add significant delay to let buffer fill up and potentially overflow
268268 try ? await Task . sleep ( nanoseconds: 50_000_000 )
269269 // Continue reading remaining elements
270- while let value = await iterator. next ( isolation : nil ) {
270+ while let value = await iterator. next ( ) {
271271 slowResults. withLock { $0. append ( value) }
272272 }
273273 }
@@ -397,11 +397,11 @@ final class TestShare: XCTestCase {
397397
398398 let task = Task {
399399 var iterator = shared. makeAsyncIterator ( )
400- if await iterator. next ( isolation : nil ) != nil {
400+ if await iterator. next ( ) != nil {
401401 iterated. fulfill ( )
402402 }
403403 // Task will be cancelled here, so iteration should stop
404- while await iterator. next ( isolation : nil ) != nil {
404+ while await iterator. next ( ) != nil {
405405 // Continue iterating until cancelled
406406 }
407407 finished. fulfill ( )
@@ -480,7 +480,7 @@ final class TestShare: XCTestCase {
480480 // Start early consumer
481481 let earlyConsumer = Task {
482482 var iterator = shared. makeAsyncIterator ( )
483- while let value = await iterator. next ( isolation : nil ) {
483+ while let value = await iterator. next ( ) {
484484 earlyResults. withLock { $0. append ( value) }
485485 }
486486 }
@@ -495,7 +495,7 @@ final class TestShare: XCTestCase {
495495 // Start late consumer
496496 let lateConsumer = Task {
497497 var iterator = shared. makeAsyncIterator ( )
498- while let value = await iterator. next ( isolation : nil ) {
498+ while let value = await iterator. next ( ) {
499499 lateResults. withLock { $0. append ( value) }
500500 }
501501 }
@@ -522,11 +522,11 @@ final class TestShare: XCTestCase {
522522 var iterator2 = shared. makeAsyncIterator ( )
523523
524524 // Both iterators should independently get the same elements
525- let value1a = await iterator1. next ( isolation : nil )
526- let value2a = await iterator2. next ( isolation : nil )
525+ let value1a = await iterator1. next ( )
526+ let value2a = await iterator2. next ( )
527527
528- let value1b = await iterator1. next ( isolation : nil )
529- let value2b = await iterator2. next ( isolation : nil )
528+ let value1b = await iterator1. next ( )
529+ let value2b = await iterator2. next ( )
530530
531531 XCTAssertEqual ( value1a, 1 )
532532 XCTAssertEqual ( value2a, 1 )
@@ -549,7 +549,7 @@ final class TestShare: XCTestCase {
549549
550550 // Create a new iterator after the sequence finished
551551 var newIterator = shared. makeAsyncIterator ( )
552- let value = await newIterator. next ( isolation : nil )
552+ let value = await newIterator. next ( )
553553 XCTAssertNil ( value) // Should return nil since source is exhausted
554554 }
555555
@@ -572,6 +572,37 @@ final class TestShare: XCTestCase {
572572 XCTAssertEqual ( results1, [ 1 , 2 , 3 , 4 , 5 ] )
573573 XCTAssertEqual ( results2, [ ] ) // Should be empty since source is exhausted
574574 }
575+
576+ @available ( AsyncAlgorithms 1 . 1 , * )
577+ func test_share_rethrows_failure_type_on_backported( ) async {
578+ let shared = AsyncThrowingStream < Void , Error > {
579+ $0. finish ( throwing: TestError . failure)
580+ } . share ( )
581+ do {
582+ for try await _ in shared {
583+ XCTFail ( " Expected to not get here " )
584+ }
585+ } catch {
586+ XCTAssertEqual ( error as? TestError , . failure)
587+ }
588+ }
589+
590+ func test_share_rethrows_failure_type_without_falling_back_to_any_error( ) async {
591+ if #available( AsyncAlgorithms 1 . 2 , * ) {
592+ // Ensure - at compile time - that error is effectively a TestError
593+ let shared : some AsyncSequence < Void , TestError > = AlwaysFailingSequence ( ) . share ( )
594+ do {
595+ for try await _ in shared {
596+ XCTFail ( " Expected to not get here " )
597+ }
598+ } catch {
599+
600+ XCTAssertEqual ( error, TestError . failure)
601+ }
602+ } else {
603+ // not available
604+ }
605+ }
575606}
576607
577608// MARK: - Helper Types
@@ -580,4 +611,21 @@ private enum TestError: Error, Equatable {
580611 case failure
581612}
582613
614+ @available ( AsyncAlgorithms 1 . 2 , * )
615+ /// A sequence used to properly test concrete error on 1.2
616+ private struct AlwaysFailingSequence : AsyncSequence , Sendable {
617+ init ( ) { }
618+
619+ func makeAsyncIterator( ) -> AsyncIterator { AsyncIterator ( ) }
620+
621+ struct AsyncIterator : AsyncIteratorProtocol , Sendable {
622+
623+ func next( ) async throws ( TestError) -> Void ? {
624+ throw TestError . failure
625+ }
626+ mutating func next( completion: @escaping ( Result < Element ? , TestError > ) -> Void ) async throws ( TestError) -> Element ? {
627+ throw TestError . failure
628+ }
629+ }
630+ }
583631#endif
0 commit comments