Skip to content

Commit 4378e8a

Browse files
1.x: Prevent Single.zip() of zero Singles
1 parent 686231b commit 4378e8a

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

src/main/java/rx/Single.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,8 @@ public R call(Object... args) {
12351235
* </dl>
12361236
*
12371237
* @param singles
1238-
* an Iterable of source Singles
1238+
* an Iterable of source Singles. Should not be empty because {@link Single} either emits result or error.
1239+
* {@link java.util.NoSuchElementException} will be emit as error if Iterable will be empty.
12391240
* @param zipFunction
12401241
* a function that, when applied to an item emitted by each of the source Singles, results in
12411242
* an item that will be emitted by the resulting Single

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import rx.plugins.RxJavaPlugins;
88
import rx.subscriptions.CompositeSubscription;
99

10+
import java.util.NoSuchElementException;
1011
import java.util.concurrent.atomic.AtomicBoolean;
1112
import java.util.concurrent.atomic.AtomicInteger;
1213

@@ -16,6 +17,11 @@ public static <T, R> Single<R> zip(final Single<? extends T>[] singles, final Fu
1617
return Single.create(new Single.OnSubscribe<R>() {
1718
@Override
1819
public void call(final SingleSubscriber<? super R> subscriber) {
20+
if (singles.length == 0) {
21+
subscriber.onError(new NoSuchElementException("Can't zip 0 Singles."));
22+
return;
23+
}
24+
1925
final AtomicInteger wip = new AtomicInteger(singles.length);
2026
final AtomicBoolean once = new AtomicBoolean();
2127
final Object[] values = new Object[singles.length];

src/test/java/rx/SingleTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,26 @@ public String call(Object... args) {
340340
ts.assertCompleted();
341341
}
342342

343+
@Test
344+
public void zipEmptyIterableShouldThrow() {
345+
TestSubscriber<Object> testSubscriber = new TestSubscriber<Object>();
346+
Iterable<Single<Object>> singles = Collections.emptyList();
347+
348+
Single
349+
.zip(singles, new FuncN<Object>() {
350+
@Override
351+
public Object call(Object... args) {
352+
throw new IllegalStateException("Should not be called");
353+
}
354+
})
355+
.subscribe(testSubscriber);
356+
357+
testSubscriber.assertNoValues();
358+
testSubscriber.assertNotCompleted();
359+
testSubscriber.assertError(NoSuchElementException.class);
360+
assertEquals("Can't zip 0 Singles.", testSubscriber.getOnErrorEvents().get(0).getMessage());
361+
}
362+
343363
@Test
344364
public void testZipWith() {
345365
TestSubscriber<String> ts = new TestSubscriber<String>();

0 commit comments

Comments
 (0)