|
20 | 20 | import java.util.Queue;
|
21 | 21 | import java.util.concurrent.TimeUnit;
|
22 | 22 |
|
| 23 | +import rx.Scheduler; |
23 | 24 | import rx.Subscription;
|
24 | 25 | import rx.subscriptions.Subscriptions;
|
25 |
| -import rx.util.functions.Func0; |
| 26 | +import rx.util.functions.Func2; |
26 | 27 |
|
27 |
| -public class TestScheduler extends AbstractScheduler { |
28 |
| - private final Queue<TimedAction> queue = new PriorityQueue<TimedAction>(11, new CompareActionsByTime()); |
29 |
| - |
30 |
| - private static class TimedAction { |
| 28 | +public class TestScheduler extends Scheduler { |
| 29 | + private final Queue<TimedAction<?>> queue = new PriorityQueue<TimedAction<?>>(11, new CompareActionsByTime()); |
| 30 | + |
| 31 | + private static class TimedAction<T> { |
31 | 32 | private final long time;
|
32 |
| - private final Func0<Subscription> action; |
| 33 | + private final Func2<Scheduler, T, Subscription> action; |
| 34 | + private final T state; |
| 35 | + private final TestScheduler scheduler; |
33 | 36 |
|
34 |
| - private TimedAction(long time, Func0<Subscription> action) { |
| 37 | + private TimedAction(TestScheduler scheduler, long time, Func2<Scheduler, T, Subscription> action, T state) { |
35 | 38 | this.time = time;
|
36 | 39 | this.action = action;
|
| 40 | + this.state = state; |
| 41 | + this.scheduler = scheduler; |
37 | 42 | }
|
38 |
| - |
| 43 | + |
39 | 44 | @Override
|
40 | 45 | public String toString() {
|
41 | 46 | return String.format("TimedAction(time = %d, action = %s)", time, action.toString());
|
42 | 47 | }
|
43 | 48 | }
|
44 |
| - |
45 |
| - private static class CompareActionsByTime implements Comparator<TimedAction> { |
46 |
| - @Override |
47 |
| - public int compare(TimedAction action1, TimedAction action2) { |
48 |
| - return Long.valueOf(action1.time).compareTo(Long.valueOf(action2.time)); |
49 |
| - } |
| 49 | + |
| 50 | + private static class CompareActionsByTime implements Comparator<TimedAction<?>> { |
| 51 | + @Override |
| 52 | + public int compare(TimedAction<?> action1, TimedAction<?> action2) { |
| 53 | + return Long.valueOf(action1.time).compareTo(Long.valueOf(action2.time)); |
| 54 | + } |
50 | 55 | }
|
51 |
| - |
| 56 | + |
52 | 57 | private long time;
|
53 |
| - |
54 |
| - @Override |
55 |
| - public Subscription schedule(Func0<Subscription> action) { |
56 |
| - return schedule(action, 0L, TimeUnit.NANOSECONDS); |
57 |
| - } |
58 | 58 |
|
59 |
| - @Override |
60 |
| - public Subscription schedule(Func0<Subscription> action, long dueTime, TimeUnit unit) { |
61 |
| - queue.add(new TimedAction(now() + unit.toNanos(dueTime), action)); |
62 |
| - return Subscriptions.empty(); |
63 |
| - } |
64 |
| - |
65 | 59 | @Override
|
66 | 60 | public long now() {
|
67 | 61 | return time;
|
68 | 62 | }
|
69 | 63 |
|
70 |
| - public void advanceTimeBy(long dueTime, TimeUnit unit) { |
71 |
| - advanceTimeTo(time + unit.toNanos(dueTime), TimeUnit.NANOSECONDS); |
| 64 | + public void advanceTimeBy(long delayTime, TimeUnit unit) { |
| 65 | + advanceTimeTo(time + unit.toNanos(delayTime), TimeUnit.NANOSECONDS); |
72 | 66 | }
|
73 |
| - |
74 |
| - public void advanceTimeTo(long dueTime, TimeUnit unit) { |
75 |
| - long targetTime = unit.toNanos(dueTime); |
| 67 | + |
| 68 | + public void advanceTimeTo(long delayTime, TimeUnit unit) { |
| 69 | + long targetTime = unit.toNanos(delayTime); |
76 | 70 | triggerActions(targetTime);
|
77 | 71 | }
|
78 | 72 |
|
79 | 73 | public void triggerActions() {
|
80 |
| - triggerActions(time); |
| 74 | + triggerActions(time); |
81 | 75 | }
|
82 |
| - |
| 76 | + |
| 77 | + @SuppressWarnings("unchecked") |
83 | 78 | private void triggerActions(long targetTimeInNanos) {
|
84 |
| - while (! queue.isEmpty()) { |
85 |
| - TimedAction current = queue.peek(); |
| 79 | + while (!queue.isEmpty()) { |
| 80 | + TimedAction<?> current = queue.peek(); |
86 | 81 | if (current.time > targetTimeInNanos) {
|
87 | 82 | break;
|
88 | 83 | }
|
89 | 84 | time = current.time;
|
90 | 85 | queue.remove();
|
91 |
| - current.action.call(); |
| 86 | + // because the queue can have wildcards we have to ignore the type T for the state |
| 87 | + ((Func2<Scheduler, Object, Subscription>) current.action).call(current.scheduler, current.state); |
92 | 88 | }
|
93 | 89 | }
|
| 90 | + |
| 91 | + @Override |
| 92 | + public <T> Subscription schedule(T state, Func2<Scheduler, T, Subscription> action) { |
| 93 | + return schedule(state, action, 0, TimeUnit.MILLISECONDS); |
| 94 | + } |
| 95 | + |
| 96 | + @Override |
| 97 | + public <T> Subscription schedule(T state, Func2<Scheduler, T, Subscription> action, long delayTime, TimeUnit unit) { |
| 98 | + queue.add(new TimedAction<T>(this, now() + unit.toNanos(delayTime), action, state)); |
| 99 | + return Subscriptions.empty(); |
| 100 | + } |
94 | 101 | }
|
0 commit comments