Skip to content

Commit 9b503e5

Browse files
committed
Fix the bug that Scan may request 0 when n is 1
1 parent 27323ef commit 9b503e5

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

src/main/java/rx/internal/operators/OperatorScan.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,17 +140,30 @@ public void setProducer(final Producer producer) {
140140

141141
final AtomicBoolean once = new AtomicBoolean();
142142

143+
final AtomicBoolean excessive = new AtomicBoolean();
144+
143145
@Override
144146
public void request(long n) {
145147
if (once.compareAndSet(false, true)) {
146148
if (initialValue == NO_INITIAL_VALUE || n == Long.MAX_VALUE) {
147149
producer.request(n);
148150
} else {
149-
producer.request(n - 1);
151+
if (n == Long.MAX_VALUE) {
152+
producer.request(Long.MAX_VALUE);
153+
} else if (n == 1) {
154+
excessive.set(true);
155+
producer.request(1); // request at least 1
156+
} else {
157+
producer.request(n - 1);
158+
}
150159
}
151160
} else {
152161
// pass-thru after first time
153-
producer.request(n);
162+
if (excessive.compareAndSet(true, false) && n != Long.MAX_VALUE) {
163+
producer.request(n - 1);
164+
} else {
165+
producer.request(n);
166+
}
154167
}
155168
}
156169
});

src/test/java/rx/internal/operators/OperatorScanTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,4 +295,21 @@ public void call(List<Integer> list, Integer t2) {
295295
assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), o.toBlocking().single());
296296
assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), o.toBlocking().single());
297297
}
298+
299+
@Test
300+
public void testScanWithRequestOne() {
301+
Observable<Integer> o = Observable.just(1, 2).scan(0, new Func2<Integer, Integer, Integer>() {
302+
303+
@Override
304+
public Integer call(Integer t1, Integer t2) {
305+
return t1 + t2;
306+
}
307+
308+
}).take(1);
309+
TestSubscriber<Integer> subscriber = new TestSubscriber<Integer>();
310+
o.subscribe(subscriber);
311+
subscriber.assertReceivedOnNext(Arrays.asList(0));
312+
subscriber.assertTerminalEvent();
313+
subscriber.assertNoErrors();
314+
}
298315
}

0 commit comments

Comments
 (0)