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,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
|