@@ -30,8 +30,8 @@ class TaskProgressTests: CustomExecutorTestCase {
3030 ( " testThatMapProgressFinishes " , testThatMapProgressFinishes) ,
3131 ( " testThatAndThenProgressFinishes " , testThatAndThenProgressFinishes) ,
3232 ( " testThatChainingWithAThrownErrorFinishes " , testThatChainingWithAThrownErrorFinishes) ,
33- ( " testThatChainingAFutureIsWeightedEqually " , testThatChainingAFutureIsWeightedEqually ) ,
34- ( " testThatChainingATaskWithoutCustomProgressIsWeightedEqually " , testThatChainingATaskWithoutCustomProgressIsWeightedEqually ) ,
33+ ( " testThatChainingAFutureIsNotWeighted " , testThatChainingAFutureIsNotWeighted ) ,
34+ ( " testThatChainingATaskWithoutCustomProgressIsNotWeighted " , testThatChainingATaskWithoutCustomProgressIsNotWeighted ) ,
3535 ( " testThatChainingATaskWithCustomProgressIsWeighted " , testThatChainingATaskWithCustomProgressIsWeighted) ,
3636 ( " testThatChainingWithCustomProgressIsWeighted " , testThatChainingWithCustomProgressIsWeighted)
3737 ]
@@ -110,8 +110,6 @@ class TaskProgressTests: CustomExecutorTestCase {
110110 let deferred = Task< Int> . Promise( )
111111 let task = deferred. map ( upon: customQueue) { $0 * 2 }
112112
113- XCTAssertEqual ( task. progress. completedUnitCount, 0 )
114- XCTAssertEqual ( task. progress. totalUnitCount, 2 )
115113 XCTAssertEqual ( task. progress. fractionCompleted, 0 )
116114
117115 deferred. succeed ( with: 9000 )
@@ -142,8 +140,6 @@ class TaskProgressTests: CustomExecutorTestCase {
142140 let promise = Task< Int> . Promise( )
143141 let task = promise. andThen ( upon: customExecutor) { self . delaySuccessAsFuture ( $0 * 2 ) }
144142
145- XCTAssertEqual ( task. progress. completedUnitCount, 0 )
146- XCTAssertEqual ( task. progress. totalUnitCount, 2 )
147143 XCTAssertEqual ( task. progress. fractionCompleted, 0 )
148144
149145 promise. succeed ( with: 9000 )
@@ -153,17 +149,13 @@ class TaskProgressTests: CustomExecutorTestCase {
153149 expectationThatCustomExecutor ( isCalledAtLeast: 1 )
154150 ] , timeout: shortTimeout)
155151
156- XCTAssertEqual ( task. progress. completedUnitCount, 2 )
157- XCTAssertEqual ( task. progress. totalUnitCount, 2 )
158152 XCTAssertEqual ( task. progress. fractionCompleted, 1 )
159153 }
160154
161155 func testThatChainingWithAThrownErrorFinishes( ) {
162156 let promise = Task< Int> . Promise( )
163157 let task = promise. andThen ( upon: customExecutor) { _ throws -> Task < String > in throw TestError . first }
164158
165- XCTAssertEqual ( task. progress. completedUnitCount, 0 )
166- XCTAssertEqual ( task. progress. totalUnitCount, 2 )
167159 XCTAssertEqual ( task. progress. fractionCompleted, 0 )
168160
169161 promise. succeed ( with: 9000 )
@@ -173,52 +165,67 @@ class TaskProgressTests: CustomExecutorTestCase {
173165 expectationThatCustomExecutor ( isCalledAtLeast: 1 )
174166 ] , timeout: shortTimeout)
175167
176- XCTAssertEqual ( task. progress. completedUnitCount, 2 )
177- XCTAssertEqual ( task. progress. totalUnitCount, 2 )
178168 XCTAssertEqual ( task. progress. fractionCompleted, 1 )
179169 }
180170
181- func testThatChainingAFutureIsWeightedEqually( ) {
171+ private func expect( fractionIn range: ClosedRange < Double > , from progress: Progress ) -> XCTestExpectation {
172+ let expectation = XCTKVOExpectation ( keyPath: #keyPath( Progress . fractionCompleted) , object: progress, expectedValue: nil , options: . initial)
173+ expectation. handler = { ( object, changes) -> Bool in
174+ guard let progress = object as? Progress else { return false }
175+ return range. contains ( progress. fractionCompleted)
176+ }
177+ return expectation
178+ }
179+
180+ func testThatChainingAFutureIsNotWeighted( ) {
181+ customQueue. suspend ( )
182+
182183 let promise = Task< Int> . Promise( )
183184 let task = promise
184185 . andThen ( upon: . any( ) , start: { self . delaySuccessAsFuture ( $0 * 2 ) } )
185- . andThen ( upon: . any ( ) , start: { self . delaySuccessAsTask ( " \( $0) " ) } )
186- . map ( upon: . any ( ) , transform: { " \( $0) \( $0) " } )
186+ . andThen ( upon: customQueue , start: { self . delaySuccessAsTask ( " \( $0) " ) } )
187+ . map ( upon: customQueue , transform: { " \( $0) \( $0) " } )
187188
188- XCTAssertEqual ( task. progress. completedUnitCount, 0 )
189- XCTAssertEqual ( task. progress. totalUnitCount, 4 )
190189 XCTAssertEqual ( task. progress. fractionCompleted, 0 )
191190
192191 promise. succeed ( with: 9000 )
193192
193+ wait ( for: [
194+ expect ( fractionIn: 0.05 ... 0.25 , from: task. progress)
195+ ] , timeout: shortTimeout)
196+
197+ customQueue. resume ( )
198+
194199 wait ( for: [
195200 expectation ( toFinish: task. progress)
196201 ] , timeout: shortTimeout)
197202
198- XCTAssertEqual ( task. progress. completedUnitCount, 4 )
199- XCTAssertEqual ( task. progress. totalUnitCount, 4 )
200203 XCTAssertEqual ( task. progress. fractionCompleted, 1 )
201204 }
202205
203- func testThatChainingATaskWithoutCustomProgressIsWeightedEqually( ) {
206+ func testThatChainingATaskWithoutCustomProgressIsNotWeighted( ) {
207+ customQueue. suspend ( )
208+
204209 let promise = Task< Int> . Promise( )
205210 let task = Task ( promise)
206211 . andThen ( upon: . any( ) , start: { self . delaySuccessAsFuture ( $0 * 2 ) } )
207- . andThen ( upon: . any ( ) , start: { self . delaySuccessAsTask ( " \( $0) " ) } )
208- . map ( upon: . any ( ) , transform: { " \( $0) \( $0) " } )
212+ . andThen ( upon: customQueue , start: { self . delaySuccessAsTask ( " \( $0) " ) } )
213+ . map ( upon: customQueue , transform: { " \( $0) \( $0) " } )
209214
210- XCTAssertEqual ( task. progress. completedUnitCount, 0 )
211- XCTAssertEqual ( task. progress. totalUnitCount, 4 )
212215 XCTAssertEqual ( task. progress. fractionCompleted, 0 )
213216
214217 promise. succeed ( with: 9000 )
215218
219+ wait ( for: [
220+ expect ( fractionIn: 0.05 ... 0.25 , from: task. progress)
221+ ] , timeout: shortTimeout)
222+
223+ customQueue. resume ( )
224+
216225 wait ( for: [
217226 expectation ( toFinish: task. progress)
218227 ] , timeout: shortTimeout)
219228
220- XCTAssertEqual ( task. progress. completedUnitCount, 4 )
221- XCTAssertEqual ( task. progress. totalUnitCount, 4 )
222229 XCTAssertEqual ( task. progress. fractionCompleted, 1 )
223230 }
224231
@@ -232,48 +239,41 @@ class TaskProgressTests: CustomExecutorTestCase {
232239 . andThen ( upon: . any( ) , start: { self . delaySuccessAsTask ( " \( $0) " ) } )
233240 . map ( upon: . any( ) , transform: { " \( $0) \( $0) " } )
234241
235- XCTAssertEqual ( task. progress. completedUnitCount, 0 )
236- XCTAssertEqual ( task. progress. totalUnitCount, 103 )
237242 XCTAssertEqual ( task. progress. fractionCompleted, 0 )
238243
239244 customProgress. completedUnitCount = 5
240245
241- XCTAssertEqual ( task. progress. completedUnitCount, 100 )
242- XCTAssertEqual ( task. progress. totalUnitCount, 103 )
243- XCTAssertGreaterThanOrEqual ( task. progress. fractionCompleted, 0.96 )
246+ XCTAssertGreaterThanOrEqual ( task. progress. fractionCompleted, 0.5 )
244247
245248 promise. succeed ( with: 9000 )
246249
247250 wait ( for: [
248251 expectation ( toFinish: task. progress)
249252 ] , timeout: shortTimeout)
250253
251- XCTAssertEqual ( task. progress. completedUnitCount, 103 )
252- XCTAssertEqual ( task. progress. totalUnitCount, 103 )
253254 XCTAssertEqual ( task. progress. fractionCompleted, 1 )
254255 }
255256
256257 func testThatChainingWithCustomProgressIsWeighted( ) {
257- let promise1 = Task< Int> . Promise( )
258- let customQueue2 = DispatchQueue ( label: " \( type ( of: self ) ) . \( #function) " )
259- customQueue2. suspend ( )
258+ customQueue. suspend ( )
260259
260+ let promise1 = Task< Int> . Promise( )
261261 let task = promise1
262- . andThen ( upon: . any( ) , start: { ( value) -> Task < Int > in
262+ . andThen ( upon: . any( ) , start: { [ customQueue ] ( value) -> Task < Int > in
263263 let promise2 = Task< Int> . Promise( )
264264 let customProgress = Progress ( )
265265 customProgress. totalUnitCount = 87135
266266
267- customQueue2 . async {
267+ customQueue . async {
268268 customProgress. completedUnitCount = 10012
269269
270- customQueue2 . async {
270+ customQueue . async {
271271 customProgress. completedUnitCount = 54442
272272
273- customQueue2 . async {
273+ customQueue . async {
274274 customProgress. completedUnitCount = 67412
275275
276- customQueue2 . async {
276+ customQueue . async {
277277 customProgress. completedUnitCount = 87135
278278
279279 promise2. succeed ( with: value * 2 )
@@ -287,41 +287,31 @@ class TaskProgressTests: CustomExecutorTestCase {
287287 . map ( upon: . any( ) , transform: { " \( $0) " } )
288288 . map ( upon: . any( ) , transform: { " \( $0) \( $0) " } )
289289
290- XCTAssertEqual ( task. progress. completedUnitCount, 0 )
291- XCTAssertEqual ( task. progress. totalUnitCount, 4 )
292290 XCTAssertEqual ( task. progress. fractionCompleted, 0 )
293291
294292 promise1. succeed ( with: 9000 )
295293
296294 wait ( for: [
297- XCTKVOExpectation ( keyPath : #keyPath ( Progress . totalUnitCount ) , object : task . progress , expectedValue : 103 , options : . initial )
295+ expect ( fractionIn : 0.001 ... 0.05 , from : task . progress )
298296 ] , timeout: shortTimeout)
299297
300- XCTAssertEqual ( task. progress. completedUnitCount, 1 )
301- XCTAssertLessThanOrEqual ( task. progress. fractionCompleted, 0.01 )
302-
303- customQueue2. resume ( )
298+ customQueue. resume ( )
304299
305300 wait ( for: [
306301 expectation ( toFinish: task. progress)
307302 ] , timeout: shortTimeout)
308303
309- XCTAssertEqual ( task. progress. completedUnitCount, 103 )
310- XCTAssertEqual ( task. progress. totalUnitCount, 103 )
311304 XCTAssertEqual ( task. progress. fractionCompleted, 1 )
312305 }
313306
314307 func testThatMappingWithCustomProgressIsWeighted( ) {
315308 let promise1 = Task< Int> . Promise( )
316- let expect = expectation ( description: " map handler has started executing " )
317309
318310 let task = promise1
319311 . map ( upon: . any( ) , transform: { ( value) -> Int in
320312 XCTAssertNotNil ( Progress . current ( ) )
321313
322314 let customProgress = Progress ( totalUnitCount: 32 )
323- expect. fulfill ( )
324-
325315 customProgress. completedUnitCount = 1
326316 customProgress. completedUnitCount = 2
327317 customProgress. completedUnitCount = 4
@@ -334,22 +324,19 @@ class TaskProgressTests: CustomExecutorTestCase {
334324 . map ( upon: . any( ) , transform: { " \( $0) " } )
335325 . map ( upon: . any( ) , transform: { " \( $0) \( $0) " } )
336326
337- XCTAssertEqual ( task. progress. completedUnitCount, 0 )
338- XCTAssertEqual ( task. progress. totalUnitCount, 4 )
339327 XCTAssertEqual ( task. progress. fractionCompleted, 0 )
340328
341- promise1. succeed ( with: 9000 )
342-
343- wait ( for: [ expect ] , timeout: shortTimeout)
329+ let expectFractionCompletedToChange = XCTKVOExpectation ( keyPath: #keyPath( Progress . fractionCompleted) , object: task. progress)
330+ expectFractionCompletedToChange. expectedFulfillmentCount = 9
344331
345- XCTAssertEqual ( task . progress . totalUnitCount , 103 )
332+ promise1 . succeed ( with : 9000 )
346333
347334 wait ( for: [
335+ expectFractionCompletedToChange,
348336 expectation ( toFinish: task. progress)
349337 ] , timeout: longTimeout)
350338
351- XCTAssertEqual ( task. progress. completedUnitCount, 103 )
352- XCTAssertEqual ( task. progress. totalUnitCount, 103 )
339+ XCTAssertEqual ( task. progress. fractionCompleted, 1 )
353340 }
354341}
355342#endif
0 commit comments