-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
02_CancellationTests.swift
149 lines (119 loc) · 3.84 KB
/
02_CancellationTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import Foundation.NSURLError
import PromiseKit
import XCTest
class CancellationTests: XCTestCase {
func testCancellation() {
autoreleasepool {
let ex1 = expectation(description: "")
InjectedErrorUnhandler = { err in
XCTAssertTrue(err.isCancelledError);
XCTAssertTrue((err as? CancellableError)?.isCancelled ?? false);
ex1.fulfill()
}
after(seconds: 0).then { _ in
throw Error.cancel
}.then {
XCTFail()
}.catch { _ in
XCTFail()
}
}
waitForExpectations(timeout: 60)
}
func testThrowCancellableErrorThatIsNotCancelled() {
let expct = expectation(description: "")
after(seconds: 0).then {
throw Error.dummy
}.then {
XCTFail()
}.catch { _ in
expct.fulfill()
}
waitForExpectations(timeout: 1)
}
func testRecoverWithCancellation() {
autoreleasepool {
let ex1 = expectation(description: "")
let ex2 = expectation(description: "")
InjectedErrorUnhandler = { err in
XCTAssertTrue(err.isCancelledError);
ex2.fulfill()
}
after(seconds: 0).then { _ in
throw NSError(domain: PMKErrorDomain, code: PMKOperationCancelled, userInfo: nil)
}.recover(policy: .allErrors) { err -> Void in
ex1.fulfill()
XCTAssertTrue(err.isCancelledError)
throw err
}.then {
XCTFail()
}.catch { _ in
XCTFail()
}
}
waitForExpectations(timeout: 1)
}
func testCatchCancellation() {
let ex = expectation(description: "")
after(seconds: 0).then { _ in
throw NSError(domain: PMKErrorDomain, code: PMKOperationCancelled, userInfo: nil)
}.catch(policy: .allErrors) { err in
ex.fulfill()
}
waitForExpectations(timeout: 1)
}
func testFoundationBridging1() {
let ex = expectation(description: "")
InjectedErrorUnhandler = { err in
XCTAssertTrue(err.isCancelledError);
ex.fulfill()
}
Promise(value: ()).then {
throw NSError(domain: NSURLErrorDomain, code: URLError.cancelled.rawValue)
}.catch { _ in
XCTFail()
}
waitForExpectations(timeout: 1)
}
func testFoundationBridging2() {
let ex = expectation(description: "")
InjectedErrorUnhandler = { err in
XCTAssertTrue(err.isCancelledError);
ex.fulfill()
}
Promise(value: ()).then {
throw NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled, userInfo: [:])
}.catch { _ in
XCTFail()
}
waitForExpectations(timeout: 1)
}
func testBridging() {
let ex = expectation(description: "")
InjectedErrorUnhandler = { err in
XCTAssertTrue(err.isCancelledError);
ex.fulfill()
}
Promise(value: ()).then {
throw Error.cancel as NSError
}.catch { _ in
XCTFail()
}
waitForExpectations(timeout: 1)
// here we verify that Swift’s NSError bridging works as advertised
XCTAssertTrue(Error.cancel.isCancelled)
XCTAssertTrue(Error.cancel.isCancelledError)
XCTAssertTrue((Error.cancel as NSError).isCancelled)
XCTAssertTrue(((Error.cancel as NSError) as Swift.Error).isCancelledError)
}
}
private enum Error: CancellableError {
case dummy
case cancel
var isCancelled: Bool {
switch self {
case .dummy: return false
case .cancel: return true
}
}
}