Skip to content

Commit 090a410

Browse files
committed
[Test] Add _InterruptableTask.swift
1 parent e82a704 commit 090a410

File tree

3 files changed

+106
-92
lines changed

3 files changed

+106
-92
lines changed

SwiftTask.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
1F46DEFB199EDF8100F97868 /* SwiftTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F46DEFA199EDF8100F97868 /* SwiftTask.swift */; };
2020
1F46DEFD199EE2C200F97868 /* _TestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F46DEFC199EE2C200F97868 /* _TestCase.swift */; };
2121
1F6A8CA319A4E4F200369A5D /* SwiftTaskTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F46DEE3199EDF1000F97868 /* SwiftTaskTests.swift */; };
22+
1FF52EB41A4C395A00B4BA28 /* _InterruptableTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF52EB31A4C395A00B4BA28 /* _InterruptableTask.swift */; };
23+
1FF52EB51A4C395A00B4BA28 /* _InterruptableTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF52EB31A4C395A00B4BA28 /* _InterruptableTask.swift */; };
2224
4822F0DC19D00B2300F5F572 /* _TestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F46DEFC199EE2C200F97868 /* _TestCase.swift */; };
2325
4822F0DD19D00B2300F5F572 /* BasicTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F20250119ADA8FD00DE0495 /* BasicTests.swift */; };
2426
4822F0DE19D00B2300F5F572 /* SwiftTaskTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F46DEE3199EDF1000F97868 /* SwiftTaskTests.swift */; };
@@ -47,6 +49,7 @@
4749
1F46DEFC199EE2C200F97868 /* _TestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = _TestCase.swift; sourceTree = "<group>"; };
4850
1F5FA35619A374E600975FB9 /* AlamofireTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlamofireTests.swift; sourceTree = "<group>"; };
4951
1FA4631719A8D70A00DD8729 /* Alamofire.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alamofire.swift; sourceTree = "<group>"; };
52+
1FF52EB31A4C395A00B4BA28 /* _InterruptableTask.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = _InterruptableTask.swift; sourceTree = "<group>"; };
5053
4822F0D019D00ABF00F5F572 /* SwiftTask-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SwiftTask-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
5154
48511C5A19C17563002FE03C /* RetainCycleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RetainCycleTests.swift; sourceTree = "<group>"; };
5255
485C31F01A1D619A00040DA3 /* TypeInferenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TypeInferenceTests.swift; sourceTree = "<group>"; };
@@ -140,6 +143,7 @@
140143
1F46DEE0199EDF1000F97868 /* SwiftTaskTests */ = {
141144
isa = PBXGroup;
142145
children = (
146+
1FF52EB31A4C395A00B4BA28 /* _InterruptableTask.swift */,
143147
1F46DEFC199EE2C200F97868 /* _TestCase.swift */,
144148
1F20250119ADA8FD00DE0495 /* BasicTests.swift */,
145149
1F46DEE3199EDF1000F97868 /* SwiftTaskTests.swift */,
@@ -366,6 +370,7 @@
366370
files = (
367371
1F20250219ADA8FD00DE0495 /* BasicTests.swift in Sources */,
368372
1F0E284019C1DEA0005EF467 /* Async.swift in Sources */,
373+
1FF52EB41A4C395A00B4BA28 /* _InterruptableTask.swift in Sources */,
369374
1F2C0C1E1A32A19300CFBB47 /* Alamofire.swift in Sources */,
370375
1F6A8CA319A4E4F200369A5D /* SwiftTaskTests.swift in Sources */,
371376
1F2C0C1C1A32A15300CFBB47 /* AlamofireTests.swift in Sources */,
@@ -381,6 +386,7 @@
381386
files = (
382387
4822F0DE19D00B2300F5F572 /* SwiftTaskTests.swift in Sources */,
383388
4822F0DD19D00B2300F5F572 /* BasicTests.swift in Sources */,
389+
1FF52EB51A4C395A00B4BA28 /* _InterruptableTask.swift in Sources */,
384390
1F2C0C1F1A32A19300CFBB47 /* Alamofire.swift in Sources */,
385391
4822F0E319D00B3100F5F572 /* Async.swift in Sources */,
386392
1F2C0C1D1A32A15300CFBB47 /* AlamofireTests.swift in Sources */,

SwiftTaskTests/SwiftTaskTests.swift

Lines changed: 28 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -481,11 +481,11 @@ class SwiftTaskTests: _TestCase
481481
var expect = self.expectationWithDescription(__FUNCTION__)
482482
var progressCount = 0
483483

484-
let task = self._interruptableTask() // 1st async task (5 progresses)
484+
let task = _interruptableTask(progressCount: 5) // 1st async task (5 progresses)
485485

486486
// chain async-task with then
487487
let task3 = task.then { [weak self] _ -> _InterruptableTask in
488-
let task2 = self!._interruptableTask() // 2st async task (5 progresses)
488+
let task2 = _interruptableTask(progressCount: 7) // 2st async task (7 progresses)
489489
return task2
490490
}
491491

@@ -495,7 +495,7 @@ class SwiftTaskTests: _TestCase
495495
return
496496
}.success { value -> Void in
497497
XCTAssertEqual(value, "OK")
498-
XCTAssertEqual(progressCount, 5, "`task3` should receive progress only from `task2` but not from `task`.")
498+
XCTAssertEqual(progressCount, 7, "`task3` should receive progress only from `task2` but not from `task`.")
499499
expect.fulfill()
500500
}
501501

@@ -510,11 +510,11 @@ class SwiftTaskTests: _TestCase
510510
var expect = self.expectationWithDescription(__FUNCTION__)
511511
var progressCount = 0
512512

513-
let task = self._interruptableTask() // 1st async task (5 progresses)
513+
let task = _interruptableTask(progressCount: 5) // 1st async task (5 progresses)
514514

515515
// chain async-task with success
516516
let task3 = task.success { [weak self] _ -> _InterruptableTask in
517-
let task2 = self!._interruptableTask() // 2st async task (5 progresses)
517+
let task2 = _interruptableTask(progressCount: 7) // 2st async task (7 progresses)
518518
return task2
519519
}
520520

@@ -524,7 +524,7 @@ class SwiftTaskTests: _TestCase
524524
return
525525
}.success { value -> Void in
526526
XCTAssertEqual(value, "OK")
527-
XCTAssertEqual(progressCount, 5, "`task3` should receive progress only from `task2` but not from `task`.")
527+
XCTAssertEqual(progressCount, 7, "`task3` should receive progress only from `task2` but not from `task`.")
528528
expect.fulfill()
529529
}
530530

@@ -539,11 +539,11 @@ class SwiftTaskTests: _TestCase
539539
var expect = self.expectationWithDescription(__FUNCTION__)
540540
var progressCount = 0
541541

542-
let task = self._interruptableTask(.Rejected) // 1st async task (5 progresses -> rejected)
542+
let task = _interruptableTask(progressCount: 5, finalState: .Rejected) // 1st async task (5 progresses -> rejected)
543543

544544
// chain async-task with failure
545545
let task3 = task.failure { [weak self] _ -> _InterruptableTask in
546-
let task2 = self!._interruptableTask() // 2st async task (5 progresses)
546+
let task2 = _interruptableTask(progressCount: 7) // 2st async task (7 progresses)
547547
return task2
548548
}
549549

@@ -553,7 +553,7 @@ class SwiftTaskTests: _TestCase
553553
return
554554
}.success { value -> Void in
555555
XCTAssertEqual(value, "OK")
556-
XCTAssertEqual(progressCount, 5, "`task3` should receive progress only from `task2` but not from `task`.")
556+
XCTAssertEqual(progressCount, 7, "`task3` should receive progress only from `task2` but not from `task`.")
557557
expect.fulfill()
558558
}
559559

@@ -564,81 +564,17 @@ class SwiftTaskTests: _TestCase
564564
// MARK: - Cancel
565565
//--------------------------------------------------
566566

567-
typealias _InterruptableTask = Task<Float, String, ErrorString>
568-
569-
/// 1. 3 progresses at t=0.2
570-
/// 2. checks cancel & pause at t=0.4
571-
/// 3. add 2 progresses & fulfill with "OK" or reject with "ERROR" at t=0.4~ (if not paused)
572-
func _interruptableTask(_ finalState: TaskState = .Fulfilled) -> _InterruptableTask
573-
{
574-
return Task<Float, String, ErrorString> { progress, fulfill, reject, configure in
575-
576-
// NOTE: not a good flag, watch out for race condition!
577-
var isCancelled = false
578-
var isPaused = false
579-
580-
// 1st delay (t=0.2)
581-
Async.background(after: 0.2) {
582-
583-
Async.main { progress(0.0) }
584-
Async.main { progress(0.2) }
585-
Async.main { progress(0.5) }
586-
587-
// 2nd delay (t=0.4)
588-
Async.background(after: 0.2) {
589-
590-
// NOTE: no need to call reject() because it's already rejected (cancelled) internally
591-
if isCancelled { return }
592-
593-
while isPaused {
594-
println("pausing...")
595-
NSThread.sleepForTimeInterval(0.1)
596-
}
597-
598-
Async.main { progress(0.8) }
599-
Async.main { progress(1.0) }
600-
Async.main {
601-
if finalState == .Fulfilled {
602-
fulfill("OK")
603-
}
604-
else {
605-
reject("ERROR")
606-
}
607-
}
608-
}
609-
}
610-
611-
configure.pause = {
612-
isPaused = true;
613-
return
614-
}
615-
configure.resume = {
616-
isPaused = false;
617-
return
618-
}
619-
configure.cancel = {
620-
isCancelled = true;
621-
return
622-
}
623-
624-
}
625-
}
626-
627567
func testCancel()
628568
{
629569
var expect = self.expectationWithDescription(__FUNCTION__)
630570
var progressCount = 0
631571

632-
let task = self._interruptableTask()
572+
let task = _interruptableTask(progressCount: 5)
633573

634574
task.progress { oldProgress, newProgress in
635575

636576
progressCount++
637577

638-
// 0.0 <= progress <= 0.5 (not 1.0)
639-
XCTAssertTrue(newProgress >= 0)
640-
XCTAssertTrue(newProgress <= 0.5)
641-
642578
// 1 <= progressCount <= 3 (not 5)
643579
XCTAssertGreaterThanOrEqual(progressCount, 1)
644580
XCTAssertLessThanOrEqual(progressCount, 3, "progressCount should be stopped to 3 instead of 5 because of cancellation.")
@@ -652,7 +588,7 @@ class SwiftTaskTests: _TestCase
652588
XCTAssertEqual(error!, "I get bored.")
653589
XCTAssertTrue(isCancelled)
654590

655-
XCTAssertEqual(progressCount, 3, "progressCount should be stopped to 3 instead of 5 because of cancellation.")
591+
XCTAssertEqual(progressCount, 2, "progressCount should be stopped to 2 instead of 5 because of cancellation.")
656592

657593
expect.fulfill()
658594

@@ -674,13 +610,13 @@ class SwiftTaskTests: _TestCase
674610
{
675611
var expect = self.expectationWithDescription(__FUNCTION__)
676612

677-
let task1 = self._interruptableTask()
613+
let task1 = _interruptableTask(progressCount: 5)
678614

679615
var task2: _InterruptableTask? = nil
680616

681617
let task3 = task1.then { value, errorInfo -> _InterruptableTask in
682618

683-
task2 = self._interruptableTask()
619+
task2 = _interruptableTask(progressCount: 5)
684620
return task2!
685621

686622
}
@@ -722,7 +658,7 @@ class SwiftTaskTests: _TestCase
722658
var expect = self.expectationWithDescription(__FUNCTION__)
723659
var progressCount = 0
724660

725-
let task = self._interruptableTask()
661+
let task = _interruptableTask(progressCount: 5)
726662

727663
task.progress { _ in
728664

@@ -743,13 +679,13 @@ class SwiftTaskTests: _TestCase
743679
task.pause()
744680

745681
XCTAssertEqual(task.state, TaskState.Paused)
746-
XCTAssertTrue(task.progress? == 0.5)
682+
XCTAssertTrue(task.progress? == 2)
747683

748684
// resume after 0.3sec (t=0.6)
749685
Async.main(after: 0.3) {
750686

751687
XCTAssertEqual(task.state, TaskState.Paused)
752-
XCTAssertTrue(task.progress? == 0.5)
688+
XCTAssertTrue(task.progress? == 2)
753689

754690
task.resume()
755691
XCTAssertEqual(task.state, TaskState.Running)
@@ -767,12 +703,12 @@ class SwiftTaskTests: _TestCase
767703

768704
var expect = self.expectationWithDescription(__FUNCTION__)
769705

770-
let task = self._interruptableTask()
706+
let task = _interruptableTask(progressCount: 5)
771707
weak var innerTask: _InterruptableTask?
772708

773709
// chain async-task with then
774710
let task2 = task.then { [weak self] _ -> _InterruptableTask in
775-
innerTask = self!._interruptableTask()
711+
innerTask = _interruptableTask(progressCount: 5)
776712
return innerTask!
777713
}
778714

@@ -793,7 +729,7 @@ class SwiftTaskTests: _TestCase
793729
XCTAssertNil(task2.progress, "`task2.progress` should be nil because `innerTask.progress()` has not been invoked yet.")
794730

795731
XCTAssertEqual(task.state, TaskState.Paused, "Parent task should also be paused.")
796-
XCTAssertTrue(task.progress? == 0.5)
732+
XCTAssertTrue(task.progress? == 2)
797733

798734
// resume after 0.3sec (t=0.6)
799735
Async.main(after: 0.3) {
@@ -802,7 +738,7 @@ class SwiftTaskTests: _TestCase
802738
XCTAssertNil(task2.progress, "`task2.progress` should still be nil.")
803739

804740
XCTAssertEqual(task.state, TaskState.Paused, "Parent task should also be paused.")
805-
XCTAssertTrue(task.progress? == 0.5)
741+
XCTAssertTrue(task.progress? == 2)
806742

807743
task2.resume()
808744
XCTAssertEqual(task2.state, TaskState.Running)
@@ -821,12 +757,12 @@ class SwiftTaskTests: _TestCase
821757

822758
var expect = self.expectationWithDescription(__FUNCTION__)
823759

824-
let task = self._interruptableTask()
760+
let task = _interruptableTask(progressCount: 5)
825761
weak var innerTask: _InterruptableTask?
826762

827763
// chain async-task with success
828764
let task2 = task.success { [weak self] _ -> _InterruptableTask in
829-
innerTask = self!._interruptableTask()
765+
innerTask = _interruptableTask(progressCount: 5)
830766
return innerTask!
831767
}
832768

@@ -845,7 +781,7 @@ class SwiftTaskTests: _TestCase
845781
XCTAssertNil(task2.progress, "`task2.progress` should be nil because `innerTask.progress()` has not been invoked yet.")
846782

847783
XCTAssertEqual(task.state, TaskState.Paused, "Parent task should also be paused.")
848-
XCTAssertTrue(task.progress? == 0.5)
784+
XCTAssertTrue(task.progress? == 2)
849785

850786
// resume after 0.3sec (t=0.6)
851787
Async.main(after: 0.3) {
@@ -856,7 +792,7 @@ class SwiftTaskTests: _TestCase
856792
XCTAssertNil(task2.progress, "`task2.progress` should still be nil.")
857793

858794
XCTAssertEqual(task.state, TaskState.Paused, "Parent task should also be paused.")
859-
XCTAssertTrue(task.progress? == 0.5)
795+
XCTAssertTrue(task.progress? == 2)
860796

861797
task2.resume()
862798
XCTAssertEqual(task2.state, TaskState.Running)
@@ -875,12 +811,12 @@ class SwiftTaskTests: _TestCase
875811

876812
var expect = self.expectationWithDescription(__FUNCTION__)
877813

878-
let task = self._interruptableTask()
814+
let task = _interruptableTask(progressCount: 5)
879815
weak var innerTask: _InterruptableTask?
880816

881817
// chain async-task with failure
882818
let task2 = task.failure { [weak self] _ -> _InterruptableTask in
883-
innerTask = self!._interruptableTask()
819+
innerTask = _interruptableTask(progressCount: 5)
884820
return innerTask!
885821
}
886822

@@ -899,7 +835,7 @@ class SwiftTaskTests: _TestCase
899835
XCTAssertNil(task2.progress, "`task2.progress` should be nil because `innerTask.progress()` has not been invoked yet.")
900836

901837
XCTAssertEqual(task.state, TaskState.Paused, "Parent task should also be paused.")
902-
XCTAssertTrue(task.progress? == 0.5)
838+
XCTAssertTrue(task.progress? == 2)
903839

904840
// resume after 0.3sec (t=0.6)
905841
Async.main(after: 0.3) {
@@ -908,7 +844,7 @@ class SwiftTaskTests: _TestCase
908844
XCTAssertNil(task2.progress, "`task2.progress` should still be nil.")
909845

910846
XCTAssertEqual(task.state, TaskState.Paused, "Parent task should also be paused.")
911-
XCTAssertTrue(task.progress? == 0.5)
847+
XCTAssertTrue(task.progress? == 2)
912848

913849
task2.resume()
914850
XCTAssertEqual(task2.state, TaskState.Running)

0 commit comments

Comments
 (0)