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.
- checksums.yaml +7 -0
- data/.gitattributes +22 -0
- data/.gitignore +173 -0
- data/.travis.yml +10 -0
- data/Gemfile +4 -0
- data/Rakefile +11 -0
- data/examples/aggregate.rb +39 -0
- data/examples/amb.rb +25 -0
- data/examples/ambproto.rb +24 -0
- data/examples/and.rb +26 -0
- data/examples/as_observable.rb +25 -0
- data/examples/average.rb +43 -0
- data/examples/buffer_with_count.rb +44 -0
- data/examples/buffer_with_time.rb +51 -0
- data/examples/case.rb +29 -0
- data/examples/catch.rb +20 -0
- data/examples/catchproto.rb +39 -0
- data/examples/combine_latest.rb +35 -0
- data/examples/combine_latestproto.rb +33 -0
- data/examples/concat.rb +22 -0
- data/examples/concat_all.rb +27 -0
- data/examples/concat_map.rb +61 -0
- data/examples/concat_map_observer.rb +29 -0
- data/examples/concatproto.rb +25 -0
- data/examples/connect.rb +41 -0
- data/examples/contains.rb +37 -0
- data/examples/count.rb +36 -0
- data/examples/create.rb +55 -0
- data/examples/debounce.rb +35 -0
- data/examples/default_if_empty.rb +35 -0
- data/examples/defer.rb +20 -0
- data/examples/delay.rb +49 -0
- data/examples/delay_with_selector.rb +63 -0
- data/examples/dematerialize.rb +22 -0
- data/examples/disposable.rb +12 -0
- data/examples/distinct.rb +43 -0
- data/examples/distinct_until_changed.rb +43 -0
- data/examples/do.rb +59 -0
- data/examples/empty.rb +16 -0
- data/examples/for.rb +26 -0
- data/examples/fork_join.rb +23 -0
- data/examples/from.rb +106 -0
- data/examples/from_array.rb +21 -0
- data/examples/from_callback.rb +21 -0
- data/examples/generate.rb +24 -0
- data/examples/group_join.rb +39 -0
- data/examples/if.rb +46 -0
- data/examples/intervals.rb +26 -0
- data/examples/merge.rb +36 -0
- data/examples/merge_all.rb +27 -0
- data/examples/multicast.rb +32 -0
- data/examples/never.rb +15 -0
- data/examples/of.rb +19 -0
- data/examples/on_error_resume_next.rb +21 -0
- data/examples/pairs.rb +26 -0
- data/examples/publish.rb +79 -0
- data/examples/range.rb +19 -0
- data/examples/reduce.rb +18 -0
- data/examples/repeat.rb +19 -0
- data/examples/return.rb +17 -0
- data/examples/scan.rb +41 -0
- data/examples/start.rb +29 -0
- data/examples/throw.rb +17 -0
- data/examples/time_intervals.rb +28 -0
- data/examples/timer.rb +26 -0
- data/examples/timestamp.rb +28 -0
- data/examples/to_a.rb +23 -0
- data/examples/to_async.rb +26 -0
- data/examples/using.rb +52 -0
- data/examples/when.rb +26 -0
- data/examples/while.rb +25 -0
- data/examples/window_with_time.rb +78 -0
- data/examples/zip.rb +27 -0
- data/examples/zip_array.rb +25 -0
- data/lib/core_ext/enumerable.rb +22 -0
- data/lib/rx_ruby.rb +27 -0
- data/lib/rx_ruby/concurrency/async_lock.rb +57 -0
- data/lib/rx_ruby/concurrency/current_thread_scheduler.rb +75 -0
- data/lib/rx_ruby/concurrency/default_scheduler.rb +51 -0
- data/lib/rx_ruby/concurrency/historical_scheduler.rb +16 -0
- data/lib/rx_ruby/concurrency/immediate_scheduler.rb +68 -0
- data/lib/rx_ruby/concurrency/local_scheduler.rb +39 -0
- data/lib/rx_ruby/concurrency/periodic_scheduler.rb +74 -0
- data/lib/rx_ruby/concurrency/scheduled_item.rb +42 -0
- data/lib/rx_ruby/concurrency/scheduler.rb +150 -0
- data/lib/rx_ruby/concurrency/virtual_time_scheduler.rb +170 -0
- data/lib/rx_ruby/core/async_lock_observer.rb +46 -0
- data/lib/rx_ruby/core/auto_detach_observer.rb +59 -0
- data/lib/rx_ruby/core/checked_observer.rb +66 -0
- data/lib/rx_ruby/core/notification.rb +161 -0
- data/lib/rx_ruby/core/observable.rb +104 -0
- data/lib/rx_ruby/core/observe_on_observer.rb +50 -0
- data/lib/rx_ruby/core/observer.rb +119 -0
- data/lib/rx_ruby/core/scheduled_observer.rb +83 -0
- data/lib/rx_ruby/core/synchronized_observer.rb +47 -0
- data/lib/rx_ruby/core/time_interval.rb +17 -0
- data/lib/rx_ruby/internal/priority_queue.rb +122 -0
- data/lib/rx_ruby/internal/util.rb +9 -0
- data/lib/rx_ruby/joins/active_plan.rb +45 -0
- data/lib/rx_ruby/joins/join_observer.rb +51 -0
- data/lib/rx_ruby/joins/pattern.rb +14 -0
- data/lib/rx_ruby/joins/plan.rb +44 -0
- data/lib/rx_ruby/linq/connectable_observable.rb +34 -0
- data/lib/rx_ruby/linq/observable/_observable_timer_date_and_period.rb +22 -0
- data/lib/rx_ruby/linq/observable/_observable_timer_time_span.rb +14 -0
- data/lib/rx_ruby/linq/observable/_observable_timer_time_span_and_period.rb +20 -0
- data/lib/rx_ruby/linq/observable/aggregate.rb +7 -0
- data/lib/rx_ruby/linq/observable/and.rb +7 -0
- data/lib/rx_ruby/linq/observable/case.rb +15 -0
- data/lib/rx_ruby/linq/observable/concat_all.rb +7 -0
- data/lib/rx_ruby/linq/observable/concat_map.rb +35 -0
- data/lib/rx_ruby/linq/observable/concat_map_observer.rb +43 -0
- data/lib/rx_ruby/linq/observable/contains.rb +28 -0
- data/lib/rx_ruby/linq/observable/debounce.rb +41 -0
- data/lib/rx_ruby/linq/observable/delay.rb +81 -0
- data/lib/rx_ruby/linq/observable/delay_with_selector.rb +64 -0
- data/lib/rx_ruby/linq/observable/do.rb +42 -0
- data/lib/rx_ruby/linq/observable/for.rb +13 -0
- data/lib/rx_ruby/linq/observable/fork_join.rb +55 -0
- data/lib/rx_ruby/linq/observable/from.rb +34 -0
- data/lib/rx_ruby/linq/observable/group_join.rb +108 -0
- data/lib/rx_ruby/linq/observable/if.rb +17 -0
- data/lib/rx_ruby/linq/observable/interval.rb +5 -0
- data/lib/rx_ruby/linq/observable/multicast.rb +14 -0
- data/lib/rx_ruby/linq/observable/of.rb +11 -0
- data/lib/rx_ruby/linq/observable/pairs.rb +7 -0
- data/lib/rx_ruby/linq/observable/pluck.rb +7 -0
- data/lib/rx_ruby/linq/observable/publish.rb +11 -0
- data/lib/rx_ruby/linq/observable/start.rb +7 -0
- data/lib/rx_ruby/linq/observable/time_interval.rb +15 -0
- data/lib/rx_ruby/linq/observable/timer.rb +26 -0
- data/lib/rx_ruby/linq/observable/timestamp.rb +9 -0
- data/lib/rx_ruby/linq/observable/to_async.rb +40 -0
- data/lib/rx_ruby/linq/observable/when.rb +36 -0
- data/lib/rx_ruby/linq/observable/while.rb +41 -0
- data/lib/rx_ruby/operators/aggregates.rb +611 -0
- data/lib/rx_ruby/operators/creation.rb +220 -0
- data/lib/rx_ruby/operators/multiple.rb +735 -0
- data/lib/rx_ruby/operators/single.rb +399 -0
- data/lib/rx_ruby/operators/standard_query_operators.rb +279 -0
- data/lib/rx_ruby/operators/synchronization.rb +47 -0
- data/lib/rx_ruby/operators/time.rb +120 -0
- data/lib/rx_ruby/subjects/async_subject.rb +161 -0
- data/lib/rx_ruby/subjects/behavior_subject.rb +149 -0
- data/lib/rx_ruby/subjects/replay_subject.rb +39 -0
- data/lib/rx_ruby/subjects/subject.rb +131 -0
- data/lib/rx_ruby/subjects/subject_extensions.rb +45 -0
- data/lib/rx_ruby/subscriptions/composite_subscription.rb +91 -0
- data/lib/rx_ruby/subscriptions/ref_count_subscription.rb +88 -0
- data/lib/rx_ruby/subscriptions/scheduled_subscription.rb +32 -0
- data/lib/rx_ruby/subscriptions/serial_subscription.rb +60 -0
- data/lib/rx_ruby/subscriptions/single_assignment_subscription.rb +64 -0
- data/lib/rx_ruby/subscriptions/subscription.rb +56 -0
- data/lib/rx_ruby/testing/cold_observable.rb +45 -0
- data/lib/rx_ruby/testing/hot_observable.rb +47 -0
- data/lib/rx_ruby/testing/mock_observer.rb +33 -0
- data/lib/rx_ruby/testing/reactive_test.rb +94 -0
- data/lib/rx_ruby/testing/recorded.rb +17 -0
- data/lib/rx_ruby/testing/test_scheduler.rb +96 -0
- data/lib/rx_ruby/testing/test_subscription.rb +22 -0
- data/lib/rx_ruby/version.rb +3 -0
- data/license.txt +13 -0
- data/readme.md +152 -0
- data/rx_ruby.gemspec +22 -0
- data/test/rx_ruby/concurrency/helpers/historical_virtual_scheduler_helper.rb +135 -0
- data/test/rx_ruby/concurrency/helpers/immediate_local_scheduler_helper.rb +51 -0
- data/test/rx_ruby/concurrency/test_async_lock.rb +56 -0
- data/test/rx_ruby/concurrency/test_current_thread_scheduler.rb +44 -0
- data/test/rx_ruby/concurrency/test_default_scheduler.rb +44 -0
- data/test/rx_ruby/concurrency/test_historical_scheduler.rb +18 -0
- data/test/rx_ruby/concurrency/test_immediate_scheduler.rb +53 -0
- data/test/rx_ruby/concurrency/test_local_scheduler.rb +12 -0
- data/test/rx_ruby/concurrency/test_periodic_scheduler.rb +53 -0
- data/test/rx_ruby/concurrency/test_scheduled_item.rb +50 -0
- data/test/rx_ruby/concurrency/test_scheduler.rb +128 -0
- data/test/rx_ruby/concurrency/test_virtual_time_scheduler.rb +14 -0
- data/test/rx_ruby/core/test_notification.rb +129 -0
- data/test/rx_ruby/core/test_observable_creation.rb +483 -0
- data/test/rx_ruby/core/test_observer.rb +634 -0
- data/test/rx_ruby/internal/test_priority_queue.rb +71 -0
- data/test/rx_ruby/subscriptions/test_composite_subscription.rb +116 -0
- data/test/rx_ruby/subscriptions/test_serial_subscription.rb +62 -0
- data/test/rx_ruby/subscriptions/test_singleassignment_subscription.rb +61 -0
- data/test/rx_ruby/subscriptions/test_subscription.rb +27 -0
- data/test/test_helper.rb +11 -0
- 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
|