Skip to content
This repository was archived by the owner on Aug 29, 2022. It is now read-only.

Commit 05ab6d1

Browse files
committed
Test task progress without hard-coding unit counts
1 parent 75894e0 commit 05ab6d1

File tree

1 file changed

+48
-61
lines changed

1 file changed

+48
-61
lines changed

Tests/TaskTests/TaskProgressTests.swift

Lines changed: 48 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)