libuv 2.0.12 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/README.md +67 -34
  4. data/lib/libuv.rb +30 -5
  5. data/lib/libuv/async.rb +16 -10
  6. data/lib/libuv/check.rb +19 -12
  7. data/lib/libuv/coroutines.rb +39 -12
  8. data/lib/libuv/dns.rb +25 -18
  9. data/lib/libuv/error.rb +2 -0
  10. data/lib/libuv/ext/ext.rb +28 -36
  11. data/lib/libuv/ext/platform/darwin_x64.rb +2 -0
  12. data/lib/libuv/ext/platform/unix.rb +2 -0
  13. data/lib/libuv/ext/platform/windows.rb +2 -0
  14. data/lib/libuv/ext/tasks.rb +2 -0
  15. data/lib/libuv/ext/tasks/mac.rb +2 -0
  16. data/lib/libuv/ext/tasks/unix.rb +2 -0
  17. data/lib/libuv/ext/tasks/win.rb +2 -0
  18. data/lib/libuv/ext/types.rb +2 -1
  19. data/lib/libuv/file.rb +67 -50
  20. data/lib/libuv/filesystem.rb +63 -61
  21. data/lib/libuv/fs_event.rb +7 -4
  22. data/lib/libuv/handle.rb +30 -14
  23. data/lib/libuv/idle.rb +17 -10
  24. data/lib/libuv/mixins/accessors.rb +41 -0
  25. data/lib/libuv/mixins/assertions.rb +3 -1
  26. data/lib/libuv/mixins/fs_checks.rb +29 -6
  27. data/lib/libuv/mixins/listener.rb +4 -2
  28. data/lib/libuv/mixins/net.rb +4 -2
  29. data/lib/libuv/mixins/resource.rb +5 -3
  30. data/lib/libuv/mixins/stream.rb +128 -35
  31. data/lib/libuv/pipe.rb +54 -27
  32. data/lib/libuv/prepare.rb +19 -12
  33. data/lib/libuv/q.rb +109 -101
  34. data/lib/libuv/{loop.rb → reactor.rb} +163 -85
  35. data/lib/libuv/signal.rb +13 -5
  36. data/lib/libuv/tcp.rb +109 -63
  37. data/lib/libuv/timer.rb +44 -24
  38. data/lib/libuv/tty.rb +8 -3
  39. data/lib/libuv/udp.rb +49 -22
  40. data/lib/libuv/version.rb +3 -1
  41. data/lib/libuv/work.rb +14 -10
  42. data/libuv.gemspec +11 -9
  43. data/spec/async_spec.rb +13 -13
  44. data/spec/coroutines_spec.rb +20 -50
  45. data/spec/defer_spec.rb +182 -311
  46. data/spec/dns_spec.rb +51 -41
  47. data/spec/dsl_spec.rb +43 -0
  48. data/spec/filesystem_spec.rb +65 -87
  49. data/spec/idle_spec.rb +19 -33
  50. data/spec/pipe_spec.rb +25 -32
  51. data/spec/tcp_spec.rb +116 -53
  52. data/spec/timer_spec.rb +3 -3
  53. data/spec/udp_spec.rb +16 -17
  54. data/spec/zen_spec.rb +2 -3
  55. metadata +37 -30
data/spec/defer_spec.rb CHANGED
@@ -4,12 +4,12 @@ require 'libuv'
4
4
  describe Libuv::Q do
5
5
 
6
6
  before :each do
7
- @loop = Libuv::Loop.default
8
- @deferred = @loop.defer
7
+ @reactor = Libuv::Reactor.default
8
+ @deferred = @reactor.defer
9
9
  @promise = @deferred.promise
10
10
  @log = []
11
11
  @default_fail = proc { |reason|
12
- @loop.stop
12
+ @reactor.stop
13
13
  }
14
14
  end
15
15
 
@@ -18,16 +18,12 @@ describe Libuv::Q do
18
18
 
19
19
 
20
20
  it "should call the callback in the next turn" do
