rx_ruby 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +22 -0
  3. data/.gitignore +173 -0
  4. data/.travis.yml +10 -0
  5. data/Gemfile +4 -0
  6. data/Rakefile +11 -0
  7. data/examples/aggregate.rb +39 -0
  8. data/examples/amb.rb +25 -0
  9. data/examples/ambproto.rb +24 -0
  10. data/examples/and.rb +26 -0
  11. data/examples/as_observable.rb +25 -0
  12. data/examples/average.rb +43 -0
  13. data/examples/buffer_with_count.rb +44 -0
  14. data/examples/buffer_with_time.rb +51 -0
  15. data/examples/case.rb +29 -0
  16. data/examples/catch.rb +20 -0
  17. data/examples/catchproto.rb +39 -0
  18. data/examples/combine_latest.rb +35 -0
  19. data/examples/combine_latestproto.rb +33 -0
  20. data/examples/concat.rb +22 -0
  21. data/examples/concat_all.rb +27 -0
  22. data/examples/concat_map.rb +61 -0
  23. data/examples/concat_map_observer.rb +29 -0
  24. data/examples/concatproto.rb +25 -0
  25. data/examples/connect.rb +41 -0
  26. data/examples/contains.rb +37 -0
  27. data/examples/count.rb +36 -0
  28. data/examples/create.rb +55 -0
  29. data/examples/debounce.rb +35 -0
  30. data/examples/default_if_empty.rb +35 -0
  31. data/examples/defer.rb +20 -0
  32. data/examples/delay.rb +49 -0
  33. data/examples/delay_with_selector.rb +63 -0
  34. data/examples/dematerialize.rb +22 -0
  35. data/examples/disposable.rb +12 -0
  36. data/examples/distinct.rb +43 -0
  37. data/examples/distinct_until_changed.rb +43 -0
  38. data/examples/do.rb +59 -0
  39. data/examples/empty.rb +16 -0
  40. data/examples/for.rb +26 -0
  41. data/examples/fork_join.rb +23 -0
  42. data/examples/from.rb +106 -0
  43. data/examples/from_array.rb +21 -0
  44. data/examples/from_callback.rb +21 -0
  45. data/examples/generate.rb +24 -0
  46. data/examples/group_join.rb +39 -0
  47. data/examples/if.rb +46 -0
  48. data/examples/intervals.rb +26 -0
  49. data/examples/merge.rb +36 -0
  50. data/examples/merge_all.rb +27 -0
  51. data/examples/multicast.rb +32 -0
  52. data/examples/never.rb +15 -0
  53. data/examples/of.rb +19 -0
  54. data/examples/on_error_resume_next.rb +21 -0
  55. data/examples/pairs.rb +26 -0
  56. data/examples/publish.rb +79 -0
  57. data/examples/range.rb +19 -0
  58. data/examples/reduce.rb +18 -0
  59. data/examples/repeat.rb +19 -0
  60. data/examples/return.rb +17 -0
  61. data/examples/scan.rb +41 -0
  62. data/examples/start.rb +29 -0
  63. data/examples/throw.rb +17 -0
  64. data/examples/time_intervals.rb +28 -0
  65. data/examples/timer.rb +26 -0
  66. data/examples/timestamp.rb +28 -0
  67. data/examples/to_a.rb +23 -0
  68. data/examples/to_async.rb +26 -0
  69. data/examples/using.rb +52 -0
  70. data/examples/when.rb +26 -0
  71. data/examples/while.rb +25 -0
  72. data/examples/window_with_time.rb +78 -0
  73. data/examples/zip.rb +27 -0
  74. data/examples/zip_array.rb +25 -0
  75. data/lib/core_ext/enumerable.rb +22 -0
  76. data/lib/rx_ruby.rb +27 -0
  77. data/lib/rx_ruby/concurrency/async_lock.rb +57 -0
  78. data/lib/rx_ruby/concurrency/current_thread_scheduler.rb +75 -0
  79. data/lib/rx_ruby/concurrency/default_scheduler.rb +51 -0
  80. data/lib/rx_ruby/concurrency/historical_scheduler.rb +16 -0
  81. data/lib/rx_ruby/concurrency/immediate_scheduler.rb +68 -0
  82. data/lib/rx_ruby/concurrency/local_scheduler.rb +39 -0
  83. data/lib/rx_ruby/concurrency/periodic_scheduler.rb +74 -0
  84. data/lib/rx_ruby/concurrency/scheduled_item.rb +42 -0
  85. data/lib/rx_ruby/concurrency/scheduler.rb +150 -0
  86. data/lib/rx_ruby/concurrency/virtual_time_scheduler.rb +170 -0
  87. data/lib/rx_ruby/core/async_lock_observer.rb +46 -0
  88. data/lib/rx_ruby/core/auto_detach_observer.rb +59 -0
  89. data/lib/rx_ruby/core/checked_observer.rb +66 -0
  90. data/lib/rx_ruby/core/notification.rb +161 -0
  91. data/lib/rx_ruby/core/observable.rb +104 -0
  92. data/lib/rx_ruby/core/observe_on_observer.rb +50 -0
  93. data/lib/rx_ruby/core/observer.rb +119 -0
  94. data/lib/rx_ruby/core/scheduled_observer.rb +83 -0
  95. data/lib/rx_ruby/core/synchronized_observer.rb +47 -0
  96. data/lib/rx_ruby/core/time_interval.rb +17 -0
  97. data/lib/rx_ruby/internal/priority_queue.rb +122 -0
  98. data/lib/rx_ruby/internal/util.rb +9 -0
  99. data/lib/rx_ruby/joins/active_plan.rb +45 -0
  100. data/lib/rx_ruby/joins/join_observer.rb +51 -0
  101. data/lib/rx_ruby/joins/pattern.rb +14 -0
  102. data/lib/rx_ruby/joins/plan.rb +44 -0
  103. data/lib/rx_ruby/linq/connectable_observable.rb +34 -0
  104. data/lib/rx_ruby/linq/observable/_observable_timer_date_and_period.rb +22 -0
  105. data/lib/rx_ruby/linq/observable/_observable_timer_time_span.rb +14 -0
  106. data/lib/rx_ruby/linq/observable/_observable_timer_time_span_and_period.rb +20 -0
  107. data/lib/rx_ruby/linq/observable/aggregate.rb +7 -0
  108. data/lib/rx_ruby/linq/observable/and.rb +7 -0
  109. data/lib/rx_ruby/linq/observable/case.rb +15 -0
  110. data/lib/rx_ruby/linq/observable/concat_all.rb +7 -0
  111. data/lib/rx_ruby/linq/observable/concat_map.rb +35 -0
  112. data/lib/rx_ruby/linq/observable/concat_map_observer.rb +43 -0
  113. data/lib/rx_ruby/linq/observable/contains.rb +28 -0
  114. data/lib/rx_ruby/linq/observable/debounce.rb +41 -0
  115. data/lib/rx_ruby/linq/observable/delay.rb +81 -0
  116. data/lib/rx_ruby/linq/observable/delay_with_selector.rb +64 -0
  117. data/lib/rx_ruby/linq/observable/do.rb +42 -0
  118. data/lib/rx_ruby/linq/observable/for.rb +13 -0
  119. data/lib/rx_ruby/linq/observable/fork_join.rb +55 -0
  120. data/lib/rx_ruby/linq/observable/from.rb +34 -0
  121. data/lib/rx_ruby/linq/observable/group_join.rb +108 -0
  122. data/lib/rx_ruby/linq/observable/if.rb +17 -0
  123. data/lib/rx_ruby/linq/observable/interval.rb +5 -0
  124. data/lib/rx_ruby/linq/observable/multicast.rb +14 -0
  125. data/lib/rx_ruby/linq/observable/of.rb +11 -0
  126. data/lib/rx_ruby/linq/observable/pairs.rb +7 -0
  127. data/lib/rx_ruby/linq/observable/pluck.rb +7 -0
  128. data/lib/rx_ruby/linq/observable/publish.rb +11 -0
  129. data/lib/rx_ruby/linq/observable/start.rb +7 -0
  130. data/lib/rx_ruby/linq/observable/time_interval.rb +15 -0
  131. data/lib/rx_ruby/linq/observable/timer.rb +26 -0
  132. data/lib/rx_ruby/linq/observable/timestamp.rb +9 -0
  133. data/lib/rx_ruby/linq/observable/to_async.rb +40 -0
  134. data/lib/rx_ruby/linq/observable/when.rb +36 -0
  135. data/lib/rx_ruby/linq/observable/while.rb +41 -0
  136. data/lib/rx_ruby/operators/aggregates.rb +611 -0
  137. data/lib/rx_ruby/operators/creation.rb +220 -0
  138. data/lib/rx_ruby/operators/multiple.rb +735 -0
  139. data/lib/rx_ruby/operators/single.rb +399 -0
  140. data/lib/rx_ruby/operators/standard_query_operators.rb +279 -0
  141. data/lib/rx_ruby/operators/synchronization.rb +47 -0
  142. data/lib/rx_ruby/operators/time.rb +120 -0
  143. data/lib/rx_ruby/subjects/async_subject.rb +161 -0
  144. data/lib/rx_ruby/subjects/behavior_subject.rb +149 -0
  145. data/lib/rx_ruby/subjects/replay_subject.rb +39 -0
  146. data/lib/rx_ruby/subjects/subject.rb +131 -0
  147. data/lib/rx_ruby/subjects/subject_extensions.rb +45 -0
  148. data/lib/rx_ruby/subscriptions/composite_subscription.rb +91 -0
  149. data/lib/rx_ruby/subscriptions/ref_count_subscription.rb +88 -0
  150. data/lib/rx_ruby/subscriptions/scheduled_subscription.rb +32 -0
  151. data/lib/rx_ruby/subscriptions/serial_subscription.rb +60 -0
  152. data/lib/rx_ruby/subscriptions/single_assignment_subscription.rb +64 -0
  153. data/lib/rx_ruby/subscriptions/subscription.rb +56 -0
  154. data/lib/rx_ruby/testing/cold_observable.rb +45 -0
  155. data/lib/rx_ruby/testing/hot_observable.rb +47 -0
  156. data/lib/rx_ruby/testing/mock_observer.rb +33 -0
  157. data/lib/rx_ruby/testing/reactive_test.rb +94 -0
  158. data/lib/rx_ruby/testing/recorded.rb +17 -0
  159. data/lib/rx_ruby/testing/test_scheduler.rb +96 -0
  160. data/lib/rx_ruby/testing/test_subscription.rb +22 -0
  161. data/lib/rx_ruby/version.rb +3 -0
  162. data/license.txt +13 -0
  163. data/readme.md +152 -0
  164. data/rx_ruby.gemspec +22 -0
  165. data/test/rx_ruby/concurrency/helpers/historical_virtual_scheduler_helper.rb +135 -0
  166. data/test/rx_ruby/concurrency/helpers/immediate_local_scheduler_helper.rb +51 -0
  167. data/test/rx_ruby/concurrency/test_async_lock.rb +56 -0
  168. data/test/rx_ruby/concurrency/test_current_thread_scheduler.rb +44 -0
  169. data/test/rx_ruby/concurrency/test_default_scheduler.rb +44 -0
  170. data/test/rx_ruby/concurrency/test_historical_scheduler.rb +18 -0
  171. data/test/rx_ruby/concurrency/test_immediate_scheduler.rb +53 -0
  172. data/test/rx_ruby/concurrency/test_local_scheduler.rb +12 -0
  173. data/test/rx_ruby/concurrency/test_periodic_scheduler.rb +53 -0
  174. data/test/rx_ruby/concurrency/test_scheduled_item.rb +50 -0
  175. data/test/rx_ruby/concurrency/test_scheduler.rb +128 -0
  176. data/test/rx_ruby/concurrency/test_virtual_time_scheduler.rb +14 -0
  177. data/test/rx_ruby/core/test_notification.rb +129 -0
  178. data/test/rx_ruby/core/test_observable_creation.rb +483 -0
  179. data/test/rx_ruby/core/test_observer.rb +634 -0
  180. data/test/rx_ruby/internal/test_priority_queue.rb +71 -0
  181. data/test/rx_ruby/subscriptions/test_composite_subscription.rb +116 -0
  182. data/test/rx_ruby/subscriptions/test_serial_subscription.rb +62 -0
  183. data/test/rx_ruby/subscriptions/test_singleassignment_subscription.rb +61 -0
  184. data/test/rx_ruby/subscriptions/test_subscription.rb +27 -0
  185. data/test/test_helper.rb +11 -0
  186. metadata +291 -0
