Skip to content

Commit 27323ef

Browse files
Merge pull request ReactiveX#1903 from benjchristensen/testscheduler-1790
Fix TestScheduler Handling of Immediate vs Virtual Time
2 parents 27e2423 + 754c33f commit 27323ef

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

src/main/java/rx/schedulers/TestScheduler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ private void triggerActions(long targetTimeInNanos) {
111111
if (current.time > targetTimeInNanos) {
112112
break;
113113
}
114-
time = current.time;
114+
// if scheduled time is 0 (immediate) use current virtual time
115+
time = current.time == 0 ? time : current.time;
115116
queue.remove();
116117

117118
// Only execute if not unsubscribed
@@ -129,7 +130,7 @@ public Worker createWorker() {
129130

130131
private final class InnerTestScheduler extends Worker {
131132

132-
private BooleanSubscription s = new BooleanSubscription();
133+
private final BooleanSubscription s = new BooleanSubscription();
133134

134135
@Override
135136
public void unsubscribe() {

src/test/java/rx/schedulers/TestSchedulerTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@
2929
import org.mockito.InOrder;
3030
import org.mockito.Mockito;
3131

32+
import rx.Observable;
33+
import rx.Observable.OnSubscribe;
3234
import rx.Scheduler;
35+
import rx.Subscriber;
3336
import rx.Subscription;
3437
import rx.functions.Action0;
3538
import rx.functions.Func1;
@@ -160,4 +163,42 @@ public void call() {
160163
assertEquals(0, counter.get());
161164
}
162165

166+
@Test
167+
public final void testNestedSchedule() {
168+
final TestScheduler scheduler = new TestScheduler();
169+
final Scheduler.Worker inner = scheduler.createWorker();
170+
final Action0 calledOp = mock(Action0.class);
171+
172+
Observable<Object> poller;
173+
poller = Observable.create(new OnSubscribe<Object>() {
174+
@Override
175+
public void call(final Subscriber<? super Object> aSubscriber) {
176+
inner.schedule(new Action0() {
177+
@Override
178+
public void call() {
179+
if (!aSubscriber.isUnsubscribed()) {
180+
calledOp.call();
181+
inner.schedule(this, 5, TimeUnit.SECONDS);
182+
}
183+
}
184+
});
185+
}
186+
});
187+
188+
InOrder inOrder = Mockito.inOrder(calledOp);
189+
190+
Subscription sub;
191+
sub = poller.subscribe();
192+
193+
scheduler.advanceTimeTo(6, TimeUnit.SECONDS);
194+
inOrder.verify(calledOp, times(2)).call();
195+
196+
sub.unsubscribe();
197+
scheduler.advanceTimeTo(11, TimeUnit.SECONDS);
198+
inOrder.verify(calledOp, never()).call();
199+
200+
sub = poller.subscribe();
201+
scheduler.advanceTimeTo(12, TimeUnit.SECONDS);
202+
inOrder.verify(calledOp, times(1)).call();
203+
}
163204
}

0 commit comments

Comments
 (0)