|
15 | 15 | */
|
16 | 16 | package rx.internal.operators;
|
17 | 17 |
|
| 18 | +import static java.util.Arrays.asList; |
18 | 19 | import static org.junit.Assert.assertEquals;
|
19 | 20 | import static org.junit.Assert.assertFalse;
|
20 | 21 | import static org.junit.Assert.assertTrue;
|
|
39 | 40 | import org.mockito.Mock;
|
40 | 41 | import org.mockito.MockitoAnnotations;
|
41 | 42 |
|
42 |
| -import rx.Observable; |
| 43 | +import rx.*; |
43 | 44 | import rx.Observable.OnSubscribe;
|
44 |
| -import rx.Observer; |
45 |
| -import rx.Scheduler; |
46 | 45 | import rx.Scheduler.Worker;
|
47 |
| -import rx.Subscriber; |
48 |
| -import rx.Subscription; |
49 | 46 | import rx.functions.Action0;
|
50 | 47 | import rx.functions.Action1;
|
51 | 48 | import rx.functions.Func1;
|
@@ -1005,4 +1002,107 @@ public void call(Subscriber<? super Integer> s) {
|
1005 | 1002 | assertEquals(10000, ts.getOnNextEvents().size());
|
1006 | 1003 | }
|
1007 | 1004 |
|
| 1005 | + @Test |
| 1006 | + public void shouldCompleteAfterApplyingBackpressure_NormalPath() { |
| 1007 | + Observable<Integer> source = Observable.mergeDelayError(Observable.just(Observable.range(1, 2))); |
| 1008 | + TestSubscriber<Integer> subscriber = new TestSubscriber<Integer>(); |
| 1009 | + subscriber.requestMore(0); |
| 1010 | + source.subscribe(subscriber); |
| 1011 | + subscriber.requestMore(3); // 1, 2, <complete> - with requestMore(2) we get the 1 and 2 but not the <complete> |
| 1012 | + subscriber.assertReceivedOnNext(asList(1, 2)); |
| 1013 | + subscriber.assertTerminalEvent(); |
| 1014 | + } |
| 1015 | + |
| 1016 | + @Test |
| 1017 | + public void shouldCompleteAfterApplyingBackpressure_FastPath() { |
| 1018 | + Observable<Integer> source = Observable.mergeDelayError(Observable.just(Observable.just(1))); |
| 1019 | + TestSubscriber<Integer> subscriber = new TestSubscriber<Integer>(); |
| 1020 | + subscriber.requestMore(0); |
| 1021 | + source.subscribe(subscriber); |
| 1022 | + subscriber.requestMore(2); // 1, <complete> - should work as per .._NormalPath above |
| 1023 | + subscriber.assertReceivedOnNext(asList(1)); |
| 1024 | + subscriber.assertTerminalEvent(); |
| 1025 | + } |
| 1026 | + |
| 1027 | + @Test |
| 1028 | + public void shouldNotCompleteIfThereArePendingScalarSynchronousEmissionsWhenTheLastInnerSubscriberCompletes() { |
| 1029 | + TestScheduler scheduler = Schedulers.test(); |
| 1030 | + Observable<Long> source = Observable.mergeDelayError(Observable.just(1L), Observable.timer(1, TimeUnit.SECONDS, scheduler).skip(1)); |
| 1031 | + TestSubscriber<Long> subscriber = new TestSubscriber<Long>(); |
| 1032 | + subscriber.requestMore(0); |
| 1033 | + source.subscribe(subscriber); |
| 1034 | + scheduler.advanceTimeBy(1, TimeUnit.SECONDS); |
| 1035 | + subscriber.assertReceivedOnNext(Collections.<Long>emptyList()); |
| 1036 | + assertEquals(Collections.<Notification<Long>>emptyList(), subscriber.getOnCompletedEvents()); |
| 1037 | + subscriber.requestMore(1); |
| 1038 | + subscriber.assertReceivedOnNext(asList(1L)); |
| 1039 | + assertEquals(Collections.<Notification<Long>>emptyList(), subscriber.getOnCompletedEvents()); |
| 1040 | + subscriber.requestMore(1); |
| 1041 | + subscriber.assertTerminalEvent(); |
| 1042 | + } |
| 1043 | + |
| 1044 | + @Test |
| 1045 | + public void delayedErrorsShouldBeEmittedWhenCompleteAfterApplyingBackpressure_NormalPath() { |
| 1046 | + Throwable exception = new Throwable(); |
| 1047 | + Observable<Integer> source = Observable.mergeDelayError(Observable.range(1, 2), Observable.<Integer>error(exception)); |
| 1048 | + TestSubscriber<Integer> subscriber = new TestSubscriber<Integer>(); |
| 1049 | + subscriber.requestMore(0); |
| 1050 | + source.subscribe(subscriber); |
| 1051 | + subscriber.requestMore(3); // 1, 2, <error> |
| 1052 | + subscriber.assertReceivedOnNext(asList(1, 2)); |
| 1053 | + subscriber.assertTerminalEvent(); |
| 1054 | + assertEquals(asList(exception), subscriber.getOnErrorEvents()); |
| 1055 | + } |
| 1056 | + |
| 1057 | + @Test |
| 1058 | + public void delayedErrorsShouldBeEmittedWhenCompleteAfterApplyingBackpressure_FastPath() { |
| 1059 | + Throwable exception = new Throwable(); |
| 1060 | + Observable<Integer> source = Observable.mergeDelayError(Observable.just(1), Observable.<Integer>error(exception)); |
| 1061 | + TestSubscriber<Integer> subscriber = new TestSubscriber<Integer>(); |
| 1062 | + subscriber.requestMore(0); |
| 1063 | + source.subscribe(subscriber); |
| 1064 | + subscriber.requestMore(2); // 1, <error> |
| 1065 | + subscriber.assertReceivedOnNext(asList(1)); |
| 1066 | + subscriber.assertTerminalEvent(); |
| 1067 | + assertEquals(asList(exception), subscriber.getOnErrorEvents()); |
| 1068 | + } |
| 1069 | + |
| 1070 | + @Test |
| 1071 | + public void shouldNotCompleteWhileThereAreStillScalarSynchronousEmissionsInTheQueue() { |
| 1072 | + Observable<Integer> source = Observable.merge(Observable.just(1), Observable.just(2)); |
| 1073 | + TestSubscriber<Integer> subscriber = new TestSubscriber<Integer>(); |
| 1074 | + subscriber.requestMore(1); |
| 1075 | + source.subscribe(subscriber); |
| 1076 | + subscriber.assertReceivedOnNext(asList(1)); |
| 1077 | + subscriber.requestMore(1); |
| 1078 | + subscriber.assertReceivedOnNext(asList(1, 2)); |
| 1079 | + } |
| 1080 | + |
| 1081 | + @Test |
| 1082 | + public void shouldNotReceivedDelayedErrorWhileThereAreStillScalarSynchronousEmissionsInTheQueue() { |
| 1083 | + Throwable exception = new Throwable(); |
| 1084 | + Observable<Integer> source = Observable.mergeDelayError(Observable.just(1), Observable.just(2), Observable.<Integer>error(exception)); |
| 1085 | + TestSubscriber<Integer> subscriber = new TestSubscriber<Integer>(); |
| 1086 | + subscriber.requestMore(1); |
| 1087 | + source.subscribe(subscriber); |
| 1088 | + subscriber.assertReceivedOnNext(asList(1)); |
| 1089 | + assertEquals(Collections.<Throwable>emptyList(), subscriber.getOnErrorEvents()); |
| 1090 | + subscriber.requestMore(1); |
| 1091 | + subscriber.assertReceivedOnNext(asList(1, 2)); |
| 1092 | + assertEquals(asList(exception), subscriber.getOnErrorEvents()); |
| 1093 | + } |
| 1094 | + |
| 1095 | + @Test |
| 1096 | + public void shouldNotReceivedDelayedErrorWhileThereAreStillNormalEmissionsInTheQueue() { |
| 1097 | + Throwable exception = new Throwable(); |
| 1098 | + Observable<Integer> source = Observable.mergeDelayError(Observable.range(1, 2), Observable.range(3, 2), Observable.<Integer>error(exception)); |
| 1099 | + TestSubscriber<Integer> subscriber = new TestSubscriber<Integer>(); |
| 1100 | + subscriber.requestMore(3); |
| 1101 | + source.subscribe(subscriber); |
| 1102 | + subscriber.assertReceivedOnNext(asList(1, 2, 3)); |
| 1103 | + assertEquals(Collections.<Throwable>emptyList(), subscriber.getOnErrorEvents()); |
| 1104 | + subscriber.requestMore(2); |
| 1105 | + subscriber.assertReceivedOnNext(asList(1, 2, 3, 4)); |
| 1106 | + assertEquals(asList(exception), subscriber.getOnErrorEvents()); |
| 1107 | + } |
1008 | 1108 | }
|
0 commit comments