21
- @loop.run {
21
+ @reactor.run {
22
22
  @promise.then nil, @default_fail do |result|
23
23
  @log << result
24
24
  end
25
25
 
26
26
  @deferred.resolve(:foo)
27
-
28
- @loop.next_tick do
29
- @loop.stop
30
- end
31
27
  }
32
28
 
33
29
  expect(@log).to eq([:foo])
@@ -36,7 +32,7 @@ describe Libuv::Q do
36
32
 
37
33
 
38
34
  it "should be able to resolve the callback after it has already been resolved" do
39
- @loop.run {
35
+ @reactor.run {
40
36
  @promise.then nil, @default_fail do |result|
41
37
  @log << result
42
38
  @promise.then nil, @default_fail do |result|
@@ -45,12 +41,6 @@ describe Libuv::Q do
45
41
  end
46
42
 
47
43
  @deferred.resolve(:foo)
48
-
49
- @loop.next_tick do
50
- @loop.next_tick do
51
- @loop.stop
52
- end
53
- end
54
44
  }
55
45
  expect(@log).to eq([:foo, :foo])
56
46
  end
@@ -58,7 +48,7 @@ describe Libuv::Q do
58
48
 
59
49
 
60
50
  it "should fulfill success callbacks in the registration order" do
61
- @loop.run {
51
+ @reactor.run {
62
52
  @promise.then nil, @default_fail do |result|
63
53
  @log << :first
64
54
  end
@@ -68,17 +58,13 @@ describe Libuv::Q do
68
58
  end
69
59
 
70
60
  @deferred.resolve(:foo)
71
-
72
- @loop.next_tick do
73
- @loop.stop
74
- end
75
61
  }
76
62
  expect(@log).to eq([:first, :second])
77
63
  end
78
64
 
79
65
 
80
66
  it "should do nothing if a promise was previously resolved" do
81
- @loop.run {
67
+ @reactor.run {
82
68
  @promise.then nil, @default_fail do |result|
83
69
  @log << result
84
70
  expect(@log).to eq([:foo])
@@ -87,30 +73,17 @@ describe Libuv::Q do
87
73
 
88
74
  @deferred.resolve(:foo)
89
75
  @deferred.reject(:baz)
90
-
91
- #
92
- # 4 ticks should detect any errors
93
- #
94
- @loop.next_tick do
95
- @loop.next_tick do
96
- @loop.next_tick do
97
- @loop.next_tick do
98
- @loop.stop
99
- end
100
- end
101
- end
102
- end
103
76
  }
104
77
  expect(@log).to eq([:foo])
105
78
  end
106
79
 
107
80
 
108
81
  it "should allow deferred resolution with a new promise" do
109
- deferred2 = @loop.defer
110
- @loop.run {
82
+ deferred2 = @reactor.defer
83
+ @reactor.run {
111
84
  @promise.then nil, @default_fail do |result|
112
85
  @log << result
113
- @loop.stop
86
+ @reactor.stop
114
87
  end
115
88
 
116
89
  @deferred.resolve(deferred2.promise)
@@ -121,7 +94,7 @@ describe Libuv::Q do
121
94
 
122
95
 
123
96
  it "should not break if a callbacks registers another callback" do
124
- @loop.run {
97
+ @reactor.run {
125
98
  @promise.then nil, @default_fail do |result|
126
99
  @log << :outer
127
100
  @promise.then nil, @default_fail do |result|
@@ -130,12 +103,6 @@ describe Libuv::Q do
130
103
  end
131
104
 
132
105
  @deferred.resolve(:foo)
133
-
134
- @loop.next_tick do
135
- @loop.next_tick do
136
- @loop.stop
137
- end
138
- end
139
106
  }
140
107
 
141
108
  expect(@log).to eq([:outer, :inner])
@@ -144,9 +111,9 @@ describe Libuv::Q do
144
111
 
145
112
 
146
113
  it "can modify the result of a promise before returning" do
147
- @loop.run {
114
+ @reactor.run {
148
115
  proc { |name|
149
- @loop.work { @deferred.resolve("Hello #{name}") }
116
+ @reactor.work { @deferred.resolve("Hello #{name}") }
150
117
  @promise.then nil, @default_fail do |result|
151
118
  @log << result
152
119
  result += "?"
@@ -154,7 +121,7 @@ describe Libuv::Q do
154
121
  end
155
122
  }.call('Robin Hood').then nil, @default_fail do |greeting|
156
123
  @log << greeting
157
- @loop.stop
124
+ @reactor.stop
158
125
  end
159
126
  }
160
127
 
@@ -167,7 +134,7 @@ describe Libuv::Q do
167
134
  describe 'reject' do
168
135
 
169
136
  it "should reject the promise and execute all error callbacks" do
170
- @loop.run {
137
+ @reactor.run {
171
138
  @promise.then(@default_fail, proc {|result|
172
139
  @log << :first
173
140
  })
@@ -176,17 +143,13 @@ describe Libuv::Q do
176
143
  })
177
144
 
178
145
  @deferred.reject(:foo)
179
-
180
- @loop.next_tick do
181
- @loop.stop
182
- end
183
146
  }
184
147
  expect(@log).to eq([:first, :second])
185
148
  end
186
149
 
187
150
 
188
151
  it "should do nothing if a promise was previously rejected" do
189
- @loop.run {
152
+ @reactor.run {
190
153
  @promise.then(@default_fail, proc {|result|
191
154
  @log << result
192
155
  @deferred.resolve(:bar)
@@ -194,33 +157,20 @@ describe Libuv::Q do
194
157
 
195
158
  @deferred.reject(:baz)
196
159
  @deferred.resolve(:foo)
197
-
198
- #
199
- # 4 ticks should detect any errors
200
- #
201
- @loop.next_tick do
202
- @loop.next_tick do
203
- @loop.next_tick do
204
- @loop.next_tick do
205
- @loop.stop
206
- end
207
- end
208
- end
209
- end
210
160
  }
211
161
  expect(@log).to eq([:baz])
212
162
  end
213
163
 
214
164
 
215
165
  it "should not defer rejection with a new promise" do
216
- deferred2 = @loop.defer
217
- @loop.run {
166
+ deferred2 = @reactor.defer
167
+ @reactor.run {
218
168
  @promise.then(@default_fail, @default_fail)
219
169
  begin
220
170
  @deferred.reject(deferred2.promise)
221
171
  rescue => e
222
172
  @log << e.is_a?(ArgumentError)
223
- @loop.stop
173
+ @reactor.stop
224
174
  end
225
175
  }
226
176
 
@@ -232,7 +182,7 @@ describe Libuv::Q do
232
182
 
233
183
  describe 'notify' do
234
184
  it "should execute all progress callbacks in the registration order" do
235
- @loop.run {
185
+ @reactor.run {
236
186
  @promise.progress do |update|
237
187
  @log << :first
238
188
  end
@@ -242,17 +192,13 @@ describe Libuv::Q do
242
192
  end
243
193
 
244
194
  @deferred.notify(:foo)
245
-
246
- @loop.next_tick do
247
- @loop.stop
248
- end
249
195
  }
250
196
 
251
197
  expect(@log).to eq([:first, :second])
252
198
  end
253
199
 
254
200
  it "should do nothing if a promise was previously resolved" do
255
- @loop.run {
201
+ @reactor.run {
256
202
 
257
203
  @promise.progress do |update|
258
204
  @log << update
@@ -260,48 +206,19 @@ describe Libuv::Q do
260
206
 
261
207
  @deferred.resolve(:foo)
262
208
  @deferred.notify(:baz)
263
-
264
-
265
- #
266
- # 4 ticks should detect any errors
267
- #
268
- @loop.next_tick do
269
- @loop.next_tick do
270
- @loop.next_tick do
271
- @loop.next_tick do
272
- @loop.stop
273
- end
274
- end
275
- end
276
- end
277
209
  }
278
210
 
279
211
  expect(@log).to eq([])
280
212
  end
281
213
 
282
214
  it "should do nothing if a promise was previously rejected" do
283
- @loop.run {
215
+ @reactor.run {
284
216
 
285
217
  @promise.progress do |update|
286
218
  @log << update
287
219
  end
288
220
  @deferred.reject(:foo)
289
221
  @deferred.notify(:baz)
290
-
291
-
292
-
293
- #
294
- # 4 ticks should detect any errors
295
- #
296
- @loop.next_tick do
297
- @loop.next_tick do
298
- @loop.next_tick do
299
- @loop.next_tick do
300
- @loop.stop
301
- end
302
- end
303
- end
304
- end
305
222
  }
306
223
 
307
224
  expect(@log).to eq([])
@@ -309,17 +226,13 @@ describe Libuv::Q do
309
226
 
310
227
 
311
228
  it "should not apply any special treatment to promises passed to notify" do
312
- @loop.run {
313
- deferred2 = @loop.defer
229
+ @reactor.run {
230
+ deferred2 = @reactor.defer
314
231
 
315
232
  @promise.progress do |update|
316
233
  @log << update.is_a?(::Libuv::Q::Promise)
317
234
  end
318
235
  @deferred.notify(deferred2.promise)
319
-
320
- @loop.next_tick do
321
- @loop.stop
322
- end
323
236
  }
324
237
 
325
238
  expect(@log).to eq([true])
@@ -327,7 +240,7 @@ describe Libuv::Q do
327
240
 
328
241
 
329
242
  it "should call the progress callbacks in the next turn" do
330
- @loop.run {
243
+ @reactor.run {
331
244
  @promise.progress do |update|
332
245
  @log << :first
333
246
  end
@@ -339,14 +252,13 @@ describe Libuv::Q do
339
252
  @deferred.notify(:foo)
340
253
 
341
254
  @log << @log.length # Has notify run in this tick
342
- @loop.stop # Stop will run through the next tick before stopping
343
255
  }
344
256
 
345
257
  expect(@log).to eq([0, :first, :second])
346
258
  end
347
259
 
348
260
  it "should ignore notifications sent out in the same turn before listener registration" do
349
- @loop.run {
261
+ @reactor.run {
350
262
  @deferred.notify(:foo)
351
263
 
352
264
  @promise.progress do |update|
@@ -356,10 +268,6 @@ describe Libuv::Q do
356
268
  @promise.progress do |update|
357
269
  @log << :second
358
270
  end
359
-
360
- @loop.next_tick do
361
- @loop.stop
362
- end
363
271
  }
364
272
 
365
273
  expect(@log).to eq([])
@@ -368,20 +276,16 @@ describe Libuv::Q do
368
276
 
369
277
 
370
278
  describe Libuv::Q::Promise do
371
-
279
+
372
280
  describe 'then' do
373
281
 
374
282
  it "should allow registration of a success callback without an errback and resolve" do
375
- @loop.run {
283
+ @reactor.run {
376
284
  @promise.then do |result|
377
285
  @log << result
378
286
  end
379
287
 
380
288
  @deferred.resolve(:foo)
381
-
382
- @loop.next_tick do
383
- @loop.stop
384
- end
385
289
  }
386
290
 
387
291
  expect(@log).to eq([:foo])
@@ -389,16 +293,12 @@ describe Libuv::Q do
389
293
 
390
294
 
391
295
  it "should allow registration of a success callback without an errback and reject" do
392
- @loop.run {
296
+ @reactor.run {
393
297
  @promise.then do |result|
394
298
  @log << result
395
299
  end
396
300
 
397
301
  @deferred.reject(:foo)
398
-
399
- @loop.next_tick do
400
- @loop.stop
401
- end
402
302
  }
403
303
 
404
304
  expect(@log).to eq([])
@@ -406,16 +306,12 @@ describe Libuv::Q do
406
306
 
407
307
 
408
308
  it "should allow registration of an errback without a success callback and reject" do
409
- @loop.run {
309
+ @reactor.run {
410
310
  @promise.catch(proc {|reason|
411
311
  @log << reason
412
312
  })
413
313
 
414
314
  @deferred.reject(:foo)
415
-
416
- @loop.next_tick do
417
- @loop.stop
418
- end
419
315
  }
420
316
 
421
317
  expect(@log).to eq([:foo])
@@ -423,16 +319,12 @@ describe Libuv::Q do
423
319
 
424
320
 
425
321
  it "should allow registration of an errback without a success callback and resolve" do
426
- @loop.run {
322
+ @reactor.run {
427
323
  @promise.catch(proc {|reason|
428
324
  @log << reason
429
325
  })
430
326
 
431
327
  @deferred.resolve(:foo)
432
-
433
- @loop.next_tick do
434
- @loop.stop
435
- end
436
328
  }
437
329
 
438
330
  expect(@log).to eq([])
@@ -440,7 +332,7 @@ describe Libuv::Q do
440
332
 
441
333
 
442
334
  it "should resolve all callbacks with the original value" do
443
- @loop.run {
335
+ @reactor.run {
444
336
  @promise.then nil, @default_fail do |result|
445
337
  @log << result
446
338
  :alt1
@@ -451,7 +343,7 @@ describe Libuv::Q do
451
343
  end
452
344
  @promise.then nil, @default_fail do |result|
453
345
  @log << result
454
- Libuv::Q.reject(@loop, 'some reason')
346
+ Libuv::Q.reject(@reactor, 'some reason')
455
347
  end
456
348
  @promise.then nil, @default_fail do |result|
457
349
  @log << result
@@ -459,10 +351,6 @@ describe Libuv::Q do
459
351
  end
460
352
 
461
353
  @deferred.resolve(:foo)
462
-
463
- @loop.next_tick do
464
- @loop.stop
465
- end
466
354
  }
467
355
 
468
356
  expect(@log).to eq([:foo, :foo, :foo, :foo])
@@ -470,7 +358,7 @@ describe Libuv::Q do
470
358
 
471
359
 
472
360
  it "should notify all callbacks with the original value" do
473
- @loop.run { |loop_promise|
361
+ @reactor.run { |reactor_promise|
474
362
  @promise.progress do |result|
475
363
  @log << result
476
364
  :alt1
@@ -481,7 +369,7 @@ describe Libuv::Q do
481
369
  end
482
370
  @promise.progress do |result|
483
371
  @log << result
484
- Libuv::Q.reject(@loop, 'some reason')
372
+ Libuv::Q.reject(@reactor, 'some reason')
485
373
  end
486
374
  @promise.progress do |result|
487
375
  @log << result
@@ -490,18 +378,6 @@ describe Libuv::Q do
490
378
 
491
379
 
492
380
  @deferred.notify(:foo)
493
-
494
- @loop.next_tick do
495
- @loop.next_tick do
496
- @loop.next_tick do
497
- @loop.next_tick do
498
- @loop.next_tick do
499
- @loop.stop
500
- end
501
- end
502
- end
503
- end
504
- end
505
381
  }
506
382
 
507
383
  expect(@log).to eq([:foo, :foo, :foo, :foo])
@@ -509,7 +385,7 @@ describe Libuv::Q do
509
385
 
510
386
 
511
387
  it "should reject all callbacks with the original reason" do
512
- @loop.run {
388
+ @reactor.run {
513
389
  @promise.then(@default_fail, proc {|result|
514
390
  @log << result
515
391
  :alt1
@@ -520,7 +396,7 @@ describe Libuv::Q do
520
396
  })
521
397
  @promise.then(@default_fail, proc {|result|
522
398
  @log << result
523
- Libuv::Q.reject(@loop, 'some reason')
399
+ Libuv::Q.reject(@reactor, 'some reason')
524
400
  })
525
401
  @promise.then(@default_fail, proc {|result|
526
402
  @log << result
@@ -528,10 +404,6 @@ describe Libuv::Q do
528
404
  })
529
405
 
530
406
  @deferred.reject(:foo)
531
-
532
- @loop.next_tick do
533
- @loop.stop
534
- end
535
407
  }
536
408
 
537
409
  expect(@log).to eq([:foo, :foo, :foo, :foo])
@@ -539,7 +411,7 @@ describe Libuv::Q do
539
411
 
540
412
 
541
413
  it "should propagate resolution and rejection between dependent promises" do
542
- @loop.run {
414
+ @reactor.run {
543
415
  @promise.then(proc { |result|
544
416
  @log << result
545
417
  :bar
@@ -557,20 +429,6 @@ describe Libuv::Q do
557
429
  }, @default_fail)
558
430
 
559
431
  @deferred.resolve(:foo)
560
-
561
- @loop.next_tick do
562
- @loop.next_tick do
563
- @loop.next_tick do
564
- @loop.next_tick do
565
- @loop.next_tick do
566
- @loop.next_tick do # extra tick?
567
- @loop.stop
568
- end
569
- end
570
- end
571
- end
572
- end
573
- end
574
432
  }
575
433
 
576
434
  expect(@log).to eq([:foo, :bar, 'baz', 'bob', :done])
@@ -578,8 +436,8 @@ describe Libuv::Q do
578
436
 
579
437
 
580
438
  it "should propagate notification between dependent promises" do
581
- @loop.run { |loop_promise|
582
- loop_promise.progress do |type, id, error|
439
+ @reactor.run { |reactor|
440
+ reactor.notifier do |type, id, error|
583
441
  @log << id
584
442
  end
585
443
 
@@ -603,20 +461,6 @@ describe Libuv::Q do
603
461
 
604
462
 
605
463
  @deferred.notify(:foo)
606
-
607
- @loop.next_tick do
608
- @loop.next_tick do
609
- @loop.next_tick do
610
- @loop.next_tick do
611
- @loop.next_tick do
612
- @loop.next_tick do # extra tick?
613
- @loop.stop
614
- end
615
- end
616
- end
617
- end
618
- end
619
- end
620
464
  }
621
465
 
622
466
  expect(@log).to eq([:foo, :bar, :bar, :bar, :done])
@@ -624,9 +468,9 @@ describe Libuv::Q do
624
468
 
625
469
 
626
470
  it "should stop notification propagation in case of error" do
627
- @loop.run { |loop_logger|
628
- loop_logger.progress do |type, id, error|
629
- @log << id
471
+ @reactor.run { |reactor|
472
+ reactor.notifier do |error, context|
473
+ @log << context
630
474
  end
631
475
 
632
476
 
@@ -650,34 +494,22 @@ describe Libuv::Q do
650
494
 
651
495
 
652
496
  @deferred.notify(:foo)
653
-
654
- @loop.next_tick do
655
- @loop.next_tick do
656
- @loop.next_tick do
657
- @loop.next_tick do
658
- @loop.next_tick do
659
- @loop.stop
660
- end
661
- end
662
- end
663
- end
664
- end
665
497
  }
666
498
 
667
- expect(@log).to eq([:foo, :bar, :q_progress_cb])
499
+ expect(@log).to eq([:foo, :bar, "performing promise progress callback"])
668
500
  end
669
501
 
670
502
 
671
503
  it "should call error callback in the next turn even if promise is already rejected" do
672
- @loop.run {
504
+ @reactor.run {
673
505
  @deferred.reject(:foo)
674
506
 
675
507
  @promise.catch(proc {|reason|
676
508
  @log << reason
677
509
  })
678
510
 
679
- @loop.next_tick do
680
- @loop.stop
511
+ @reactor.next_tick do
512
+ @reactor.stop
681
513
  end
682
514
  }
683
515
 
@@ -693,23 +525,19 @@ describe Libuv::Q do
693
525
  describe 'when the promise is fulfilled' do
694
526
 
695
527
  it "should call the callback" do
696
- @loop.run {
528
+ @reactor.run {
697
529
  @promise.finally do
698
530
  @log << :finally
699
531
  end
700
532
 
701
533
  @deferred.resolve(:foo)
702
-
703
- @loop.next_tick do
704
- @loop.stop
705
- end
706
534
  }
707
535
 
708
536
  expect(@log).to eq([:finally])
709
537
  end
710
538
 
711
539
  it "should fulfill with the original value" do
712
- @loop.run {
540
+ @reactor.run {
713
541
  @promise.finally(proc {
714
542
  @log << :finally
715
543
  :finally
@@ -719,19 +547,13 @@ describe Libuv::Q do
719
547
 
720
548
 
721
549
  @deferred.resolve(:foo)
722
-
723
- @loop.next_tick do
724
- @loop.next_tick do
725
- @loop.stop
726
- end
727
- end
728
550
  }
729
551
 
730
552
  expect(@log).to eq([:finally, :foo])
731
553
  end
732
554
 
733
555
  it "should fulfill with the original value (larger test)" do
734
- @loop.run {
556
+ @reactor.run {
735
557
  @promise.then(proc { |result|
736
558
  @log << result
737
559
  result
@@ -754,25 +576,6 @@ describe Libuv::Q do
754
576
 
755
577
 
756
578
  @deferred.resolve(:foo)
757
-
758
-
759
- @loop.next_tick do
760
- @loop.next_tick do
761
- @loop.next_tick do
762
- @loop.next_tick do
763
- @loop.next_tick do
764
- @loop.next_tick do
765
- @loop.next_tick do
766
- @loop.next_tick do
767
- @loop.stop
768
- end
769
- end
770
- end
771
- end
772
- end
773
- end
774
- end
775
- end
776
579
  }
777
580
 
778
581
  expect(@log).to eq([:foo, :finally, :foo, :change, :finally, :change])
@@ -780,7 +583,7 @@ describe Libuv::Q do
780
583
 
781
584
  describe "when the callback throws an exception" do
782
585
  it "should reject with this new exception" do
783
- @loop.run {
586
+ @reactor.run {
784
587
  @promise.finally(proc {
785
588
  @log << :finally
786
589
  raise 'error'
@@ -789,12 +592,6 @@ describe Libuv::Q do
789
592
  end
790
593
 
791
594
  @deferred.resolve(:foo)
792
-
793
- @loop.next_tick do
794
- @loop.next_tick do
795
- @loop.stop
796
- end
797
- end
798
595
  }
799
596
 
800
597
  expect(@log).to eq([:finally, true])
@@ -803,8 +600,8 @@ describe Libuv::Q do
803
600
 
804
601
  describe "when the callback returns a promise" do
805
602
  it "should fulfill with the original reason after that promise resolves" do
806
- @loop.run {
807
- deferred2 = @loop.defer
603
+ @reactor.run {
604
+ deferred2 = @reactor.defer
808
605
 
809
606
  @promise.finally(proc {
810
607
  @log << :finally
@@ -815,17 +612,12 @@ describe Libuv::Q do
815
612
 
816
613
  @deferred.resolve(:foo)
817
614
 
818
- @loop.next_tick do
819
- @loop.next_tick do
820
- @loop.next_tick do
821
- @loop.next_tick do
615
+ @reactor.next_tick do
616
+ @reactor.next_tick do
617
+ @reactor.next_tick do
618
+ @reactor.next_tick do
822
619
  @log << :resolving
823
620
  deferred2.resolve('working')
824
- @loop.next_tick do
825
- @loop.next_tick do
826
- @loop.stop
827
- end
828
- end
829
621
  end
830
622
  end
831
623
  end
@@ -837,8 +629,8 @@ describe Libuv::Q do
837
629
 
838
630
 
839
631
  it "should reject with the new reason when it is rejected" do
840
- @loop.run {
841
- deferred2 = @loop.defer
632
+ @reactor.run {
633
+ deferred2 = @reactor.defer
842
634
 
843
635
  @promise.finally(proc {
844
636
  @log << :finally
@@ -849,17 +641,12 @@ describe Libuv::Q do
849
641
 
850
642
  @deferred.resolve(:foo)
851
643
 
852
- @loop.next_tick do
853
- @loop.next_tick do
854
- @loop.next_tick do
855
- @loop.next_tick do
644
+ @reactor.next_tick do
645
+ @reactor.next_tick do
646
+ @reactor.next_tick do
647
+ @reactor.next_tick do
856
648
  @log << :rejecting
857
649
  deferred2.reject(:rejected)
858
- @loop.next_tick do
859
- @loop.next_tick do
860
- @loop.stop
861
- end
862
- end
863
650
  end
864
651
  end
865
652
  end
@@ -873,6 +660,104 @@ describe Libuv::Q do
873
660
  end
874
661
 
875
662
  end
663
+
664
+
665
+ describe 'value' do
666
+ it "should resolve a promise value as a future" do
667
+ @reactor.run {
668
+ @reactor.next_tick do
669
+ @deferred.resolve(:foo)
670
+ end
671
+ @log << @deferred.promise.value
672
+ }
673
+
674
+ expect(@log).to eq([:foo])
675
+ end
676
+
677
+ it "should reject a promise value as a future" do
678
+ @reactor.run {
679
+ @reactor.next_tick do
680
+ @deferred.reject(:foo)
681
+ end
682
+
683
+ begin
684
+ @deferred.promise.value
685
+ @log << 'should raise exception'
686
+ rescue => e
687
+ expect(e.class).to eq(CoroutineRejection)
688
+ @log << e.value
689
+ end
690
+ }
691
+
692
+ expect(@log).to eq([:foo])
693
+ end
694
+
695
+ it "should resolve a deferred value as a future" do
696
+ @reactor.run {
697
+ @reactor.next_tick do
698
+ @deferred.resolve(:foo)
699
+ end
700
+ @log << @deferred.value
701
+ }
702
+
703
+ expect(@log).to eq([:foo])
704
+ end
705
+
706
+ it "should reject a deferred value as a future" do
707
+ @reactor.run {
708
+ @reactor.next_tick do
709
+ @deferred.reject(:foo)
710
+ end
711
+
712
+ begin
713
+ @deferred.value
714
+ @log << 'should raise exception'
715
+ rescue => e
716
+ expect(e.class).to eq(CoroutineRejection)
717
+ @log << e.value
718
+ end
719
+ }
720
+
721
+ expect(@log).to eq([:foo])
722
+ end
723
+
724
+ it "should reject with message when rejection was a string" do
725
+ @reactor.run {
726
+ @reactor.next_tick do
727
+ @deferred.reject('foo')
728
+ end
729
+
730
+ begin
731
+ @deferred.value
732
+ @log << 'should raise exception'
733
+ rescue => e
734
+ expect(e.class).to eq(CoroutineRejection)
735
+ @log << e.message
736
+ @log << e.value
737
+ end
738
+ }
739
+
740
+ expect(@log).to eq(['foo', 'foo'])
741
+ end
742
+
743
+ it "should pass through exceptions without modification" do
744
+ @reactor.run {
745
+ @reactor.next_tick do
746
+ @deferred.reject(RuntimeError.new('fail'))
747
+ end
748
+
749
+ begin
750
+ @deferred.value
751
+ @log << 'should raise exception'
752
+ rescue => e
753
+ expect(e.class).to eq(RuntimeError)
754
+ @log << e.message
755
+ end
756
+ }
757
+
758
+ expect(@log).to eq(['fail'])
759
+ end
760
+ end
876
761
 
877
762
  end
878
763
 
@@ -881,18 +766,14 @@ describe Libuv::Q do
881
766
  describe 'reject' do
882
767
 
883
768
  it "should package a string into a rejected promise" do
884
- @loop.run {
885
- rejectedPromise = Libuv::Q.reject(@loop, 'not gonna happen')
769
+ @reactor.run {
770
+ rejectedPromise = Libuv::Q.reject(@reactor, 'not gonna happen')
886
771
 
887
772
  @promise.then(@default_fail, proc {|reason|
888
773
  @log << reason
889
774
  })
890
775
 
891
776
  @deferred.resolve(rejectedPromise)
892
-
893
- @loop.next_tick do
894
- @loop.stop
895
- end
896
777
  }
897
778
 
898
779
  expect(@log).to eq(['not gonna happen'])
@@ -900,20 +781,14 @@ describe Libuv::Q do
900
781
 
901
782
 
902
783
  it "should return a promise that forwards callbacks if the callbacks are missing" do
903
- @loop.run {
904
- rejectedPromise = Libuv::Q.reject(@loop, 'not gonna happen')
784
+ @reactor.run {
785
+ rejectedPromise = Libuv::Q.reject(@reactor, 'not gonna happen')
905
786
 
906
787
  @promise.then(@default_fail, proc {|reason|
907
788
  @log << reason
908
789
  })
909
790
 
910
791
  @deferred.resolve(rejectedPromise.then())
911
-
912
- @loop.next_tick do
913
- @loop.next_tick do
914
- @loop.stop
915
- end
916
- end
917
792
  }
918
793
 
919
794
  expect(@log).to eq(['not gonna happen'])
@@ -926,32 +801,28 @@ describe Libuv::Q do
926
801
  describe 'all' do
927
802
 
928
803
  it "should resolve all of nothing" do
929
- @loop.run {
930
- Libuv::Q.all(@loop).then nil, @default_fail do |result|
804
+ @reactor.run {
805
+ Libuv::Q.all(@reactor).then nil, @default_fail do |result|
931
806
  @log << result
932
807
  end
933
-
934
- @loop.next_tick do
935
- @loop.stop
936
- end
937
808
  }
938
809
 
939
810
  expect(@log).to eq([[]])
940
811
  end
941
812
 
942
813
  it "should take an array of promises and return a promise for an array of results" do
943
- @loop.run {
944
- deferred1 = @loop.defer
945
- deferred2 = @loop.defer
814
+ @reactor.run {
815
+ deferred1 = @reactor.defer
816
+ deferred2 = @reactor.defer
946
817
 
947
- Libuv::Q.all(@loop, @promise, deferred1.promise, deferred2.promise).then nil, @default_fail do |result|
818
+ Libuv::Q.all(@reactor, @promise, deferred1.promise, deferred2.promise).then nil, @default_fail do |result|
948
819
  @log = result
949
- @loop.stop
820
+ @reactor.stop
950
821
  end
951
822
 
952
- @loop.work { @deferred.resolve(:foo) }
953
- @loop.work { deferred2.resolve(:baz) }
954
- @loop.work { deferred1.resolve(:bar) }
823
+ @reactor.work { @deferred.resolve(:foo) }
824
+ @reactor.work { deferred2.resolve(:baz) }
825
+ @reactor.work { deferred1.resolve(:bar) }
955
826
  }
956
827
 
957
828
  expect(@log).to eq([:foo, :bar, :baz])
@@ -959,17 +830,17 @@ describe Libuv::Q do
959
830
 
960
831
 
961
832
  it "should reject the derived promise if at least one of the promises in the array is rejected" do
962
- @loop.run {
963
- deferred1 = @loop.defer
964
- deferred2 = @loop.defer
833
+ @reactor.run {
834
+ deferred1 = @reactor.defer
835
+ deferred2 = @reactor.defer
965
836
 
966
- Libuv::Q.all(@loop, @promise, deferred1.promise, deferred2.promise).then(@default_fail, proc {|reason|
837
+ Libuv::Q.all(@reactor, @promise, deferred1.promise, deferred2.promise).then(@default_fail, proc {|reason|
967
838
  @log << reason
968
- @loop.stop
839
+ @reactor.stop
969
840
  })
970
841
 
971
- @loop.work { @deferred.resolve(:foo) }
972
- @loop.work { deferred2.reject(:baz) }
842
+ @reactor.work { @deferred.resolve(:foo) }
843
+ @reactor.work { deferred2.reject(:baz) }
973
844
  }
974
845
 
975
846
  expect(@log).to eq([:baz])