@@ -89,9 +89,9 @@ final class ConcurrencyTests: XCTestCase {
8989 }
9090
9191 func testAsyncWithTimeoutMultipleResults( ) async throws {
92- // Test that we only get the first result (either success or timeout)
93- let results = await withTaskGroup ( of: Result< String, Error> . self ) { group in
94- var results : [ Result < String , Error > ] = [ ]
92+ // Validate each task returns a result or a timeout without assuming completion order.
93+ let results = await withTaskGroup ( of: ( Int , Result < String , Error > ) . self) { group in
94+ var results : [ ( Int , Result < String , Error > ) ] = [ ]
9595
9696 for i in 0 ..< 5 {
9797 group. addTask {
@@ -100,9 +100,9 @@ final class ConcurrencyTests: XCTestCase {
100100 try await Task . sleep ( nanoseconds: UInt64 ( i * 50_000_000 ) ) // 0, 0.05, 0.1, 0.15, 0.2 seconds
101101 return " Result \( i) "
102102 }
103- return . success( result)
103+ return ( i , . success( result) )
104104 } catch {
105- return . failure( error)
105+ return ( i , . failure( error) )
106106 }
107107 }
108108 }
@@ -114,8 +114,11 @@ final class ConcurrencyTests: XCTestCase {
114114 }
115115
116116 XCTAssertEqual( results. count, 5 )
117- // First few should succeed, later ones should timeout
118- for (index, result) in results. enumerated ( ) {
117+
118+ // Sort results by index to validate in deterministic order
119+ let sortedResults = results. sorted { $0. 0 < $1. 0 }
120+
121+ for ( index, result) in sortedResults {
119122 switch result {
120123 case . success( let value) :
121124 XCTAssertEqual ( value, " Result \( index) " )
@@ -183,18 +186,19 @@ final class ConcurrencyTests: XCTestCase {
183186
184187 func testAsyncWithDurationTiming( ) async throws {
185188 let durations : [ TimeInterval ] = [ 0.1 , 0.2 , 0.3 ]
186-
189+
187190 for duration in durations {
188191 let startTime = Date ( )
189-
192+
190193 _ = try await CC_asyncWithDuration ( seconds: duration) {
191194 // Very fast operation
192195 return " Done "
193196 }
194-
197+
195198 let elapsed = Date ( ) . timeIntervalSince ( startTime)
196- XCTAssertGreaterThanOrEqual ( elapsed, duration - 0.02 , " Duration \( duration) not respected " )
197- XCTAssertLessThan ( elapsed, duration + 0.05 , " Duration \( duration) too long " )
199+ // CI runners can have significant scheduling delays, use generous tolerances
200+ XCTAssertGreaterThanOrEqual ( elapsed, duration - 0.05 , " Duration \( duration) not respected " )
201+ XCTAssertLessThan ( elapsed, duration + 0.5 , " Duration \( duration) too long " )
198202 }
199203 }
200204
0 commit comments