|
1 | 1 | #if canImport(Combine)
|
2 | 2 | import Combine
|
3 | 3 | import CombineSchedulers
|
| 4 | + import ConcurrencyExtras |
4 | 5 | import XCTest
|
5 | 6 |
|
6 | 7 | final class CombineSchedulerTests: XCTestCase {
|
7 |
| - var cancellables: Set<AnyCancellable> = [] |
8 |
| - |
9 | 8 | func testAdvance() {
|
| 9 | + var cancellables: Set<AnyCancellable> = [] |
| 10 | + |
10 | 11 | let scheduler = DispatchQueue.test
|
11 | 12 |
|
12 | 13 | var value: Int?
|
13 | 14 | Just(1)
|
14 | 15 | .delay(for: 1, scheduler: scheduler)
|
15 | 16 | .sink { value = $0 }
|
16 |
| - .store(in: &self.cancellables) |
| 17 | + .store(in: &cancellables) |
17 | 18 |
|
18 | 19 | XCTAssertEqual(value, nil)
|
19 | 20 |
|
|
35 | 36 | }
|
36 | 37 |
|
37 | 38 | func testAdvanceTo() {
|
| 39 | + var cancellables: Set<AnyCancellable> = [] |
| 40 | + |
38 | 41 | let scheduler = DispatchQueue.test
|
39 | 42 | let start = scheduler.now
|
40 | 43 |
|
41 | 44 | var value: Int?
|
42 | 45 | Just(1)
|
43 | 46 | .delay(for: 1, scheduler: scheduler)
|
44 | 47 | .sink { value = $0 }
|
45 |
| - .store(in: &self.cancellables) |
| 48 | + .store(in: &cancellables) |
46 | 49 |
|
47 | 50 | XCTAssertEqual(value, nil)
|
48 | 51 |
|
|
64 | 67 | }
|
65 | 68 |
|
66 | 69 | func testRunScheduler() {
|
| 70 | + var cancellables: Set<AnyCancellable> = [] |
| 71 | + |
67 | 72 | let scheduler = DispatchQueue.test
|
68 | 73 |
|
69 | 74 | var value: Int?
|
70 | 75 | Just(1)
|
71 | 76 | .delay(for: 1_000_000_000, scheduler: scheduler)
|
72 | 77 | .sink { value = $0 }
|
73 |
| - .store(in: &self.cancellables) |
| 78 | + .store(in: &cancellables) |
74 | 79 |
|
75 | 80 | XCTAssertEqual(value, nil)
|
76 | 81 |
|
|
84 | 89 | }
|
85 | 90 |
|
86 | 91 | func testDelay0Advance() {
|
| 92 | + var cancellables: Set<AnyCancellable> = [] |
| 93 | + |
87 | 94 | let scheduler = DispatchQueue.test
|
88 | 95 |
|
89 | 96 | var value: Int?
|
90 | 97 | Just(1)
|
91 | 98 | .delay(for: 0, scheduler: scheduler)
|
92 | 99 | .sink { value = $0 }
|
93 |
| - .store(in: &self.cancellables) |
| 100 | + .store(in: &cancellables) |
94 | 101 |
|
95 | 102 | XCTAssertEqual(value, nil)
|
96 | 103 |
|
|
100 | 107 | }
|
101 | 108 |
|
102 | 109 | func testSubscribeOnAdvance() {
|
| 110 | + var cancellables: Set<AnyCancellable> = [] |
| 111 | + |
103 | 112 | let scheduler = DispatchQueue.test
|
104 | 113 |
|
105 | 114 | var value: Int?
|
106 | 115 | Just(1)
|
107 | 116 | .subscribe(on: scheduler)
|
108 | 117 | .sink { value = $0 }
|
109 |
| - .store(in: &self.cancellables) |
| 118 | + .store(in: &cancellables) |
110 | 119 |
|
111 | 120 | XCTAssertEqual(value, nil)
|
112 | 121 |
|
|
116 | 125 | }
|
117 | 126 |
|
118 | 127 | func testReceiveOnAdvance() {
|
| 128 | + var cancellables: Set<AnyCancellable> = [] |
| 129 | + |
119 | 130 | let scheduler = DispatchQueue.test
|
120 | 131 |
|
121 | 132 | var value: Int?
|
122 | 133 | Just(1)
|
123 | 134 | .receive(on: scheduler)
|
124 | 135 | .sink { value = $0 }
|
125 |
| - .store(in: &self.cancellables) |
| 136 | + .store(in: &cancellables) |
126 | 137 |
|
127 | 138 | XCTAssertEqual(value, nil)
|
128 | 139 |
|
|
146 | 157 | }
|
147 | 158 |
|
148 | 159 | func testTwoIntervalOrdering() {
|
| 160 | + var cancellables: Set<AnyCancellable> = [] |
| 161 | + |
149 | 162 | let testScheduler = DispatchQueue.test
|
150 | 163 |
|
151 | 164 | var values: [Int] = []
|
152 | 165 |
|
153 | 166 | testScheduler.schedule(after: testScheduler.now, interval: 2) { values.append(1) }
|
154 |
| - .store(in: &self.cancellables) |
| 167 | + .store(in: &cancellables) |
155 | 168 |
|
156 | 169 | testScheduler.schedule(after: testScheduler.now, interval: 1) { values.append(42) }
|
157 |
| - .store(in: &self.cancellables) |
| 170 | + .store(in: &cancellables) |
158 | 171 |
|
159 | 172 | XCTAssertEqual(values, [])
|
160 | 173 | testScheduler.advance()
|
|
164 | 177 | }
|
165 | 178 |
|
166 | 179 | func testAdvanceToFarFuture() async {
|
167 |
| - let testScheduler = DispatchQueue.test |
168 |
| - |
169 |
| - var tickCount = 0 |
170 |
| - Publishers.Timer(every: .seconds(1), scheduler: testScheduler) |
171 |
| - .autoconnect() |
172 |
| - .sink { _ in tickCount += 1 } |
173 |
| - .store(in: &self.cancellables) |
174 |
| - |
175 |
| - XCTAssertEqual(tickCount, 0) |
176 |
| - await testScheduler.advance(by: .seconds(1)) |
177 |
| - XCTAssertEqual(tickCount, 1) |
178 |
| - await testScheduler.advance(by: .seconds(1)) |
179 |
| - XCTAssertEqual(tickCount, 2) |
180 |
| - await testScheduler.advance(by: .seconds(1_000)) |
181 |
| - XCTAssertEqual(tickCount, 1_002) |
| 180 | + await withMainSerialExecutor { |
| 181 | + var cancellables: Set<AnyCancellable> = [] |
| 182 | + |
| 183 | + let testScheduler = DispatchQueue.test |
| 184 | + |
| 185 | + var tickCount = 0 |
| 186 | + Publishers.Timer(every: .seconds(1), scheduler: testScheduler) |
| 187 | + .autoconnect() |
| 188 | + .sink { _ in tickCount += 1 } |
| 189 | + .store(in: &cancellables) |
| 190 | + |
| 191 | + XCTAssertEqual(tickCount, 0) |
| 192 | + await testScheduler.advance(by: .seconds(1)) |
| 193 | + XCTAssertEqual(tickCount, 1) |
| 194 | + await testScheduler.advance(by: .seconds(1)) |
| 195 | + XCTAssertEqual(tickCount, 2) |
| 196 | + await testScheduler.advance(by: .seconds(1_000)) |
| 197 | + XCTAssertEqual(tickCount, 1_002) |
| 198 | + } |
182 | 199 | }
|
183 | 200 |
|
184 | 201 | func testDelay0Advance_Async() async {
|
185 |
| - let scheduler = DispatchQueue.test |
| 202 | + await withMainSerialExecutor { |
| 203 | + var cancellables: Set<AnyCancellable> = [] |
186 | 204 |
|
187 |
| - var value: Int? |
188 |
| - Just(1) |
189 |
| - .delay(for: 0, scheduler: scheduler) |
190 |
| - .sink { value = $0 } |
191 |
| - .store(in: &self.cancellables) |
| 205 | + let scheduler = DispatchQueue.test |
192 | 206 |
|
193 |
| - XCTAssertEqual(value, nil) |
| 207 | + var value: Int? |
| 208 | + Just(1) |
| 209 | + .delay(for: 0, scheduler: scheduler) |
| 210 | + .sink { value = $0 } |
| 211 | + .store(in: &cancellables) |
194 | 212 |
|
195 |
| - await scheduler.advance() |
| 213 | + XCTAssertEqual(value, nil) |
196 | 214 |
|
197 |
| - XCTAssertEqual(value, 1) |
| 215 | + await scheduler.advance() |
| 216 | + |
| 217 | + XCTAssertEqual(value, 1) |
| 218 | + } |
198 | 219 | }
|
199 | 220 |
|
200 | 221 | func testAsyncSleep() async throws {
|
201 |
| - let testScheduler = DispatchQueue.test |
| 222 | + try await withMainSerialExecutor { |
| 223 | + let testScheduler = DispatchQueue.test |
202 | 224 |
|
203 |
| - let task = Task { |
204 |
| - try await testScheduler.sleep(for: .seconds(1)) |
205 |
| - } |
| 225 | + let task = Task { |
| 226 | + try await testScheduler.sleep(for: .seconds(1)) |
| 227 | + } |
206 | 228 |
|
207 |
| - await testScheduler.advance(by: .seconds(1)) |
208 |
| - try await task.value |
| 229 | + await testScheduler.advance(by: .seconds(1)) |
| 230 | + try await task.value |
| 231 | + } |
209 | 232 | }
|
210 | 233 |
|
211 | 234 | func testAsyncTimer() async throws {
|
212 |
| - let testScheduler = DispatchQueue.test |
213 |
| - |
214 |
| - let task = Task { |
215 |
| - await testScheduler.timer(interval: .seconds(1)) |
216 |
| - .prefix(10) |
217 |
| - .reduce(into: 0) { accum, _ in accum += 1 } |
| 235 | + await withMainSerialExecutor { |
| 236 | + let testScheduler = DispatchQueue.test |
| 237 | + |
| 238 | + let task = Task { |
| 239 | + await testScheduler.timer(interval: .seconds(1)) |
| 240 | + .prefix(10) |
| 241 | + .reduce(into: 0) { accum, _ in accum += 1 } |
| 242 | + } |
| 243 | + |
| 244 | + await testScheduler.advance(by: .seconds(10)) |
| 245 | + let count = await task.value |
| 246 | + XCTAssertEqual(count, 10) |
218 | 247 | }
|
219 |
| - |
220 |
| - await testScheduler.advance(by: .seconds(10)) |
221 |
| - let count = await task.value |
222 |
| - XCTAssertEqual(count, 10) |
223 | 248 | }
|
224 | 249 |
|
225 | 250 | func testAsyncRun() async throws {
|
226 |
| - let testScheduler = DispatchQueue.test |
227 |
| - |
228 |
| - let task = Task { |
229 |
| - await testScheduler.timer(interval: .seconds(1)) |
230 |
| - .prefix(10) |
231 |
| - .reduce(into: 0) { accum, _ in accum += 1 } |
| 251 | + await withMainSerialExecutor { |
| 252 | + let testScheduler = DispatchQueue.test |
| 253 | + |
| 254 | + let task = Task { |
| 255 | + await testScheduler.timer(interval: .seconds(1)) |
| 256 | + .prefix(10) |
| 257 | + .reduce(into: 0) { accum, _ in accum += 1 } |
| 258 | + } |
| 259 | + |
| 260 | + await testScheduler.run() |
| 261 | + let count = await task.value |
| 262 | + XCTAssertEqual(count, 10) |
232 | 263 | }
|
233 |
| - |
234 |
| - await testScheduler.run() |
235 |
| - let count = await task.value |
236 |
| - XCTAssertEqual(count, 10) |
237 | 264 | }
|
238 | 265 |
|
239 | 266 | func testNowIsAdvanced() {
|
|
0 commit comments