Skip to content

Commit bb658b4

Browse files
committed
[Test] Add testTry_cancel.
1 parent b1844f8 commit bb658b4

File tree

2 files changed

+69
-20
lines changed

2 files changed

+69
-20
lines changed

SwiftTask/SwiftTask.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,9 +350,9 @@ public class Task<Progress, Value, Error>: _Task<Error>
350350

351351
/// Returns new task that is retryable for `tryCount-1` times.
352352
/// `task.try(n)` is conceptually equal to `task.failure(clonedTask1).failure(clonedTask2)...` with n-1 failure-able.
353-
public func try(tryCount: Int) -> Task
353+
public func try(maxTryCount: Int) -> Task
354354
{
355-
if tryCount < 2 { return self }
355+
if maxTryCount < 2 { return self }
356356

357357
let weakified = self._weakified
358358
let initClosure = self._initClosure
@@ -361,7 +361,7 @@ public class Task<Progress, Value, Error>: _Task<Error>
361361

362362
var nextTask: Task = self
363363

364-
for i in 1...tryCount-1 {
364+
for i in 1...maxTryCount-1 {
365365
nextTask = nextTask.failure { _ -> Task in
366366
return Task(weakified: weakified, _initClosure: initClosure!) // create a clone-task when rejected
367367
}

SwiftTaskTests/SwiftTaskTests.swift

Lines changed: 66 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,7 @@ class SwiftTaskTests: _TestCase
920920
if !self.isAsync { return }
921921

922922
var expect = self.expectationWithDescription(__FUNCTION__)
923-
var tryCount = 3
923+
var maxTryCount = 3
924924
var actualTryCount = 0
925925

926926
Task<Float, String, ErrorString> { progress, fulfill, reject, configure in
@@ -929,17 +929,17 @@ class SwiftTaskTests: _TestCase
929929

930930
actualTryCount++
931931

932-
if actualTryCount < tryCount {
932+
if actualTryCount < maxTryCount {
933933
reject("ERROR \(actualTryCount)")
934934
}
935935
else {
936936
fulfill("OK")
937937
}
938938
}
939939

940-
}.try(tryCount).failure { errorInfo -> String in
940+
}.try(maxTryCount).failure { errorInfo -> String in
941941

942-
XCTFail("Should never reach here because `task.try(\(tryCount))` will be fulfilled on try[\(tryCount)] even though try[1...\(tryCount-1)] will be rejected.")
942+
XCTFail("Should never reach here because `task.try(\(maxTryCount))` will be fulfilled on try[\(maxTryCount)] even though try[1...\(maxTryCount-1)] will be rejected.")
943943

944944
return "DUMMY"
945945

@@ -959,7 +959,7 @@ class SwiftTaskTests: _TestCase
959959
if !self.isAsync { return }
960960

961961
var expect = self.expectationWithDescription(__FUNCTION__)
962-
var tryCount = 3
962+
var maxTryCount = 3
963963
var actualTryCount = 0
964964

965965
let t = Task<Float, String, ErrorString> { progress, fulfill, reject, configure in
@@ -969,7 +969,7 @@ class SwiftTaskTests: _TestCase
969969
reject("ERROR \(actualTryCount)")
970970
}
971971

972-
}.try(tryCount).failure { error, isCancelled -> String in
972+
}.try(maxTryCount).failure { error, isCancelled -> String in
973973

974974
XCTAssertEqual(error!, "ERROR \(actualTryCount)")
975975
XCTAssertFalse(isCancelled)
@@ -989,7 +989,7 @@ class SwiftTaskTests: _TestCase
989989
if !self.isAsync { return }
990990

991991
var expect = self.expectationWithDescription(__FUNCTION__)
992-
var tryCount = 3
992+
var maxTryCount = 3
993993
var actualTryCount = 0
994994
var progressCount = 0
995995

@@ -1001,21 +1001,21 @@ class SwiftTaskTests: _TestCase
10011001

10021002
actualTryCount++
10031003

1004-
if actualTryCount < tryCount {
1004+
if actualTryCount < maxTryCount {
10051005
reject("ERROR \(actualTryCount)")
10061006
}
10071007
else {
10081008
fulfill("OK")
10091009
}
10101010
}
10111011

1012-
}.try(tryCount).progress { _ in
1012+
}.try(maxTryCount).progress { _ in
10131013

10141014
progressCount++
10151015

1016-
// 1 <= progressCount <= tryCount
1016+
// 1 <= progressCount <= maxTryCount
10171017
XCTAssertGreaterThanOrEqual(progressCount, 1)
1018-
XCTAssertLessThanOrEqual(progressCount, tryCount)
1018+
XCTAssertLessThanOrEqual(progressCount, maxTryCount)
10191019

10201020
}.success { value -> Void in
10211021

@@ -1026,7 +1026,7 @@ class SwiftTaskTests: _TestCase
10261026

10271027
self.wait()
10281028

1029-
XCTAssertEqual(progressCount, tryCount)
1029+
XCTAssertEqual(progressCount, maxTryCount)
10301030
}
10311031

10321032
func testTry_pauseResume()
@@ -1035,7 +1035,7 @@ class SwiftTaskTests: _TestCase
10351035
if !self.isAsync { return }
10361036

10371037
var expect = self.expectationWithDescription(__FUNCTION__)
1038-
var tryCount = 5
1038+
var maxTryCount = 5
10391039
var actualTryCount = 0
10401040

10411041
let retryableTask = Task<Float, String, ErrorString> { progress, fulfill, reject, configure in
@@ -1051,7 +1051,7 @@ class SwiftTaskTests: _TestCase
10511051
NSThread.sleepForTimeInterval(0.1)
10521052
}
10531053
Async.main(after: 0.2) {
1054-
if actualTryCount < tryCount {
1054+
if actualTryCount < maxTryCount {
10551055
reject("ERROR \(actualTryCount)")
10561056
}
10571057
else {
@@ -1069,7 +1069,7 @@ class SwiftTaskTests: _TestCase
10691069
return
10701070
}
10711071

1072-
}.try(tryCount)
1072+
}.try(maxTryCount)
10731073

10741074
retryableTask.success { value -> Void in
10751075

@@ -1078,7 +1078,7 @@ class SwiftTaskTests: _TestCase
10781078

10791079
}
10801080

1081-
// pause `retryableTask` at some point
1081+
// pause `retryableTask` at some point before all tries completes
10821082
Async.main(after: 0.5) {
10831083
retryableTask.pause()
10841084
return
@@ -1091,7 +1091,56 @@ class SwiftTaskTests: _TestCase
10911091

10921092
self.wait(5) // wait a little longer
10931093

1094-
XCTAssertEqual(actualTryCount, tryCount)
1094+
XCTAssertEqual(actualTryCount, maxTryCount)
1095+
}
1096+
1097+
func testTry_cancel()
1098+
{
1099+
// NOTE: this is async test
1100+
if !self.isAsync { return }
1101+
1102+
var expect = self.expectationWithDescription(__FUNCTION__)
1103+
var maxTryCount = 3
1104+
var actualTryCount = 0
1105+
1106+
let retryableTask = Task<Float, String, ErrorString> { progress, fulfill, reject, configure in
1107+
1108+
Async.main(after: 0.1) {
1109+
1110+
actualTryCount++
1111+
1112+
if actualTryCount < maxTryCount {
1113+
reject("ERROR \(actualTryCount)")
1114+
}
1115+
else {
1116+
fulfill("OK")
1117+
}
1118+
}
1119+
1120+
return
1121+
1122+
}.try(maxTryCount)
1123+
1124+
retryableTask.success { value -> Void in
1125+
1126+
XCTFail("Should never reach here because `retryableTask` is cancelled.")
1127+
1128+
}.failure { errorInfo -> Void in
1129+
1130+
XCTAssertTrue(errorInfo.isCancelled)
1131+
expect.fulfill()
1132+
1133+
}
1134+
1135+
// cancel `retryableTask` at some point before all tries completes
1136+
Async.main(after: 0.2) {
1137+
retryableTask.cancel()
1138+
return
1139+
}
1140+
1141+
self.wait()
1142+
1143+
XCTAssertTrue(actualTryCount < maxTryCount, "`actualTryCount` should not reach `maxTryCount` because of cancellation.")
10951144
}
10961145

10971146
//--------------------------------------------------

0 commit comments

Comments
 (0)