Skip to content

Commit 0026ea4

Browse files
Merge pull request ReactiveX#567 from akarnokd/TimestampWithScheduler
Operation Timestamp with Scheduler
2 parents 9e7d56d + 14dd0b1 commit 0026ea4

File tree

3 files changed

+111
-0
lines changed

3 files changed

+111
-0
lines changed

rxjava-core/src/main/java/rx/Observable.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2208,6 +2208,19 @@ public Observable<Timestamped<T>> timestamp() {
22082208
return create(OperationTimestamp.timestamp(this));
22092209
}
22102210

2211+
/**
2212+
* Wraps each item emitted by a source Observable in a {@link Timestamped}
2213+
* object with timestamps provided by the given Scheduler.
2214+
*
2215+
* @param scheduler the {@link Scheduler} to use as a time source.
2216+
* @return an Observable that emits timestamped items from the source
2217+
* Observable with timestamps provided by the given Scheduler
2218+
* @see <a href='http://msdn.microsoft.com/en-us/library/hh229003.aspx'>MSDN: Observable.Timestamp</a>
2219+
*/
2220+
public Observable<Timestamped<T>> timestamp(Scheduler scheduler) {
2221+
return create(OperationTimestamp.timestamp(this, scheduler));
2222+
}
2223+
22112224
/**
22122225
* Converts a {@link Future} into an Observable.
22132226
* <p>

rxjava-core/src/main/java/rx/operators/OperationTimestamp.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import rx.Observable;
1919
import rx.Observable.OnSubscribeFunc;
20+
import rx.Scheduler;
2021
import rx.util.Timestamped;
2122
import rx.util.functions.Func1;
2223

@@ -44,4 +45,15 @@ public Timestamped<T> call(T value) {
4445
}
4546
});
4647
}
48+
/**
49+
* Timestamp the source elements based on the timing provided by the scheduler.
50+
*/
51+
public static <T> OnSubscribeFunc<Timestamped<T>> timestamp(Observable<? extends T> source, final Scheduler scheduler) {
52+
return OperationMap.map(source, new Func1<T, Timestamped<T>>() {
53+
@Override
54+
public Timestamped<T> call(T value) {
55+
return new Timestamped<T>(scheduler.now(), value);
56+
}
57+
});
58+
}
4759
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/**
2+
* Copyright 2013 Netflix, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package rx.operators;
17+
18+
import java.util.concurrent.TimeUnit;
19+
import org.junit.Before;
20+
import org.junit.Test;
21+
import org.mockito.InOrder;
22+
import org.mockito.Mock;
23+
import static org.mockito.Mockito.*;
24+
import org.mockito.MockitoAnnotations;
25+
import rx.Observable;
26+
import rx.Observer;
27+
import rx.concurrency.TestScheduler;
28+
import rx.subjects.PublishSubject;
29+
import rx.util.Timestamped;
30+
31+
public class OperationTimestampTest {
32+
@Mock
33+
Observer<Object> observer;
34+
@Before
35+
public void before() {
36+
MockitoAnnotations.initMocks(this);
37+
}
38+
@Test
39+
public void timestampWithScheduler() {
40+
TestScheduler scheduler = new TestScheduler();
41+
42+
PublishSubject<Integer> source = PublishSubject.create();
43+
Observable<Timestamped<Integer>> m = source.timestamp(scheduler);
44+
m.subscribe(observer);
45+
46+
source.onNext(1);
47+
scheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
48+
source.onNext(2);
49+
scheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
50+
source.onNext(3);
51+
52+
53+
InOrder inOrder = inOrder(observer);
54+
55+
inOrder.verify(observer, times(1)).onNext(new Timestamped<Integer>(0, 1));
56+
inOrder.verify(observer, times(1)).onNext(new Timestamped<Integer>(100, 2));
57+
inOrder.verify(observer, times(1)).onNext(new Timestamped<Integer>(200, 3));
58+
59+
verify(observer, never()).onError(any(Throwable.class));
60+
verify(observer, never()).onCompleted();
61+
}
62+
@Test
63+
public void timestampWithScheduler2() {
64+
TestScheduler scheduler = new TestScheduler();
65+
66+
PublishSubject<Integer> source = PublishSubject.create();
67+
Observable<Timestamped<Integer>> m = source.timestamp(scheduler);
68+
m.subscribe(observer);
69+
70+
source.onNext(1);
71+
source.onNext(2);
72+
scheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
73+
scheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
74+
source.onNext(3);
75+
76+
77+
InOrder inOrder = inOrder(observer);
78+
79+
inOrder.verify(observer, times(1)).onNext(new Timestamped<Integer>(0, 1));
80+
inOrder.verify(observer, times(1)).onNext(new Timestamped<Integer>(0, 2));
81+
inOrder.verify(observer, times(1)).onNext(new Timestamped<Integer>(200, 3));
82+
83+
verify(observer, never()).onError(any(Throwable.class));
84+
verify(observer, never()).onCompleted();
85+
}
86+
}

0 commit comments

Comments
 (0)