Skip to content

Commit dcb2498

Browse files
committed
Merge pull request #64 from ReactKit/Test/MultipleTasks
[Test] Add MultipleTasksTests
2 parents 85851ea + ead845a commit dcb2498

File tree

2 files changed

+142
-0
lines changed

2 files changed

+142
-0
lines changed

SwiftTask.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
1FD7197B1AFE387C00BC38C4 /* Cancellable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD7197A1AFE387C00BC38C4 /* Cancellable.swift */; };
2828
1FF52EB41A4C395A00B4BA28 /* _InterruptableTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF52EB31A4C395A00B4BA28 /* _InterruptableTask.swift */; };
2929
1FF52EB51A4C395A00B4BA28 /* _InterruptableTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF52EB31A4C395A00B4BA28 /* _InterruptableTask.swift */; };
30+
1FF95CB01CDD8F8D00899FEA /* MultipleTasksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF95CAF1CDD8F8D00899FEA /* MultipleTasksTests.swift */; };
31+
1FF95CB11CDD8F8D00899FEA /* MultipleTasksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF95CAF1CDD8F8D00899FEA /* MultipleTasksTests.swift */; };
3032
4822F0DC19D00B2300F5F572 /* _TestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F46DEFC199EE2C200F97868 /* _TestCase.swift */; };
3133
4822F0DD19D00B2300F5F572 /* BasicTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F20250119ADA8FD00DE0495 /* BasicTests.swift */; };
3234
4822F0DE19D00B2300F5F572 /* SwiftTaskTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F46DEE3199EDF1000F97868 /* SwiftTaskTests.swift */; };
@@ -76,6 +78,7 @@
7678
1FCF71151AD8CD38007079C2 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = ../Carthage/Checkouts/Alamofire/build/Debug/Alamofire.framework; sourceTree = "<group>"; };
7779
1FD7197A1AFE387C00BC38C4 /* Cancellable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cancellable.swift; sourceTree = "<group>"; };
7880
1FF52EB31A4C395A00B4BA28 /* _InterruptableTask.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = _InterruptableTask.swift; sourceTree = "<group>"; };
81+
1FF95CAF1CDD8F8D00899FEA /* MultipleTasksTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultipleTasksTests.swift; sourceTree = "<group>"; };
7982
1FFADCCF1C5CE950000B66BE /* Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Base.xcconfig; sourceTree = "<group>"; };
8083
1FFADCD01C5CE950000B66BE /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
8184
1FFADCD11C5CE950000B66BE /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
@@ -174,6 +177,7 @@
174177
1F218D5A1AFC3FFD00C849FF /* RemoveHandlerTests.swift */,
175178
1F5FA35619A374E600975FB9 /* AlamofireTests.swift */,
176179
1F29F6411B115EF500F476AF /* MultipleErrorTypesTests.swift */,
180+
1FF95CAF1CDD8F8D00899FEA /* MultipleTasksTests.swift */,
177181
1F46DEE1199EDF1000F97868 /* Supporting Files */,
178182
);
179183
path = SwiftTaskTests;
@@ -375,6 +379,7 @@
375379
1F20250219ADA8FD00DE0495 /* BasicTests.swift in Sources */,
376380
1FF52EB41A4C395A00B4BA28 /* _InterruptableTask.swift in Sources */,
377381
1F218D5B1AFC3FFD00C849FF /* RemoveHandlerTests.swift in Sources */,
382+
1FF95CB01CDD8F8D00899FEA /* MultipleTasksTests.swift in Sources */,
378383
1F6A8CA319A4E4F200369A5D /* SwiftTaskTests.swift in Sources */,
379384
1F29F6421B115EF500F476AF /* MultipleErrorTypesTests.swift in Sources */,
380385
1F4C76A41AD8CF40004E47C1 /* AlamofireTests.swift in Sources */,
@@ -391,6 +396,7 @@
391396
4822F0DE19D00B2300F5F572 /* SwiftTaskTests.swift in Sources */,
392397
4822F0DD19D00B2300F5F572 /* BasicTests.swift in Sources */,
393398
1F218D5C1AFC3FFD00C849FF /* RemoveHandlerTests.swift in Sources */,
399+
1FF95CB11CDD8F8D00899FEA /* MultipleTasksTests.swift in Sources */,
394400
1FF52EB51A4C395A00B4BA28 /* _InterruptableTask.swift in Sources */,
395401
1F29F6431B115EF500F476AF /* MultipleErrorTypesTests.swift in Sources */,
396402
1F4C76A51AD8CF41004E47C1 /* AlamofireTests.swift in Sources */,
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
//
2+
// MultipleTasksTests.swift
3+
// SwiftTask
4+
//
5+
// Created by Yasuhiro Inami on 2016-05-07.
6+
// Copyright © 2016 Yasuhiro Inami. All rights reserved.
7+
//
8+
9+
import SwiftTask
10+
import XCTest
11+
12+
/// Generic type for value/error to demonstrate multiple tasks working on different types.
13+
private enum MyEnum<T> { case Default }
14+
15+
private typealias Value1 = MyEnum<()>
16+
private typealias Error1 = MyEnum<Bool>
17+
private typealias Value2 = MyEnum<Float>
18+
private typealias Error2 = MyEnum<Double>
19+
private typealias Value3 = MyEnum<Int>
20+
private typealias Error3 = MyEnum<String>
21+
22+
/// Wrapped error type to unify `Error1`/`Error2`/`Error3`.
23+
private enum WrappedError
24+
{
25+
case ByTask1(Error1)
26+
case ByTask2(Error2)
27+
case ByTask3(Error3)
28+
29+
/// For external cancellation -> internal rejection conversion.
30+
case Cancelled
31+
}
32+
33+
class MultipleTasksTests: _TestCase
34+
{
35+
func testMultipleTasksTests_success1_success2_success3()
36+
{
37+
let expect = self.expectationWithDescription(#function)
38+
39+
var flow = [Int]()
40+
41+
let task1 = { Task<(), Value1, Error1>(value: .Default).on(success: { _ in flow.append(1) }) }
42+
let task2 = { Task<(), Value2, Error2>(value: .Default).on(success: { _ in flow.append(2) }) }
43+
let task3 = { Task<(), Value3, Error3>(value: .Default).on(success: { _ in flow.append(3) }) }
44+
45+
task1()._mapError(WrappedError.ByTask1)
46+
.success { _ in
47+
task2()._mapError(WrappedError.ByTask2)
48+
}
49+
.success { _ in
50+
task3()._mapError(WrappedError.ByTask3)
51+
}
52+
.on(success: { _ in
53+
XCTAssertEqual(flow, [1, 2, 3])
54+
expect.fulfill()
55+
})
56+
57+
self.wait()
58+
}
59+
60+
func testMultipleTasksTests_success1_success2_failure3()
61+
{
62+
let expect = self.expectationWithDescription(#function)
63+
64+
var flow = [Int]()
65+
66+
let task1 = { Task<(), Value1, Error1>(value: .Default).on(success: { _ in flow.append(1) }) }
67+
let task2 = { Task<(), Value2, Error2>(value: .Default).on(success: { _ in flow.append(2) }) }
68+
let task3 = { Task<(), Value3, Error3>(error: .Default).on(success: { _ in flow.append(3) }) }
69+
70+
task1()._mapError(WrappedError.ByTask1)
71+
.success { _ in
72+
task2()._mapError(WrappedError.ByTask2)
73+
}
74+
.success { _ in
75+
task3()._mapError(WrappedError.ByTask3)
76+
}
77+
.on(failure: { error, isCancelled in
78+
guard case let .Some(.ByTask3(error3)) = error else {
79+
XCTFail("Wrong WrappedError.")
80+
return
81+
}
82+
XCTAssertEqual(error3, Error3.Default)
83+
XCTAssertEqual(flow, [1, 2])
84+
expect.fulfill()
85+
})
86+
87+
self.wait()
88+
}
89+
90+
func testMultipleTasksTests_success1_failure2_success3()
91+
{
92+
let expect = self.expectationWithDescription(#function)
93+
94+
var flow = [Int]()
95+
96+
let task1 = { Task<(), Value1, Error1>(value: .Default).on(success: { _ in flow.append(1) }) }
97+
let task2 = { Task<(), Value2, Error2>(error: .Default).on(success: { _ in flow.append(2) }) }
98+
let task3 = { Task<(), Value3, Error3>(value: .Default).on(success: { _ in flow.append(3) }) }
99+
100+
task1()._mapError(WrappedError.ByTask1)
101+
.success { _ in
102+
task2()._mapError(WrappedError.ByTask2)
103+
}
104+
.success { _ in
105+
task3()._mapError(WrappedError.ByTask3)
106+
}
107+
.on(failure: { error, isCancelled in
108+
guard case let .Some(.ByTask2(error2)) = error else {
109+
XCTFail("Wrong WrappedError.")
110+
return
111+
}
112+
XCTAssertEqual(error2, Error2.Default)
113+
XCTAssertEqual(flow, [1])
114+
expect.fulfill()
115+
})
116+
117+
self.wait()
118+
}
119+
}
120+
121+
extension Task
122+
{
123+
/// Converts `Task<..., Error>` to `Task<..., WrappedError>`.
124+
private func _mapError(f: Error -> WrappedError) -> Task<Progress, Value, WrappedError>
125+
{
126+
return self.failure { error, isCancelled -> Task<Progress, Value, WrappedError> in
127+
if let error = error {
128+
return Task<Progress, Value, WrappedError>(error: f(error))
129+
}
130+
else {
131+
// converts external cancellation -> internal rejection
132+
return Task<Progress, Value, WrappedError>(error: .Cancelled)
133+
}
134+
}
135+
}
136+
}

0 commit comments

Comments
 (0)