@@ -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