@@ -0,0 +1,634 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'monitor'
4
+ require 'thread'
5
+ require 'test_helper'
6
+
7
+ class MyObserver
8
+ include RxRuby::Observer
9
+
10
+ attr_reader :next, :error, :completed
11
+
12
+ def initialize
13
+ @next = false
14
+ @error = false
15
+ @completed = false
16
+ end
17
+
18
+ def on_next(value)
19
+ @next = value
20
+ end
21
+
22
+ def on_error(error)
23
+ @error = error
24
+ end
25
+
26
+ def on_completed
27
+ @completed = true
28
+ end
29
+
30
+ end
31
+
32
+ class TestObserver < Minitest::Test
33
+
34
+ def test_from_notifier_notification_on_next
35
+ i = 0
36
+ obs = RxRuby::Observer.from_notifier do |n|
37
+ assert_equal i, 0
38
+ i += 1
39
+ assert n.on_next?
40
+ assert_equal 42, n.value
41
+ assert n.has_value?
42
+ end
43
+
44
+ obs.on_next 42
45
+ end
46
+
47
+ def test_from_notifier_notification_on_error
48
+ err = RuntimeError.new
49
+ i = 0
50
+ obs = RxRuby::Observer.from_notifier do |n|
51
+ assert_equal i, 0
52
+ i += 1
53
+ assert n.on_error?
54
+ assert_same n.error, err
55
+ refute n.has_value?
56
+ end
57
+
58
+ obs.on_error err
59
+ end
60
+
61
+ def test_from_notifier_notification_on_completed
62
+ i = 0
63
+ obs = RxRuby::Observer.from_notifier do |n|
64
+ assert_equal i, 0
65
+ i += 1
66
+ assert n.on_completed?
67
+ refute n.has_value?
68
+ end
69
+
70
+ obs.on_completed
71
+ end
72
+
73
+ def test_to_notifier_forwards
74
+ obsn = MyObserver.new
75
+ obsn.to_notifier.call(RxRuby::Notification.create_on_next 42)
76
+ assert_equal 42, obsn.next
77
+
78
+ err = RuntimeError.new
79
+ obse = MyObserver.new
80
+ obse.to_notifier.call(RxRuby::Notification.create_on_error err)
81
+ assert_same err, obse.error
82
+
83
+ obsc = MyObserver.new
84
+ obsc.to_notifier.call(RxRuby::Notification.create_on_completed)
85
+ assert obsc.completed
86
+ end
87
+
88
+ def test_as_observer_hides
89
+ obs = MyObserver.new
90
+ res = obs.as_observer
91
+
92
+ refute_same obs, res
93
+ end
94
+
95
+ def test_as_observer_forwards
96
+ obsn = MyObserver.new
97
+ obsn.as_observer.on_next 42
98
+ assert_equal 42, obsn.next
99
+
100
+ err = RuntimeError.new
101
+ obse = MyObserver.new
102
+ obse.as_observer.on_error err
103
+ assert_same err, obse.error
104
+
105
+ obsc = MyObserver.new
106
+ obsc.as_observer.on_completed
107
+ assert obsc.completed
108
+ end
109
+
110
+ def test_configure_on_next
111
+ next_called = false
112
+ res = RxRuby::Observer.configure do |o|
113
+ o.on_next do |x|
114
+ assert_equal 42, x
115
+ next_called = true
116
+ end
117
+ end
118
+
119
+ res.on_next 42
120
+ assert next_called
121
+ res.on_completed
122
+ end
123
+
124
+ def test_configure_on_next_has_error
125
+ ex = RuntimeError.new
126
+ e1 = nil
127
+
128
+ next_called = false
129
+ res = RxRuby::Observer.configure do |o|
130
+ o.on_next do |x|
131
+ assert_equal 42, x
132
+ next_called = true
133
+ end
134
+ end
135
+
136
+ res.on_next 42
137
+ assert next_called
138
+
139
+ begin
140
+ res.on_error ex
141
+ fluke
142
+ rescue => e
143
+ e1 = e
144
+ end
145
+
146
+ assert_same ex, e1
147
+ end
148
+
149
+ def test_configure_on_next_on_completed
150
+ next_called = false
151
+ completed = false
152
+
153
+ res = RxRuby::Observer.configure do |o|
154
+ o.on_next do |x|
155
+ assert_equal 42, x
156
+ next_called = true
157
+ end
158
+
159
+ o.on_completed { completed = true }
160
+ end
161
+
162
+ res.on_next 42
163
+ assert next_called
164
+ refute completed
165
+
166
+ res.on_completed
167
+ assert completed
168
+ end
169
+
170
+ def test_configure_on_next_on_completed_has_error
171
+ ex = RuntimeError.new
172
+ e1 = nil
173
+
174
+ next_called = false
175
+ completed = false
176
+
177
+ res = RxRuby::Observer.configure do |o|
178
+ o.on_next do |x|
179
+ assert_equal 42, x
180
+ next_called = true
181
+ end
182
+
183
+ o.on_completed { completed = true }
184
+ end
185
+
186
+ res.on_next 42
187
+ assert next_called
188
+ refute completed
189
+
190
+ begin
191
+ res.on_error ex
192
+ flunk
193
+ rescue => e
194
+ e1 = e
195
+ end
196
+
197
+ assert_same ex, e1
198
+ refute completed
199
+ end
200
+
201
+ def test_configure_on_next_on_error
202
+ ex = RuntimeError.new
203
+ next_called = false
204
+ error = false
205
+
206
+ res = RxRuby::Observer.configure do |o|
207
+ o.on_next do |x|
208
+ assert_equal 42, x
209
+ next_called = true
210
+ end
211
+
212
+ o.on_error do |err|
213
+ assert_same ex, err
214
+ error = true
215
+ end
216
+ end
217
+
218
+ res.on_next 42
219
+ assert next_called
220
+ refute error
221
+
222
+ res.on_error ex
223
+ assert error
224
+ end
225
+
226
+ def test_configure_on_next_on_error_hit_completed
227
+ ex = RuntimeError.new
228
+ next_called = false
229
+ error = false
230
+
231
+ res = RxRuby::Observer.configure do |o|
232
+ o.on_next do |x|
233
+ assert_equal 42, x
234
+ next_called = true
235
+ end
236
+
237
+ o.on_error do |err|
238
+ assert_same ex, err
239
+ error = true
240
+ end
241
+ end
242
+
243
+ res.on_next 42
244
+ assert next_called
245
+ refute error
246
+
247
+ res.on_completed
248
+ refute error
249
+ end
250
+
251
+ def test_configure_on_next_on_error_on_completed1
252
+ ex = RuntimeError.new
253
+ next_called = false
254
+ error = false
255
+ completed = false
256
+
257
+ res = RxRuby::Observer.configure do |o|
258
+ o.on_next do |x|
259
+ assert_equal 42, x
260
+ next_called = true
261
+ end
262
+
263
+ o.on_error do |err|
264
+ assert_same ex, err
265
+ error = true
266
+ end
267
+
268
+ o.on_completed { completed = true }
269
+ end
270
+
271
+ res.on_next 42
272
+ assert next_called
273
+ refute error
274
+ refute completed
275
+
276
+ res.on_completed
277
+ assert completed
278
+ refute error
279
+ end
280
+
281
+ def test_configure_on_next_on_error_on_completed1
282
+ ex = RuntimeError.new
283
+ next_called = false
284
+ error = false
285
+ completed = false
286
+
287
+ res = RxRuby::Observer.configure do |o|
288
+ o.on_next do |x|
289
+ assert_equal 42, x
290
+ next_called = true
291
+ end
292
+
293
+ o.on_error do |err|
294
+ assert_same ex, err
295
+ error = true
296
+ end
297
+
298
+ o.on_completed { completed = true }
299
+ end
300
+
301
+ res.on_next 42
302
+ assert next_called
303
+ refute error
304
+ refute completed
305
+
306
+ res.on_completed
307
+ assert completed
308
+ refute error
309
+ end
310
+
311
+ def test_configure_on_next_on_error_on_completed2
312
+ ex = RuntimeError.new
313
+ next_called = false
314
+ error = false
315
+ completed = false
316
+
317
+ res = RxRuby::Observer.configure do |o|
318
+ o.on_next do |x|
319
+ assert_equal 42, x
320
+ next_called = true
321
+ end
322
+
323
+ o.on_error do |err|
324
+ assert_same ex, err
325
+ error = true
326
+ end
327
+
328
+ o.on_completed { completed = true }
329
+ end
330
+
331
+ res.on_next 42
332
+ assert next_called
333
+ refute error
334
+ refute completed
335
+
336
+ res.on_error ex
337
+ assert error
338
+ refute completed
339
+ end
340
+
341
+ def test_checked_already_terminated_completed
342
+ m = 0
343
+ n = 0
344
+
345
+ o = RxRuby::Observer.configure do |obs|
346
+ obs.on_next {|x| m += 1 }
347
+ obs.on_error {|err| flunk }
348
+ obs.on_completed { n += 1 }
349
+ end
350
+
351
+ o = o.checked
352
+
353
+ o.on_next 1
354
+ o.on_next 2
355
+ o.on_completed
356
+
357
+ assert_raises(RuntimeError) { o.on_completed }
358
+ assert_raises(RuntimeError) { o.on_error RuntimeError.new }
359
+
360
+ assert_equal 2, m
361
+ assert_equal 1, n
362
+ end
363
+
364
+ def test_checked_already_terminated_error
365
+ m = 0
366
+ n = 0
367
+
368
+ o = RxRuby::Observer.configure do |obs|
369
+ obs.on_next {|x| m += 1 }
370
+ obs.on_error {|err| n += 1 }
371
+ obs.on_completed { flunk }
372
+ end
373
+
374
+ o = o.checked
375
+
376
+ o.on_next 1
377
+ o.on_next 2
378
+ o.on_error RuntimeError.new
379
+
380
+ assert_raises(RuntimeError) { o.on_completed }
381
+ assert_raises(RuntimeError) { o.on_error RuntimeError.new }
382
+
383
+ assert_equal 2, m
384
+ assert_equal 1, n
385
+ end
386
+
387
+ def test_checked_reentrant_next
388
+ n = 0
389
+
390
+ o = RxRuby::Observer.configure do |obs|
391
+ obs.on_next do |x|
392
+ n += 1
393
+
394
+ assert_raises(RuntimeError) { o.on_next 9 }
395
+ assert_raises(RuntimeError) { o.on_error RuntimeError.new }
396
+ assert_raises(RuntimeError) { o.on_completed }
397
+ end
398
+
399
+ obs.on_error {|err| flunk }
400
+ obs.on_completed { flunk }
401
+ end
402
+
403
+ o = o.checked
404
+ o.on_next 1
405
+
406
+ assert_equal 1, n
407
+ end
408
+
409
+ def test_checked_reentrant_error
410
+ n = 0
411
+
412
+ o = RxRuby::Observer.configure do |obs|
413
+ obs.on_next {|x| flunk }
414
+
415
+ obs.on_error do |err|
416
+ n += 1
417
+
418
+ assert_raises(RuntimeError) { o.on_next 9 }
419
+ assert_raises(RuntimeError) { o.on_error RuntimeError.new }
420
+ assert_raises(RuntimeError) { o.on_completed }
421
+ end
422
+
423
+ obs.on_completed { flunk }
424
+ end
425
+
426
+ o = o.checked
427
+ o.on_error RuntimeError.new
428
+
429
+ assert_equal 1, n
430
+ end
431
+
432
+ def test_checked_reentrant_completed
433
+ n = 0
434
+
435
+ o = RxRuby::Observer.configure do |obs|
436
+ obs.on_next {|x| flunk }
437
+ obs.on_error {|x| flunk }
438
+
439
+ obs.on_completed do
440
+ n += 1
441
+
442
+ assert_raises(RuntimeError) { o.on_next 9 }
443
+ assert_raises(RuntimeError) { o.on_error RuntimeError.new }
444
+ assert_raises(RuntimeError) { o.on_completed }
445
+ end
446
+ end
447
+
448
+ o = o.checked
449
+ o.on_completed
450
+
451
+ assert_equal 1, n
452
+ end
453
+
454
+ def test_synchronize_monitor_reentrant_1
455
+ res = false
456
+ in_one = false
457
+
458
+ s = nil
459
+ o = RxRuby::Observer.configure do |obs|
460
+ obs.on_next do |x|
461
+ if x == 1
462
+ in_one = true
463
+ s.on_next 2
464
+ in_one = false
465
+ elsif x == 2
466
+ res = in_one
467
+ end
468
+ end
469
+ end
470
+
471
+ s = RxRuby::Observer.allow_reentrancy o
472
+ s.on_next 1
473
+ assert res
474
+ end
475
+
476
+ def test_synchronize_monitor_reentrant_2
477
+ res = false
478
+ in_one = false
479
+
480
+ s = nil
481
+ o = RxRuby::Observer.configure do |obs|
482
+ obs.on_next do |x|
483
+ if x == 1
484
+ in_one = true
485
+ s.on_next 2
486
+ in_one = false
487
+ elsif x == 2
488
+ res = in_one
489
+ end
490
+ end
491
+ end
492
+
493
+ s = RxRuby::Observer.allow_reentrancy o, Monitor.new
494
+ s.on_next 1
495
+ assert res
496
+ end
497
+
498
+ def test_synchronize_monitor_non_reentrant_1
499
+ res = false
500
+ in_one = false
501
+
502
+ s = nil
503
+ o = RxRuby::Observer.configure do |obs|
504
+ obs.on_next do |x|
505
+ if x == 1
506
+ in_one = true
507
+ s.on_next 2
508
+ in_one = false
509
+ elsif x == 2
510
+ res = !in_one
511
+ end
512
+ end
513
+ end
514
+
515
+ s = RxRuby::Observer.prevent_reentrancy o
516
+ s.on_next 1
517
+ assert res
518
+ end
519
+
520
+ def test_synchronize_monitor_non_reentrant_2
521
+ res = false
522
+ in_one = false
523
+
524
+ s = nil
525
+ o = RxRuby::Observer.configure do |obs|
526
+ obs.on_next do |x|
527
+ if x == 1
528
+ in_one = true
529
+ s.on_next 2
530
+ in_one = false
531
+ elsif x == 2
532
+ res = !in_one
533
+ end
534
+ end
535
+ end
536
+
537
+ s = RxRuby::Observer.prevent_reentrancy o, RxRuby::AsyncLock.new
538
+ s.on_next 1
539
+ assert res
540
+ end
541
+
542
+ def test_synchronize_monitor_non_reentrant_next
543
+ res = false
544
+ s = nil
545
+
546
+ o = RxRuby::Observer.configure do |obs|
547
+ obs.on_next {|x| res = x == 1 }
548
+ obs.on_error {|err| flunk }
549
+ obs.on_completed { flunk }
550
+ end
551
+
552
+ s = RxRuby::Observer.prevent_reentrancy o
553
+ s.on_next 1
554
+
555
+ assert res
556
+ end
557
+
558
+ def test_synchronize_monitor_non_reentrant_error
559
+ res = nil
560
+ e = RuntimeError.new
561
+ s = nil
562
+
563
+ o = RxRuby::Observer.configure do |obs|
564
+ obs.on_next {|x| flunk }
565
+ obs.on_error {|err| res = err }
566
+ obs.on_completed { flunk }
567
+ end
568
+
569
+ s = RxRuby::Observer.prevent_reentrancy o
570
+ s.on_error e
571
+
572
+ assert_same e, res
573
+ end
574
+
575
+ def test_synchronize_monitor_non_reentrant_completed
576
+ res = false
577
+ s = nil
578
+
579
+ o = RxRuby::Observer.configure do |obs|
580
+ obs.on_next {|x| flunk }
581
+ obs.on_error {|err| flunk }
582
+ obs.on_completed { res = true }
583
+ end
584
+
585
+ s = RxRuby::Observer.prevent_reentrancy o
586
+ s.on_completed
587
+
588
+ assert res
589
+ end
590
+
591
+ def test_notify_on_success
592
+ c = 0
593
+ num = 100
594
+
595
+ o = RxRuby::Observer.configure do |obs|
596
+ obs.on_next {|x| c += 1 }
597
+ obs.on_error {|err| flunk }
598
+ obs.on_completed { }
599
+ end
600
+
601
+ s = RxRuby::ImmediateScheduler.instance
602
+ n = o.notify_on(s)
603
+
604
+ for i in 0..num
605
+ n.on_next i
606
+ end
607
+
608
+ n.on_completed
609
+
610
+ assert_equal c, 101
611
+ end
612
+
613
+ def test_notify_on_error
614
+ c = 0
615
+ num = 100
616
+ err = RuntimeError.new
617
+
618
+ o = RxRuby::Observer.configure do |obs|
619
+ obs.on_next {|x| c += 1 }
620
+ obs.on_error {|e| assert_same err, e }
621
+ obs.on_completed { flunk }
622
+ end
623
+
624
+ s = RxRuby::ImmediateScheduler.instance
625
+ n = o.notify_on(s)
626
+
627
+ for i in 0..num
628
+ n.on_next i
629
+ end
630
+
631
+ n.on_error err
632
+ end
633
+
634
+ end