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,44 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'test_helper'
4
+ require 'rx_ruby/concurrency/helpers/immediate_local_scheduler_helper'
5
+
6
+
7
+ class TestCurrentThreadScheduler < Minitest::Test
8
+ include ImmediateLocalSchedulerTestHelper
9
+
10
+ def setup
11
+ @scheduler = RxRuby::CurrentThreadScheduler.instance
12
+ end
13
+
14
+ def test_schedule_required
15
+ assert_equal(true, RxRuby::CurrentThreadScheduler.schedule_required?)
16
+ end
17
+
18
+ def test_schedule
19
+ ran = false
20
+ @scheduler.schedule -> { ran = true }
21
+
22
+ assert_equal(true, ran)
23
+ end
24
+
25
+ def test_schedule_runs_in_current_thead
26
+ id = Thread.current.object_id
27
+ @scheduler.schedule -> { assert_equal(id, Thread.current.object_id) }
28
+ end
29
+
30
+ def test_schedule_error_raises
31
+ assert_raises(StandardError) do
32
+ @scheduler.schedule -> { raise StandardError }
33
+ end
34
+ end
35
+
36
+ def test_schedule_nested
37
+ ran = false
38
+ @scheduler.schedule -> do
39
+ @scheduler.schedule -> { ran = true }
40
+ end
41
+
42
+ assert_equal(true, ran)
43
+ end
44
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'test_helper'
4
+
5
+ # DefaultScheduler creates new threads in which to run scheduled tasks; a short
6
+ # sleep is necessary to allow the thread scheduler to yield to the other
7
+ # threads.
8
+ class TestDefaultScheduler < Minitest::Test
9
+
10
+ def setup
11
+ @scheduler = RxRuby::DefaultScheduler.instance
12
+ end
13
+
14
+ def test_schedule_with_state
15
+ state = []
16
+ task = ->(_, s) { s << 1 }
17
+ d = @scheduler.schedule_with_state(state, task)
18
+ sleep 0.001
19
+
20
+ assert_equal([1], state)
21
+ end
22
+
23
+ def test_schedule_relative_with_state
24
+ state = []
25
+ task = ->(_, s) { s << 1 }
26
+ d = @scheduler.schedule_relative_with_state(state, 0.05, task)
27
+ sleep 0.1
28
+
29
+ assert_equal([1], state)
30
+ end
31
+
32
+ def test_default_schedule_runs_in_its_own_thread
33
+ id = Thread.current.object_id
34
+ @scheduler.schedule -> { refute_equal(id, Thread.current.object_id) }
35
+ sleep 0.001
36
+ end
37
+
38
+ def test_schedule_action_cancel
39
+ task = -> { flunk "This should not run." }
40
+ subscription = @scheduler.schedule_relative(0.05, task)
41
+ subscription.unsubscribe
42
+ sleep 0.1
43
+ end
44
+ end
@@ -0,0 +1,18 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'test_helper'
4
+ require 'rx_ruby/concurrency/helpers/historical_virtual_scheduler_helper'
5
+
6
+ class TestHistoricalScheduler < Minitest::Test
7
+ include HistoricalVirtualSchedulerTestHelper
8
+
9
+ def setup
10
+ @start = Time.at(1000)
11
+ @scheduler = RxRuby::HistoricalScheduler.new(@start)
12
+ end
13
+
14
+ def test_initialization
15
+ assert_equal(Time.at(1000), @scheduler.now)
16
+ assert_equal(Time.at(0), RxRuby::HistoricalScheduler.new.now)
17
+ end
18
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'test_helper'
4
+ require 'rx_ruby/concurrency/helpers/immediate_local_scheduler_helper'
5
+
6
+ class TestImmediateScheduler < Minitest::Test
7
+ include ImmediateLocalSchedulerTestHelper
8
+
9
+ def setup
10
+ @scheduler = RxRuby::ImmediateScheduler.instance
11
+ end
12
+
13
+ def test_now
14
+ assert_equal(Time.now.to_i, @scheduler.now.to_i)
15
+ end
16
+
17
+ def test_immediate_schedule
18
+ ran = false
19
+ @scheduler.schedule -> { ran = true }
20
+ assert_equal(true, ran)
21
+ end
22
+
23
+ def test_immediate_schedule_runs_in_current_thread
24
+ id = Thread.current.object_id
25
+ @scheduler.schedule -> { assert_equal(id, Thread.current.object_id) }
26
+ end
27
+
28
+ def test_schedule_error_raises
29
+ task = -> do
30
+ raise(StandardError)
31
+ flunk "Should not be reached."
32
+ end
33
+
34
+ assert_raises(StandardError) { @scheduler.schedule(task) }
35
+ end
36
+
37
+ def test_schedule_with_state_simple
38
+ state = []
39
+ task = ->(_, s) { s << 1 }
40
+ @scheduler.schedule_with_state(state, task)
41
+
42
+ assert_equal([1], state)
43
+ end
44
+
45
+ def test_schedule_recursive_with_state_simple
46
+ state = []
47
+ inner = ->(_, s) { s << 1 }
48
+ outer = ->(sched, s) { sched.schedule_with_state(s, inner) }
49
+ @scheduler.schedule_with_state(state, outer)
50
+
51
+ assert_equal([1], state)
52
+ end
53
+ end
@@ -0,0 +1,12 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'test_helper'
4
+ require 'rx_ruby/concurrency/helpers/immediate_local_scheduler_helper'
5
+
6
+ class TestLocalcheduler < Minitest::Test
7
+ include ImmediateLocalSchedulerTestHelper
8
+
9
+ def setup
10
+ @scheduler = RxRuby::LocalScheduler.new
11
+ end
12
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'test_helper'
4
+
5
+ class PeriodicTestClass
6
+ include RxRuby::PeriodicScheduler
7
+ end
8
+
9
+ class TestPeriodicScheduler < Minitest::Test
10
+ def setup
11
+ @scheduler = PeriodicTestClass.new
12
+ end
13
+
14
+ def test_periodic_with_state
15
+ state = []
16
+ task = ->(x) { x << 1 }
17
+
18
+ subscription = @scheduler.schedule_periodic_with_state(state, 0.01, task)
19
+ sleep 0.025
20
+ subscription.unsubscribe
21
+ assert_equal(state.length, 2)
22
+ end
23
+
24
+ def test_periodic_with_state_exceptions
25
+ assert_raises(RuntimeError) do
26
+ @scheduler.schedule_periodic_with_state([], 0.01, nil)
27
+ end
28
+
29
+ assert_raises(RuntimeError) do
30
+ @scheduler.schedule_periodic_with_state([], -1, ->{})
31
+ end
32
+ end
33
+
34
+ def test_periodic
35
+ state = []
36
+ task = ->() { state << 1 }
37
+
38
+ subscription = @scheduler.schedule_periodic(0.01, task)
39
+ sleep 0.025
40
+ subscription.unsubscribe
41
+ assert_equal(state.length, 2)
42
+ end
43
+
44
+ def test_periodic_exceptions
45
+ assert_raises(RuntimeError) do
46
+ @scheduler.schedule_periodic(0.01, nil)
47
+ end
48
+
49
+ assert_raises(RuntimeError) do
50
+ @scheduler.schedule_periodic(-1, ->{})
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'test_helper'
4
+
5
+ class DummyScheduler
6
+ end
7
+
8
+ class TestScheduledItem < Minitest::Test
9
+
10
+ def setup
11
+ @state = []
12
+ @item = RxRuby::ScheduledItem.new(DummyScheduler.new, @state, 5) do |_, state|
13
+ state << 1
14
+ end
15
+ end
16
+
17
+ def test_cancel
18
+ assert_equal(false, @item.cancelled?)
19
+ @item.cancel
20
+ assert_equal(true, @item.cancelled?)
21
+ end
22
+
23
+ def test_invocation
24
+ less = RxRuby::ScheduledItem.new(DummyScheduler.new, @state, 0)
25
+ more = RxRuby::ScheduledItem.new(DummyScheduler.new, @state, 10)
26
+ same = RxRuby::ScheduledItem.new(DummyScheduler.new, @state, 5)
27
+
28
+ assert(less < @item)
29
+ assert(more > @item)
30
+ assert_equal(same, @item)
31
+ end
32
+
33
+ def test_invoke
34
+ @item.invoke
35
+ assert_equal([1], @state)
36
+ end
37
+
38
+ def test_invoke_raises_on_subsequent_calls
39
+ @item.invoke
40
+ assert_raises(RuntimeError) { @item.invoke }
41
+ end
42
+
43
+ def test_cancel
44
+ assert_equal(false, @item.cancelled?)
45
+ @item.cancel
46
+ assert_equal(true, @item.cancelled?)
47
+ @item.invoke
48
+ assert_equal([], @state)
49
+ end
50
+ end
@@ -0,0 +1,128 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'thread'
4
+ require 'test_helper'
5
+
6
+ class MyScheduler
7
+ include RxRuby::Scheduler
8
+
9
+ attr_reader :now
10
+ attr_accessor :wait_cycles
11
+
12
+ def initialize(now = Time.now)
13
+ @now = now
14
+ @wait_cycles = 0
15
+ @check = nil
16
+ end
17
+
18
+ def check(&action)
19
+ @check = action
20
+ end
21
+
22
+ def schedule_with_state(state, action)
23
+ action.call self, state
24
+ end
25
+
26
+ def schedule_relative_with_state(state, due_time, action)
27
+ @check.call(lambda {|o| action.call(self, o)}, state, due_time)
28
+ @wait_cycles += due_time
29
+ action.call(self, state)
30
+ end
31
+
32
+ def schedule_absolute_with_state(state, due_time, action)
33
+ self.schedule_relative_with_state(state, due_time - now, action)
34
+ end
35
+ end
36
+
37
+ class TestBaseScheduler < Minitest::Test
38
+
39
+ def setup
40
+ @scheduler = MyScheduler.new
41
+ end
42
+
43
+ def test_now
44
+ assert_equal(Time.now.to_i, RxRuby::Scheduler.now.to_i)
45
+ end
46
+
47
+ def test_schedule_absolute
48
+ due = Time.now + 1
49
+ ran = false
50
+ task = ->() { ran = true }
51
+
52
+ @scheduler.check { |a, s, t| assert_equal(1, t.to_i) }
53
+ @scheduler.schedule_absolute(due, task)
54
+
55
+ assert_equal(true, ran)
56
+ assert_equal(1, @scheduler.wait_cycles.to_i)
57
+ end
58
+
59
+ def test_schedule_non_recursive
60
+ ran = false
61
+ @scheduler.schedule_recursive(->(a) { ran = true })
62
+ assert_equal(true, ran)
63
+ end
64
+
65
+ def test_schedule_recursive
66
+ calls = 0
67
+ task = ->(a) do
68
+ calls += 1
69
+ a.call if calls < 10
70
+ end
71
+ @scheduler.schedule_recursive(task)
72
+
73
+ assert_equal(10, calls)
74
+ end
75
+
76
+ def test_schedule_recursive_absolute_non_recursive
77
+ now = Time.now
78
+ ran = false
79
+
80
+ @scheduler.check { |a, s, t| assert_equal(0, t.to_i) }
81
+ @scheduler.schedule_recursive_absolute(now, ->(a) { ran = true })
82
+ assert_equal(true, ran)
83
+ assert_equal(0, @scheduler.wait_cycles.to_i)
84
+ end
85
+
86
+ def test_schedule_recursive_absolute_recursive
87
+ now = Time.now
88
+ calls = 0
89
+ task = ->(a) do
90
+ calls += 1
91
+ a.call(now) if calls < 10
92
+ end
93
+
94
+ @scheduler.check { |a, s, t| assert_equal(0, t.to_i) }
95
+ @scheduler.schedule_recursive_absolute(now, task)
96
+
97
+ assert_equal(0, @scheduler.wait_cycles.to_i)
98
+ assert_equal(10, calls)
99
+ end
100
+
101
+ def test_schedule_recursive_relative_non_recursive
102
+ now = Time.now
103
+ ran = false
104
+ task = ->(a) { ran = true }
105
+
106
+ @scheduler.check { |a, s, t| assert_equal(0, t.to_i) }
107
+ @scheduler.schedule_recursive_relative(0, task)
108
+
109
+ assert_equal(true, ran)
110
+ assert_equal(0, @scheduler.wait_cycles)
111
+ end
112
+
113
+ def test_schedule_recursive_relative_recursive
114
+ now = Time.now
115
+ calls = 0
116
+ task = ->(a) do
117
+ calls += 1
118
+ a.call(calls) if calls < 10
119
+ end
120
+
121
+ @scheduler.check { |a, s, t| assert_operator(t, :<, 10) }
122
+
123
+ @scheduler.schedule_recursive_relative(0, task)
124
+ assert_equal(45, @scheduler.wait_cycles)
125
+ assert_equal(10, calls)
126
+ end
127
+
128
+ end
@@ -0,0 +1,14 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'test_helper'
4
+ require 'rx_ruby/concurrency/helpers/historical_virtual_scheduler_helper'
5
+
6
+ class TestVirtualTimeScheduler < Minitest::Test
7
+
8
+ include HistoricalVirtualSchedulerTestHelper
9
+
10
+ def setup
11
+ @start = Time.now.to_i
12
+ @scheduler = RxRuby::VirtualTimeScheduler.new(@start)
13
+ end
14
+ end
@@ -0,0 +1,129 @@
1
+ # Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
+
3
+ require 'test_helper'
4
+
5
+ class TestNotification < Minitest::Test
6
+ include RxRuby::ReactiveTest
7
+
8
+ def test_to_observable_empty
9
+ scheduler = RxRuby::TestScheduler.new
10
+
11
+ res = scheduler.configure do
12
+ RxRuby::Notification.create_on_completed.to_observable(scheduler)
13
+ end
14
+
15
+ assert_messages [on_completed(201)], res.messages
16
+ end
17
+
18
+ def test_to_observable_just
19
+ scheduler = RxRuby::TestScheduler.new
20
+
21
+ res = scheduler.configure do
22
+ RxRuby::Notification.create_on_next(42).to_observable(scheduler)
23
+ end
24
+
25
+ assert_messages [on_next(201, 42), on_completed(201)], res.messages
26
+ end
27
+
28
+ def test_to_observable_raise
29
+ err = RuntimeError.new
30
+ scheduler = RxRuby::TestScheduler.new
31
+
32
+ res = scheduler.configure do
33
+ RxRuby::Notification.create_on_error(err).to_observable(scheduler)
34
+ end
35
+
36
+ assert_messages [on_error(201, err)], res.messages
37
+ end
38
+
39
+ def test_notification_equality
40
+ n = RxRuby::Notification.create_on_next(42)
41
+ e = RxRuby::Notification.create_on_error(RuntimeError.new)
42
+ c = RxRuby::Notification.create_on_completed
43
+
44
+ n1 = n
45
+ n2 = n
46
+ e1 = e
47
+ e2 = e
48
+ c1 = c
49
+ c2 = c
50
+
51
+ assert(n1 == n2)
52
+ assert(e1 == e2)
53
+ assert(c1 == c2)
54
+
55
+ assert(n1.eql? n2)
56
+ assert(e1.eql? e2)
57
+ assert(c1.eql? c2)
58
+ end
59
+
60
+ def test_on_next_initialize
61
+ n = RxRuby::Notification.create_on_next(42)
62
+
63
+ assert n.on_next?
64
+ assert n.has_value?
65
+ assert_equal 42, n.value
66
+ end
67
+
68
+ def test_on_next_equality
69
+ n1 = RxRuby::Notification.create_on_next(42)
70
+ n2 = RxRuby::Notification.create_on_next(42)
71
+ n3 = RxRuby::Notification.create_on_next(24)
72
+ n4 = RxRuby::Notification.create_on_completed
73
+
74
+ assert(n1.eql? n1)
75
+ assert(n1.eql? n2)
76
+ refute(n1.eql? n3)
77
+ refute(n3.eql? n1)
78
+ refute(n1.eql? n4)
79
+ refute(n4.eql? n1)
80
+ end
81
+
82
+ def test_on_next_to_s
83
+ n = RxRuby::Notification.create_on_next(42)
84
+ s = n.to_s
85
+
86
+ assert (s.include? '42')
87
+ assert (s.include? 'on_next')
88
+ end
89
+
90
+ class AcceptObserver
91
+ include RxRuby::Observer
92
+
93
+ def initialize
94
+ @config = RxRuby::ObserverConfiguration.new
95
+ yield @config
96
+ end
97
+
98
+ def on_next(value)
99
+ @config.on_next_action.call value
100
+ end
101
+
102
+ def on_error(error)
103
+ @config.on_error_action.call error
104
+ end
105
+
106
+ def on_completed
107
+ @config.on_completed_action.call
108
+ end
109
+ end
110
+
111
+ class CheckOnNextObserver
112
+ attr_reader :value
113
+
114
+ include RxRuby::Observer
115
+
116
+ def on_next(value)
117
+ @value = value
118
+ end
119
+ end
120
+
121
+ def test_on_next_accept
122
+ con = CheckOnNextObserver.new
123
+ n1 = RxRuby::Notification.create_on_next(42)
124
+ n1.accept(con)
125
+
126
+ assert_equal 42, con.value
127
+ end
128
+
129
+ end