32
32
import rx .Subscription ;
33
33
import rx .concurrency .Schedulers ;
34
34
import rx .concurrency .TestScheduler ;
35
+ import rx .observables .ConnectableObservable ;
35
36
import rx .subscriptions .Subscriptions ;
36
37
import rx .util .functions .Action0 ;
37
38
@@ -45,14 +46,20 @@ public final class OperationInterval {
45
46
* Creates an event each time interval.
46
47
*/
47
48
public static OnSubscribeFunc <Long > interval (long interval , TimeUnit unit ) {
48
- return new Interval (interval , unit , Schedulers .executor (Executors .newSingleThreadScheduledExecutor ()));
49
+ return interval (interval , unit , Schedulers .executor (Executors .newSingleThreadScheduledExecutor ()));
49
50
}
50
51
51
52
/**
52
53
* Creates an event each time interval.
53
54
*/
54
- public static OnSubscribeFunc <Long > interval (long interval , TimeUnit unit , Scheduler scheduler ) {
55
- return new Interval (interval , unit , scheduler );
55
+ public static OnSubscribeFunc <Long > interval (final long interval , final TimeUnit unit , final Scheduler scheduler ) {
56
+ // wrapped in order to work with multiple subscribers
57
+ return new OnSubscribeFunc <Long >() {
58
+ @ Override
59
+ public Subscription onSubscribe (Observer <? super Long > observer ) {
60
+ return new Interval (interval , unit , scheduler ).onSubscribe (observer );
61
+ }
62
+ };
56
63
}
57
64
58
65
private static class Interval implements OnSubscribeFunc <Long > {
@@ -188,7 +195,6 @@ public void testWithMultipleStaggeredSubscribers() {
188
195
189
196
inOrder1 .verify (observer , times (1 )).onNext (2L );
190
197
inOrder1 .verify (observer , times (1 )).onNext (3L );
191
- inOrder1 .verify (observer , never ()).onNext (4L );
192
198
193
199
InOrder inOrder2 = inOrder (observer2 );
194
200
inOrder2 .verify (observer2 , times (1 )).onNext (0L );
@@ -201,9 +207,50 @@ public void testWithMultipleStaggeredSubscribers() {
201
207
inOrder1 .verify (observer , times (1 )).onCompleted ();
202
208
verify (observer , never ()).onError (any (Throwable .class ));
203
209
204
- inOrder2 .verify (observer2 , never ()).onNext (2L );
210
+ inOrder2 .verify (observer2 , never ()).onNext (anyLong () );
205
211
inOrder2 .verify (observer2 , times (1 )).onCompleted ();
206
212
verify (observer2 , never ()).onError (any (Throwable .class ));
207
213
}
214
+
215
+ @ Test
216
+ public void testWithMultipleStaggeredSubscribersAndPublish () {
217
+ ConnectableObservable <Long > w = Observable .create (OperationInterval .interval (1 , TimeUnit .SECONDS , scheduler )).publish ();
218
+ Subscription sub1 = w .subscribe (observer );
219
+ w .connect ();
220
+
221
+ verify (observer , never ()).onNext (anyLong ());
222
+
223
+ scheduler .advanceTimeTo (2 , TimeUnit .SECONDS );
224
+ Subscription sub2 = w .subscribe (observer2 );
225
+
226
+ InOrder inOrder1 = inOrder (observer );
227
+ inOrder1 .verify (observer , times (1 )).onNext (0L );
228
+ inOrder1 .verify (observer , times (1 )).onNext (1L );
229
+ inOrder1 .verify (observer , never ()).onNext (2L );
230
+
231
+ verify (observer , never ()).onCompleted ();
232
+ verify (observer , never ()).onError (any (Throwable .class ));
233
+ verify (observer2 , never ()).onNext (anyLong ());
234
+
235
+ scheduler .advanceTimeTo (4 , TimeUnit .SECONDS );
236
+
237
+ inOrder1 .verify (observer , times (1 )).onNext (2L );
238
+ inOrder1 .verify (observer , times (1 )).onNext (3L );
239
+
240
+ InOrder inOrder2 = inOrder (observer2 );
241
+ inOrder2 .verify (observer2 , times (1 )).onNext (2L );
242
+ inOrder2 .verify (observer2 , times (1 )).onNext (3L );
243
+
244
+ sub1 .unsubscribe ();
245
+ sub2 .unsubscribe ();
246
+
247
+ inOrder1 .verify (observer , never ()).onNext (anyLong ());
248
+ inOrder1 .verify (observer , never ()).onCompleted ();
249
+ verify (observer , never ()).onError (any (Throwable .class ));
250
+
251
+ inOrder2 .verify (observer2 , never ()).onNext (anyLong ());
252
+ inOrder2 .verify (observer2 , never ()).onCompleted ();
253
+ verify (observer2 , never ()).onError (any (Throwable .class ));
254
+ }
208
255
}
209
256
}
0 commit comments