diff --git a/src/main/java/rx/internal/operators/OperatorTake.java b/src/main/java/rx/internal/operators/OperatorTake.java index d1cc1cbd09..55b0288f12 100644 --- a/src/main/java/rx/internal/operators/OperatorTake.java +++ b/src/main/java/rx/internal/operators/OperatorTake.java @@ -36,6 +36,9 @@ public final class OperatorTake implements Operator { final int limit; public OperatorTake(int limit) { + if (limit < 0) { + throw new IllegalArgumentException("limit >= 0 required but it was " + limit); + } this.limit = limit; } diff --git a/src/test/java/rx/internal/operators/OperatorTakeTest.java b/src/test/java/rx/internal/operators/OperatorTakeTest.java index 4173f08892..df23a64150 100644 --- a/src/test/java/rx/internal/operators/OperatorTakeTest.java +++ b/src/test/java/rx/internal/operators/OperatorTakeTest.java @@ -438,4 +438,21 @@ public void call(Integer v) { ts.assertNoErrors(); ts.assertCompleted(); } + + @Test(expected = IllegalArgumentException.class) + public void takeNegative() { + Observable.range(1, 1000 * 1000 * 1000).take(-1); + } + + @Test(timeout = 1000) + public void takeZero() { + TestSubscriber ts = TestSubscriber.create(); + + Observable.range(1, 1000 * 1000 * 1000).take(0).subscribe(ts); + + ts.assertNoValues(); + ts.assertNoErrors(); + ts.assertCompleted(); + } + }