From 65aac53b96f10949fa3c56e693f5da3d2372133b Mon Sep 17 00:00:00 2001 From: akarnokd Date: Tue, 28 Jan 2020 15:50:25 +0100 Subject: [PATCH 1/2] 3.x: Fix marble dimensions, add program that checks them --- .../reactivex/rxjava3/core/Completable.java | 26 ++-- .../io/reactivex/rxjava3/core/Flowable.java | 34 +++--- .../java/io/reactivex/rxjava3/core/Maybe.java | 40 +++--- .../io/reactivex/rxjava3/core/Observable.java | 114 +++++++++--------- .../io/reactivex/rxjava3/core/Single.java | 54 ++++----- .../rxjava3/parallel/ParallelFlowable.java | 4 +- .../internal/util/MarbleDimensions.java | 107 ++++++++++++++++ 7 files changed, 243 insertions(+), 136 deletions(-) create mode 100644 src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java diff --git a/src/main/java/io/reactivex/rxjava3/core/Completable.java b/src/main/java/io/reactivex/rxjava3/core/Completable.java index 83e7848a51..cfdd87067d 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Completable.java +++ b/src/main/java/io/reactivex/rxjava3/core/Completable.java @@ -178,7 +178,7 @@ public static Completable complete() { /** * Returns a {@code Completable} which completes only when all sources complete, one after another. *

- * + * *

*
Scheduler:
*
{@code concatArray} does not operate by default on a particular {@link Scheduler}.
@@ -205,7 +205,7 @@ public static Completable concatArray(@NonNull CompletableSource... sources) { /** * Returns a {@code Completable} which completes only when all sources complete, one after another. *

- * + * *

*
Scheduler:
*
{@code concatArrayDelayError} does not operate by default on a particular {@link Scheduler}.
@@ -247,7 +247,7 @@ public static Completable concat(@NonNull Iterable<@NonNull ? extends Completabl /** * Returns a {@code Completable} which completes only when all sources complete, one after another. *

- * + * *

*
Backpressure:
*
The returned {@code Completable} honors the backpressure of the downstream consumer @@ -270,7 +270,7 @@ public static Completable concat(@NonNull Publisher<@NonNull ? extends Completab /** * Returns a {@code Completable} which completes only when all sources complete, one after another. *

- * + * *

*
Backpressure:
*
The returned {@code Completable} honors the backpressure of the downstream consumer @@ -297,7 +297,7 @@ public static Completable concat(@NonNull Publisher<@NonNull ? extends Completab /** * Returns a {@code Completable} which completes only when all sources complete, one after another. *

- * + * *

*
Scheduler:
*
{@code concatDelayError} does not operate by default on a particular {@link Scheduler}.
@@ -989,7 +989,7 @@ public static Completable mergeArrayDelayError(@NonNull CompletableSource... sou * any error emitted by any of the inner {@code CompletableSource}s until all of * them terminate in a way or another. *

- * + * *

*
Scheduler:
*
{@code mergeDelayError} does not operate by default on a particular {@link Scheduler}.
@@ -1200,7 +1200,7 @@ public static Completable switchOnNextDelayError(@NonNull Publisher<@NonNull ? e * Returns a {@code Completable} instance which manages a resource along * with a custom {@link CompletableSource} instance while the subscription is active. *

- * + * *

* This overload disposes eagerly before the terminal event is emitted. *

@@ -1294,7 +1294,7 @@ public static Completable wrap(@NonNull CompletableSource source) { * Returns a {@code Completable} that emits the a terminated event of either this {@code Completable} * or the other {@link CompletableSource}, whichever fires first. *

- * + * *

*
Scheduler:
*
{@code ambWith} does not operate by default on a particular {@link Scheduler}.
@@ -1395,7 +1395,7 @@ public final Completable ambWith(@NonNull CompletableSource other) { * propagated to the downstream observer and will result in skipping the subscription to the next * {@code MaybeSource}. *

- * + * *

*
Scheduler:
*
{@code andThen} does not operate by default on a particular {@link Scheduler}.
@@ -1443,7 +1443,7 @@ public final Completable andThen(@NonNull CompletableSource next) { * Subscribes to and awaits the termination of this {@code Completable} instance in a blocking manner and * rethrows any exception emitted. *

- * + * *

*
Scheduler:
*
{@code blockingAwait} does not operate by default on a particular {@link Scheduler}.
@@ -1665,7 +1665,7 @@ public final Completable concatWith(@NonNull CompletableSource other) { /** * Returns a {@code Completable} which delays the emission of the completion event by the given time. *

- * + * *

*
Scheduler:
*
{@code delay} does operate by default on the {@code computation} {@link Scheduler}.
@@ -1955,7 +1955,7 @@ public final Completable doOnSubscribe(@NonNull Consumer onS * Returns a {@code Completable} instance that calls the given {@code onTerminate} {@link Action} just before this {@code Completable} * completes normally or with an exception. *

- * + * *

*
Scheduler:
*
{@code doOnTerminate} does not operate by default on a particular {@link Scheduler}.
@@ -1978,7 +1978,7 @@ public final Completable doOnTerminate(@NonNull Action onTerminate) { * Returns a {@code Completable} instance that calls the given {@code onAfterTerminate} {@link Action} after this {@code Completable} * completes normally or with an exception. *

- * + * *

*
Scheduler:
*
{@code doAfterTerminate} does not operate by default on a particular {@link Scheduler}.
diff --git a/src/main/java/io/reactivex/rxjava3/core/Flowable.java b/src/main/java/io/reactivex/rxjava3/core/Flowable.java index 453c9e4bba..58ffd3d6f8 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Flowable.java +++ b/src/main/java/io/reactivex/rxjava3/core/Flowable.java @@ -1964,7 +1964,7 @@ public static Flowable error(@NonNull Throwable throwable) { * Returns a {@code Flowable} instance that runs the given {@link Action} for each subscriber and * emits either its exception or simply completes. *

- * + * *

*
Backpressure:
*
This source doesn't produce any elements and effectively ignores downstream backpressure.
@@ -9934,7 +9934,7 @@ public final Flowable filter(@NonNull Predicate predicate) { * Returns a {@link Maybe} that emits only the very first item emitted by this {@code Flowable} or * completes if this {@code Flowable} is empty. *

- * + * *

*
Backpressure:
*
The operator honors backpressure from downstream and consumes the current {@code Flowable} in a bounded manner.
@@ -9957,7 +9957,7 @@ public final Maybe firstElement() { * Returns a {@link Single} that emits only the very first item emitted by this {@code Flowable}, or a default * item if this {@code Flowable} completes without emitting anything. *

- * + * *

*
Backpressure:
*
The operator honors backpressure from downstream and consumes the current {@code Flowable} in a bounded manner.
@@ -10561,7 +10561,7 @@ public final Completable flatMapCompletable(@NonNull Function - * + * *
*
Backpressure:
*
The operator honors backpressure from downstream. The current {@code Flowable}s is @@ -10592,7 +10592,7 @@ public final Flowable flatMapIterable(@NonNull Function - * + * *
*
Backpressure:
*
The operator honors backpressure from downstream. The current {@code Flowable}s is @@ -14336,7 +14336,7 @@ public final Flowable sample(long period, @NonNull TimeUnit unit) { * Returns a {@code Flowable} that emits the most recently emitted item (if any) emitted by the current {@code Flowable} * within periodic time intervals and optionally emit the very last upstream item when the upstream completes. *

- * + * *

*
Backpressure:
*
This operator does not support backpressure as it uses time to control data flow.
@@ -14407,7 +14407,7 @@ public final Flowable sample(long period, @NonNull TimeUnit unit, @NonNull Sc * within periodic time intervals, where the intervals are defined on a particular {@link Scheduler} * and optionally emit the very last upstream item when the upstream completes. *

- * + * *

*
Backpressure:
*
This operator does not support backpressure as it uses time to control data flow.
@@ -14448,7 +14448,7 @@ public final Flowable sample(long period, @NonNull TimeUnit unit, @NonNull Sc * emits the most recently emitted item (if any) emitted by the current {@code Flowable} since the previous * emission from the {@code sampler} {@code Publisher}. *

- * + * *

*
Backpressure:
*
This operator does not support backpressure as it uses the emissions of the {@code sampler} @@ -14480,7 +14480,7 @@ public final Flowable sample(@NonNull Publisher sampler) { * emission from the {@code sampler} {@code Publisher} * and optionally emit the very last upstream item when the upstream or other {@code Publisher} complete. *

- * + * *

*
Backpressure:
*
This operator does not support backpressure as it uses the emissions of the {@code sampler} @@ -14759,7 +14759,7 @@ public final Single single(@NonNull T defaultItem) { * if this {@code Flowable} completes without emitting any items a {@link NoSuchElementException} will be signaled and * if this {@code Flowable} emits more than one item, an {@link IllegalArgumentException} will be signaled. *

- * + * *

*
Backpressure:
*
The operator honors backpressure from downstream and consumes the current {@code Flowable} in an @@ -15728,7 +15728,7 @@ public final Flowable subscribeOn(@NonNull Scheduler scheduler, boolean reque * Returns a {@code Flowable} that emits the items emitted by the current {@code Flowable} or the items of an alternate * {@link Publisher} if the current {@code Flowable} is empty. *

- * + * *

*
Backpressure:
*
If the current {@code Flowable} is empty, the alternate {@code Publisher} is expected to honor backpressure. @@ -15835,7 +15835,7 @@ public final Flowable switchMap(@NonNull Function - * + * *

* Since a {@code CompletableSource} doesn't produce any items, the resulting reactive type of * this operator is a {@link Completable} that can only indicate successful completion or @@ -16852,7 +16852,7 @@ public final Flowable throttleLast(long intervalDuration, @NonNull TimeUnit u * item from upstream, then periodically emitting the latest item (if any) when * the specified timeout elapses between them. *

- * + * *

* Unlike the option with {@link #throttleLatest(long, TimeUnit, boolean)}, the very last item being held back * (if any) is not emitted when the upstream completes. @@ -16891,7 +16891,7 @@ public final Flowable throttleLatest(long timeout, @NonNull TimeUnit unit) { * item from upstream, then periodically emitting the latest item (if any) when * the specified timeout elapses between them. *

- * + * *

* If no items were emitted from the upstream during this timeout phase, the next * upstream item is emitted immediately and the timeout window starts from then. @@ -16930,7 +16930,7 @@ public final Flowable throttleLatest(long timeout, @NonNull TimeUnit unit, bo * item from upstream, then periodically emitting the latest item (if any) when * the specified timeout elapses between them. *

- * + * *

* Unlike the option with {@link #throttleLatest(long, TimeUnit, Scheduler, boolean)}, the very last item being held back * (if any) is not emitted when the upstream completes. @@ -16970,7 +16970,7 @@ public final Flowable throttleLatest(long timeout, @NonNull TimeUnit unit, @N * item from upstream, then periodically emitting the latest item (if any) when * the specified timeout elapses between them. *

- * + * *

* If no items were emitted from the upstream during this timeout phase, the next * upstream item is emitted immediately and the timeout window starts from then. @@ -19764,7 +19764,7 @@ public final CompletionStage lastStage(@Nullable T defaultItem) { * Signals the first upstream item or a {@link NoSuchElementException} if the upstream is empty via * a {@link CompletionStage}. *

- * + * *

* The upstream can be canceled by converting the resulting {@code CompletionStage} into * {@link CompletableFuture} via {@link CompletionStage#toCompletableFuture()} and diff --git a/src/main/java/io/reactivex/rxjava3/core/Maybe.java b/src/main/java/io/reactivex/rxjava3/core/Maybe.java index ba42452513..81ad003054 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Maybe.java +++ b/src/main/java/io/reactivex/rxjava3/core/Maybe.java @@ -117,7 +117,7 @@ public abstract class Maybe implements MaybeSource { * Runs multiple {@link MaybeSource}s provided by an {@link Iterable} sequence and * signals the events of the first one that signals (disposing the rest). *

- * + * *

*
Scheduler:
*
{@code amb} does not operate by default on a particular {@link Scheduler}.
@@ -196,7 +196,7 @@ public static Flowable concat(@NonNull Iterable<@NonNull ? extends MaybeS /** * Returns a {@link Flowable} that emits the items emitted by two {@link MaybeSource}s, one after the other. *

- * + * *

*
Backpressure:
*
The returned {@code Flowable} honors the backpressure of the downstream consumer.
@@ -226,7 +226,7 @@ public static Flowable concat(@NonNull MaybeSource source1, /** * Returns a {@link Flowable} that emits the items emitted by three {@link MaybeSource}s, one after the other. *

- * + * *

*
Backpressure:
*
The returned {@code Flowable} honors the backpressure of the downstream consumer.
@@ -260,7 +260,7 @@ public static Flowable concat( /** * Returns a {@link Flowable} that emits the items emitted by four {@link MaybeSource}s, one after the other. *

- * + * *

*
Backpressure:
*
The returned {@code Flowable} honors the backpressure of the downstream consumer.
@@ -426,7 +426,7 @@ public static Flowable concatArrayDelayError(@NonNull MaybeSource - * + * *
*
Backpressure:
*
The operator honors backpressure from downstream.
@@ -1229,7 +1229,7 @@ public static Flowable merge(@NonNull Publisher<@NonNull ? extends MaybeS * Flattens a {@link MaybeSource} that emits a {@code MaybeSource} into a single {@code MaybeSource} that emits the item * emitted by the nested {@code MaybeSource}, without any transformation. *

- * + * *

*
Scheduler:
*
{@code merge} does not operate by default on a particular {@link Scheduler}.
@@ -1779,7 +1779,7 @@ public static Maybe never() { * Returns a {@link Single} that emits a {@link Boolean} value that indicates whether two {@link MaybeSource} sequences are the * same by comparing the items emitted by each {@code MaybeSource} pairwise. *

- * + * *

*
Scheduler:
*
{@code sequenceEqual} does not operate by default on a particular {@link Scheduler}.
@@ -2570,7 +2570,7 @@ public static Maybe zip( * {@code Function} passed to the method would trigger a {@link ClassCastException}. * *

- * + * *

This operator terminates eagerly if any of the source {@code MaybeSource}s signal an {@code onError} or {@code onComplete}. This * also means it is possible some sources may not get subscribed to at all. *

@@ -3638,7 +3638,7 @@ public final Maybe filter(@NonNull Predicate predicate) { * Returns a {@code Maybe} that is based on applying a specified function to the item emitted by the current {@code Maybe}, * where that function returns a {@link MaybeSource}. *

- * + * *

*
Scheduler:
*
{@code flatMap} does not operate by default on a particular {@link Scheduler}.
@@ -3790,7 +3790,7 @@ public final Observable flattenAsObservable(@NonNull Function - * + * *
*
Scheduler:
*
{@code flatMapObservable} does not operate by default on a particular {@link Scheduler}.
@@ -3815,7 +3815,7 @@ public final Observable flatMapObservable(@NonNull Function - * + * *
*
Backpressure:
*
The returned {@code Flowable} honors the downstream backpressure.
@@ -3872,7 +3872,7 @@ public final Single flatMapSingle(@NonNull Function - * + * *
*
Scheduler:
*
{@code flatMapSingleElement} does not operate by default on a particular {@link Scheduler}.
@@ -3943,7 +3943,7 @@ public final Maybe hide() { /** * Returns a {@link Completable} that ignores the item emitted by the current {@code Maybe} and only calls {@code onComplete} or {@code onError}. *

- * + * *

*
Scheduler:
*
{@code ignoreElement} does not operate by default on a particular {@link Scheduler}.
@@ -4215,7 +4215,7 @@ public final Flowable mergeWith(@NonNull MaybeSource other) { * Wraps a {@code Maybe} to emit its item (or notify of its error) on a specified {@link Scheduler}, * asynchronously. *

- * + * *

*
Scheduler:
*
you specify which {@code Scheduler} this operator will use.
@@ -5145,7 +5145,7 @@ public final void subscribe(@NonNull MaybeObserver observer) { /** * Asynchronously subscribes subscribers to this {@code Maybe} on the specified {@link Scheduler}. *

- * + * *

*
Scheduler:
*
you specify which {@code Scheduler} this operator will use.
@@ -5202,7 +5202,7 @@ public final Maybe subscribeOn(@NonNull Scheduler scheduler) { * Returns a {@code Maybe} that emits the items emitted by the current {@code Maybe} or the items of an alternate * {@link MaybeSource} if the current {@code Maybe} is empty. *

- * + * *

*
Scheduler:
*
{@code switchIfEmpty} does not operate by default on a particular {@link Scheduler}.
@@ -5225,7 +5225,7 @@ public final Maybe switchIfEmpty(@NonNull MaybeSource other) { * Returns a {@link Single} that emits the items emitted by the current {@code Maybe} or the item of an alternate * {@link SingleSource} if the current {@code Maybe} is empty. *

- * + * *

*
Scheduler:
*
{@code switchIfEmpty} does not operate by default on a particular {@link Scheduler}.
@@ -5747,7 +5747,7 @@ public final Maybe timeout(@NonNull Publisher timeoutIndicator, @NonNu * Returns a {@code Maybe} which makes sure when a {@link MaybeObserver} disposes the {@link Disposable}, * that call is propagated up on the specified {@link Scheduler}. *

- * + * *

*
Scheduler:
*
{@code unsubscribeOn} calls {@code dispose()} of the upstream on the {@code Scheduler} you specify.
@@ -6010,7 +6010,7 @@ public final CompletionStage toCompletionStage(@Nullable T defaultItem) { * Maps the upstream succecss value into a Java {@link Stream} and emits its * items to the downstream consumer as a {@link Flowable}. *

- * + * *

* The operator closes the {@code Stream} upon cancellation and when it terminates. The exceptions raised when * closing a {@code Stream} are routed to the global error handler ({@link RxJavaPlugins#onError(Throwable)}. @@ -6054,7 +6054,7 @@ public final Flowable flattenStreamAsFlowable(@NonNull Function + * *

* The operator closes the {@code Stream} upon cancellation and when it terminates. The exceptions raised when * closing a {@code Stream} are routed to the global error handler ({@link RxJavaPlugins#onError(Throwable)}. diff --git a/src/main/java/io/reactivex/rxjava3/core/Observable.java b/src/main/java/io/reactivex/rxjava3/core/Observable.java index 6db7ce3cc1..9eeb169871 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Observable.java +++ b/src/main/java/io/reactivex/rxjava3/core/Observable.java @@ -1271,7 +1271,7 @@ public static Observable concatArrayDelayError(@NonNull ObservableSource< /** * Concatenates an array of {@link ObservableSource}s eagerly into a single stream of values. *

- * + * *

* Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the * {@code ObservableSource}s. The operator buffers the values emitted by these {@code ObservableSource}s and then drains them @@ -1688,7 +1688,7 @@ public static Observable empty() { * Returns an {@code Observable} that invokes an {@link Observer}'s {@link Observer#onError onError} method when the * {@code Observer} subscribes to it. *

- * + * *

*
Scheduler:
*
{@code error} does not operate by default on a particular {@link Scheduler}.
@@ -1714,7 +1714,7 @@ public static Observable error(@NonNull Supplier sup * Returns an {@code Observable} that invokes an {@link Observer}'s {@link Observer#onError onError} method when the * {@code Observer} subscribes to it. *

- * + * *

*
Scheduler:
*
{@code error} does not operate by default on a particular {@link Scheduler}.
@@ -1740,7 +1740,7 @@ public static Observable error(@NonNull Throwable throwable) { * Returns an {@code Observable} instance that runs the given {@link Action} for each subscriber and * emits either its exception or simply completes. *

- * + * *

*
Scheduler:
*
{@code fromAction} does not operate by default on a particular {@link Scheduler}.
@@ -1941,7 +1941,7 @@ public static Observable fromFuture(@NonNull Future future, /** * Converts an {@link Iterable} sequence into an {@code Observable} that emits the items in the sequence. *

- * + * *

*
Scheduler:
*
{@code fromIterable} does not operate by default on a particular {@link Scheduler}.
@@ -5198,7 +5198,7 @@ public static Observable zipArray( * Returns a {@link Single} that emits a {@link Boolean} that indicates whether all of the items emitted by the current * {@code Observable} satisfy a condition. *

- * + * *

*
Scheduler:
*
{@code all} does not operate by default on a particular {@link Scheduler}.
@@ -5275,7 +5275,7 @@ public final Single any(@NonNull Predicate predicate) { * Returns the first item emitted by the current {@code Observable}, or throws * {@link NoSuchElementException} if it emits no items. *

- * + * *

*
Scheduler:
*
{@code blockingFirst} does not operate by default on a particular {@link Scheduler}.
@@ -5703,7 +5703,7 @@ public final void blockingSubscribe() { /** * Subscribes to the source and calls the given callbacks on the current thread. *

- * + * *

* If the {@code Observable} emits an error, it is wrapped into an * {@link OnErrorNotImplementedException} @@ -5732,7 +5732,7 @@ public final void blockingSubscribe(@NonNull Consumer onNext) { /** * Subscribes to the source and calls the given callbacks on the current thread. *

- * + * *

* Note that calling this method will block the caller thread until the upstream terminates * normally or with an error. Therefore, calling this method from special threads such as the @@ -6748,7 +6748,7 @@ public final Observable concatMap(@NonNull Function - * + * *

* Note that there is no guarantee where the given {@code mapper} function will be executed; it could be on the subscribing thread, * on the upstream thread signaling the new item to be mapped or on the thread where the inner source terminates. To ensure @@ -6777,7 +6777,7 @@ public final Observable concatMapDelayError(@NonNull Function - * + * *

* Note that there is no guarantee where the given {@code mapper} function will be executed; it could be on the subscribing thread, * on the upstream thread signaling the new item to be mapped or on the thread where the inner source terminates. To ensure @@ -6823,7 +6823,7 @@ public final Observable concatMapDelayError(@NonNull Function - * + * *

*
Scheduler:
*
{@code concatMapDelayError} does not operate by default on a particular {@link Scheduler}.
@@ -6863,7 +6863,7 @@ public final Observable concatMapDelayError(@NonNull Function - * + * *
*
Scheduler:
*
This method does not operate by default on a particular {@link Scheduler}.
@@ -6890,7 +6890,7 @@ public final Observable concatMapEager(@NonNull Function - * + * *
*
Scheduler:
*
This method does not operate by default on a particular {@link Scheduler}.
@@ -6990,7 +6990,7 @@ public final Observable concatMapEagerDelayError(@NonNull Function - * + * *
*
Scheduler:
*
{@code concatMapCompletable} does not operate by default on a particular {@link Scheduler}.
@@ -7013,7 +7013,7 @@ public final Completable concatMapCompletable(@NonNull Function - * + * *
*
Scheduler:
*
{@code concatMapCompletable} does not operate by default on a particular {@link Scheduler}.
@@ -8366,7 +8366,7 @@ public final Observable doAfterTerminate(@NonNull Action onAfterTerminate) { *

Note that the {@code onFinally} action is shared between subscriptions and as such * should be thread-safe. *

- * + * *

*
Scheduler:
*
{@code doFinally} does not operate by default on a particular {@link Scheduler}.
@@ -8686,7 +8686,7 @@ public final Maybe elementAt(long index) { * Returns a {@link Single} that emits the item found at a specified index in a sequence of emissions from * the current {@code Observable}, or a default item if that index is out of range. *

- * + * *

*
Scheduler:
*
{@code elementAt} does not operate by default on a particular {@link Scheduler}.
@@ -8788,7 +8788,7 @@ public final Maybe firstElement() { * Returns a {@link Single} that emits only the very first item emitted by the current {@code Observable}, or a default item * if the current {@code Observable} completes without emitting any items. *

- * + * *

*
Scheduler:
*
{@code first} does not operate by default on a particular {@link Scheduler}.
@@ -8811,7 +8811,7 @@ public final Single first(@NonNull T defaultItem) { * Returns a {@link Single} that emits only the very first item emitted by the current {@code Observable} or * signals a {@link NoSuchElementException} if the current {@code Observable} is empty. *

- * + * *

*
Scheduler:
*
{@code firstOrError} does not operate by default on a particular {@link Scheduler}.
@@ -8888,7 +8888,7 @@ public final Observable flatMap(@NonNull Function - * + * *
*
Scheduler:
*
{@code flatMap} does not operate by default on a particular {@link Scheduler}.
@@ -8922,7 +8922,7 @@ public final Observable flatMap(@NonNull Function - * + * *
*
Scheduler:
*
{@code flatMap} does not operate by default on a particular {@link Scheduler}.
@@ -9050,7 +9050,7 @@ public final Observable flatMap( * {@code ObservableSource}s and emitting the results of this merger, while limiting the maximum number of concurrent * subscriptions to these {@code ObservableSource}s. *

- * + * *

*
Scheduler:
*
{@code flatMap} does not operate by default on a particular {@link Scheduler}.
@@ -9282,7 +9282,7 @@ public final Completable flatMapCompletable(@NonNull Function - * + * *
*
Scheduler:
*
{@code flatMapCompletable} does not operate by default on a particular {@link Scheduler}.
@@ -9487,7 +9487,7 @@ public final Disposable forEach(@NonNull Consumer onNext) { * Subscribes to the {@link ObservableSource} and calls a {@link Predicate} for each item of the current {@code Observable}, * on its emission thread, until the predicate returns {@code false}. *

- * + * *

* If the {@code Observable} emits an error, it is wrapped into an * {@link OnErrorNotImplementedException} @@ -10668,7 +10668,7 @@ public final Observable onErrorReturnItem(@NonNull T item) { * Nulls out references to the upstream producer and downstream {@link Observer} if * the sequence is terminated or downstream calls {@code dispose()}. *

- * + * *

*
Scheduler:
*
{@code onTerminateDetach} does not operate by default on a particular {@link Scheduler}.
@@ -10923,7 +10923,7 @@ public final Observable repeat(long times) { * Returns an {@code Observable} that repeats the sequence of items emitted by the current {@code Observable} until * the provided stop function returns {@code true}. *

- * + * *

*
Scheduler:
*
{@code repeatUntil} does not operate by default on a particular {@link Scheduler}.
@@ -11031,7 +11031,7 @@ public final Observable replay(@NonNull Function, ? * Note that due to concurrency requirements, {@code replay(bufferSize)} may hold strong references to more than * {@code bufferSize} source emissions. *

- * + * *

*
Scheduler:
*
This version of {@code replay} does not operate by default on a particular {@link Scheduler}.
@@ -11067,7 +11067,7 @@ public final Observable replay(@NonNull Function, ? * Note that due to concurrency requirements, {@code replay(bufferSize)} may hold strong references to more than * {@code bufferSize} source emissions. *

- * + * *

*
Scheduler:
*
This version of {@code replay} does not operate by default on a particular {@link Scheduler}.
@@ -11142,7 +11142,7 @@ public final Observable replay(@NonNull Function, ? * Note that due to concurrency requirements, {@code replay(bufferSize)} may hold strong references to more than * {@code bufferSize} source emissions. *

- * + * *

*
Scheduler:
*
You specify which {@link Scheduler} this operator will use.
@@ -11189,7 +11189,7 @@ public final Observable replay(@NonNull Function, ? * Note that due to concurrency requirements, {@code replay(bufferSize)} may hold strong references to more than * {@code bufferSize} source emissions. *

- * + * *

*
Scheduler:
*
You specify which {@link Scheduler} this operator will use.
@@ -11234,7 +11234,7 @@ public final Observable replay(@NonNull Function, ? * emitted by a {@link ConnectableObservable} that shares a single subscription to the current {@code Observable}, * replaying all items that were emitted within a specified time window. *

- * + * *

*
Scheduler:
*
This version of {@code replay} operates by default on the {@code computation} {@link Scheduler}.
@@ -11265,7 +11265,7 @@ public final Observable replay(@NonNull Function, ? * emitted by a {@link ConnectableObservable} that shares a single subscription to the current {@code Observable}, * replaying all items that were emitted within a specified time window. *

- * + * *

*
Scheduler:
*
You specify which {@link Scheduler} this operator will use.
@@ -11302,7 +11302,7 @@ public final Observable replay(@NonNull Function, ? * emitted by a {@link ConnectableObservable} that shares a single subscription to the current {@code Observable}, * replaying all items that were emitted within a specified time window. *

- * + * *

*
Scheduler:
*
You specify which {@link Scheduler} this operator will use.
@@ -11654,7 +11654,7 @@ public final Observable retry() { * Returns an {@code Observable} that mirrors the current {@code Observable}, resubscribing to it if it calls {@code onError} * and the predicate returns {@code true} for that specific exception and retry count. *

- * + * *

*
Scheduler:
*
{@code retry} does not operate by default on a particular {@link Scheduler}.
@@ -11681,7 +11681,7 @@ public final Observable retry(@NonNull BiPredicate - * + * *

* If the current {@code Observable} calls {@link Observer#onError}, this method will resubscribe to the current * {@code Observable} for a maximum of {@code count} resubscriptions rather than propagating the @@ -11712,7 +11712,7 @@ public final Observable retry(long times) { /** * Retries at most times or until the predicate returns {@code false}, whichever happens first. *

- * + * *

*
Scheduler:
*
{@code retry} does not operate by default on a particular {@link Scheduler}.
@@ -11738,7 +11738,7 @@ public final Observable retry(long times, @NonNull Predicate - * + * *
*
Scheduler:
*
{@code retry} does not operate by default on a particular {@link Scheduler}.
@@ -11758,7 +11758,7 @@ public final Observable retry(@NonNull Predicate predicate /** * Retries until the given stop function returns {@code true}. *

- * + * *

*
Scheduler:
*
{@code retryUntil} does not operate by default on a particular {@link Scheduler}.
@@ -11911,7 +11911,7 @@ public final Observable sample(long period, @NonNull TimeUnit unit) { * Returns an {@code Observable} that emits the most recently emitted item (if any) emitted by the current {@code Observable} * within periodic time intervals and optionally emit the very last upstream item when the upstream completes. *

- * + * *

*
Scheduler:
*
{@code sample} operates by default on the {@code computation} {@link Scheduler}.
@@ -11974,7 +11974,7 @@ public final Observable sample(long period, @NonNull TimeUnit unit, @NonNull * within periodic time intervals, where the intervals are defined on a particular {@link Scheduler} * and optionally emit the very last upstream item when the upstream completes. *

- * + * *

*
Scheduler:
*
You specify which {@code Scheduler} this operator will use.
@@ -12011,7 +12011,7 @@ public final Observable sample(long period, @NonNull TimeUnit unit, @NonNull * emits the most recently emitted item (if any) emitted by the current {@code Observable} since the previous * emission from the {@code sampler} {@code ObservableSource}. *

- * + * *

*
Scheduler:
*
This version of {@code sample} does not operate by default on a particular {@link Scheduler}.
@@ -12038,7 +12038,7 @@ public final Observable sample(@NonNull ObservableSource sampler) { * emission from the {@code sampler} {@code ObservableSource} * and optionally emit the very last upstream item when the upstream or other {@code ObservableSource} complete. *

- * + * *

*
Scheduler:
*
This version of {@code sample} does not operate by default on a particular {@link Scheduler}.
@@ -12283,7 +12283,7 @@ public final Single single(@NonNull T defaultItem) { * if the current {@code Observable} completes without emitting any items or emits more than one item a * {@link NoSuchElementException} or {@link IllegalArgumentException} will be signaled respectively. *

- * + * *

*
Scheduler:
*
{@code singleOrError} does not operate by default on a particular {@link Scheduler}.
@@ -12708,7 +12708,7 @@ public final Observable startWithIterable(@NonNull Iterable<@NonNull ? extend * Returns an {@code Observable} which first runs the other {@link CompletableSource} * then the current {@code Observable} if the other completed normally. *

- * + * *

*
Scheduler:
*
{@code startWith} does not operate by default on a particular {@link Scheduler}.
@@ -13052,7 +13052,7 @@ public final Observable subscribeOn(@NonNull Scheduler scheduler) { * Returns an {@code Observable} that emits the items emitted by the current {@code Observable} or the items of an alternate * {@link ObservableSource} if the current {@code Observable} is empty. *

- * + * *

*
Scheduler:
*
{@code switchIfEmpty} does not operate by default on a particular {@link Scheduler}.
@@ -13150,7 +13150,7 @@ public final Observable switchMap(@NonNull Function - * + * *

* Since a {@code CompletableSource} doesn't produce any items, the resulting reactive type of * this operator is a {@link Completable} that can only indicate successful completion or @@ -13238,7 +13238,7 @@ public final Completable switchMapCompletableDelayError(@NonNull Function - * + * *

*
Scheduler:
*
{@code switchMapMaybe} does not operate by default on a particular {@link Scheduler}.
@@ -13275,7 +13275,7 @@ public final Observable switchMapMaybe(@NonNull Function - * + * *
*
Scheduler:
*
{@code switchMapMaybeDelayError} does not operate by default on a particular {@link Scheduler}.
@@ -13306,7 +13306,7 @@ public final Observable switchMapMaybeDelayError(@NonNull Function - * + * *
*
Scheduler:
*
{@code switchMapSingle} does not operate by default on a particular {@link Scheduler}.
@@ -14030,7 +14030,7 @@ public final Observable throttleLast(long intervalDuration, @NonNull TimeUnit * item from upstream, then periodically emitting the latest item (if any) when * the specified timeout elapses between them. *

- * + * *

* Unlike the option with {@link #throttleLatest(long, TimeUnit, boolean)}, the very last item being held back * (if any) is not emitted when the upstream completes. @@ -14063,7 +14063,7 @@ public final Observable throttleLatest(long timeout, @NonNull TimeUnit unit) * item from upstream, then periodically emitting the latest item (if any) when * the specified timeout elapses between them. *

- * + * *

* If no items were emitted from the upstream during this timeout phase, the next * upstream item is emitted immediately and the timeout window starts from then. @@ -14096,7 +14096,7 @@ public final Observable throttleLatest(long timeout, @NonNull TimeUnit unit, * item from upstream, then periodically emitting the latest item (if any) when * the specified timeout elapses between them. *

- * + * *

* Unlike the option with {@link #throttleLatest(long, TimeUnit, Scheduler, boolean)}, the very last item being held back * (if any) is not emitted when the upstream completes. @@ -14130,7 +14130,7 @@ public final Observable throttleLatest(long timeout, @NonNull TimeUnit unit, * item from upstream, then periodically emitting the latest item (if any) when * the specified timeout elapses between them. *

- * + * *

* If no items were emitted from the upstream during this timeout phase, the next * upstream item is emitted immediately and the timeout window starts from then. @@ -15085,7 +15085,7 @@ public final Single> toMap( * *

  • {@link BackpressureStrategy#LATEST} *

    - * + * *

  • *
  • {@link BackpressureStrategy#ERROR} *

    @@ -15093,7 +15093,7 @@ public final Single> toMap( *

  • *
  • {@link BackpressureStrategy#MISSING} *

    - * + * *

  • * *
    @@ -15259,7 +15259,7 @@ public final Flowable toFlowable(@NonNull BackpressureStrategy strategy) { * Return an {@code Observable} that schedules the downstream {@link Observer}s' {@code dispose} calls * aimed at the current {@code Observable} on the given {@link Scheduler}. *

    - * + * *

    *
    Scheduler:
    *
    You specify which {@code Scheduler} this operator will use.
    diff --git a/src/main/java/io/reactivex/rxjava3/core/Single.java b/src/main/java/io/reactivex/rxjava3/core/Single.java index 12431fedb6..10e7b48542 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Single.java +++ b/src/main/java/io/reactivex/rxjava3/core/Single.java @@ -120,7 +120,7 @@ public abstract class Single<@NonNull T> implements SingleSource { * Runs multiple {@link SingleSource}s and signals the events of the first one that signals (disposing * the rest). *

    - * + * *

    *
    Scheduler:
    *
    {@code amb} does not operate by default on a particular {@link Scheduler}.
    @@ -144,7 +144,7 @@ public static Single amb(@NonNull Iterable<@NonNull ? extends SingleSourc * Runs multiple {@link SingleSource}s and signals the events of the first one that signals (disposing * the rest). *

    - * + * *

    *
    Scheduler:
    *
    {@code ambArray} does not operate by default on a particular {@link Scheduler}.
    @@ -226,7 +226,7 @@ public static Observable concat(@NonNull ObservableSource - * + * *
    *
    Backpressure:
    *
    The returned {@link Flowable} honors the backpressure of the downstream consumer @@ -1712,7 +1712,7 @@ public static Flowable switchOnNext(@NonNull Publisher<@NonNull ? extends * exposing the success items as a {@link Flowable} sequence and delaying all errors from * all of them until all terminate. *

    - * + * *

    *
    Backpressure:
    *
    The {@code sources} {@code Publisher} is consumed in an unbounded manner (requesting {@link Long#MAX_VALUE}). @@ -1912,7 +1912,7 @@ public static Single zip(@NonNull Iterable<@NonNull ? extends SingleSo * Returns a {@code Single} that emits the results of a specified combiner function applied to two items emitted by * two other {@link SingleSource}s. *

    - * + * *

    *
    Scheduler:
    *
    {@code zip} does not operate by default on a particular {@link Scheduler}.
    @@ -1949,7 +1949,7 @@ public static Single zip( * Returns a {@code Single} that emits the results of a specified combiner function applied to three items emitted * by three other {@link SingleSource}s. *

    - * + * *

    *
    Scheduler:
    *
    {@code zip} does not operate by default on a particular {@link Scheduler}.
    @@ -1991,7 +1991,7 @@ public static Single zip( * Returns a {@code Single} that emits the results of a specified combiner function applied to four items * emitted by four other {@link SingleSource}s. *

    - * + * *

    *
    Scheduler:
    *
    {@code zip} does not operate by default on a particular {@link Scheduler}.
    @@ -2037,7 +2037,7 @@ public static Single zip( * Returns a {@code Single} that emits the results of a specified combiner function applied to five items * emitted by five other {@link SingleSource}s. *

    - * + * *

    *
    Scheduler:
    *
    {@code zip} does not operate by default on a particular {@link Scheduler}.
    @@ -2089,7 +2089,7 @@ public static Single zip( * Returns a {@code Single} that emits the results of a specified combiner function applied to six items * emitted by six other {@link SingleSource}s. *

    - * + * *

    *
    Scheduler:
    *
    {@code zip} does not operate by default on a particular {@link Scheduler}.
    @@ -2145,7 +2145,7 @@ public static Single zip( * Returns a {@code Single} that emits the results of a specified combiner function applied to seven items * emitted by seven other {@link SingleSource}s. *

    - * + * *

    *
    Scheduler:
    *
    {@code zip} does not operate by default on a particular {@link Scheduler}.
    @@ -2206,7 +2206,7 @@ public static Single zip( * Returns a {@code Single} that emits the results of a specified combiner function applied to eight items * emitted by eight other {@link SingleSource}s. *

    - * + * *

    *
    Scheduler:
    *
    {@code zip} does not operate by default on a particular {@link Scheduler}.
    @@ -2271,7 +2271,7 @@ public static Single zip( * Returns a {@code Single} that emits the results of a specified combiner function applied to nine items * emitted by nine other {@link SingleSource}s. *

    - * + * *

    *
    Scheduler:
    *
    {@code zip} does not operate by default on a particular {@link Scheduler}.
    @@ -2900,7 +2900,7 @@ public final Single delaySubscription(long time, @NonNull TimeUnit unit, @Non /** * Calls the specified consumer with the success item after this item has been emitted to the downstream. *

    - * + * *

    * Note that the {@code doAfterSuccess} action is shared between subscriptions and as such * should be thread-safe. @@ -2925,7 +2925,7 @@ public final Single doAfterSuccess(@NonNull Consumer onAfterSucces /** * Registers an {@link Action} to be called after this {@code Single} invokes either {@code onSuccess} or {@code onError}. *

    - * + * *

    * Note that the {@code doAfterTerminate} action is shared between subscriptions and as such * should be thread-safe.

    @@ -3319,7 +3319,7 @@ public final Flowable flattenAsFlowable(@NonNull Function - * + * *
    *
    Scheduler:
    *
    {@code flatMapObservable} does not operate by default on a particular {@link Scheduler}.
    @@ -3692,7 +3692,7 @@ public final Single> materialize() { * Signals {@code true} if the current {@code Single} signals a success value that is {@link Object#equals(Object)} with the value * provided. *

    - * + * *

    * *

    @@ -3739,7 +3739,7 @@ public final Single contains(@NonNull Object item, @NonNull BiPredicate /** * Flattens this {@code Single} and another {@link SingleSource} into one {@link Flowable}, without any transformation. *

    - * + * *

    * You can combine items emitted by multiple {@code SingleSource}s so that they appear as one {@code Flowable}, by using * the {@code mergeWith} method. @@ -3819,7 +3819,7 @@ public final Single observeOn(@NonNull Scheduler scheduler) { * Ends the flow with a success item returned by a function for the {@link Throwable} error signaled by the current * {@code Single} instead of signaling the error via {@code onError}. *

    - * + * *

    * By default, when a {@code Single} encounters an error that prevents it from emitting the expected item to its * subscriber, the {@code Single} invokes its subscriber's {@link SingleObserver#onError} method, and then quits @@ -3853,7 +3853,7 @@ public final Single onErrorReturn(@NonNull Function i /** * Signals the specified value as success in case the current {@code Single} signals an error. *

    - * + * *

    *
    Scheduler:
    *
    {@code onErrorReturnItem} does not operate by default on a particular {@link Scheduler}.
    @@ -3875,7 +3875,7 @@ public final Single onErrorReturnItem(@NonNull T item) { * Resumes the flow with the given {@link SingleSource} when the current {@code Single} fails instead of * signaling the error via {@code onError}. *

    - * + * *

    * By default, when a {@code Single} encounters an error that prevents it from emitting the expected item to * its {@link SingleObserver}, the {@code Single} invokes its {@code SingleObserver}'s {@code onError} method, and then quits @@ -3930,7 +3930,7 @@ public final Maybe onErrorComplete() { * Returns a {@link Maybe} instance that if this {@code Single} emits an error and the predicate returns * {@code true}, it will emit an {@code onComplete} and swallow the throwable. *

    - * + * *

    *
    Scheduler:
    *
    {@code onErrorComplete} does not operate by default on a particular {@link Scheduler}.
    @@ -3954,7 +3954,7 @@ public final Maybe onErrorComplete(@NonNull Predicate pred * Resumes the flow with a {@link SingleSource} returned for the failure {@link Throwable} of the current {@code Single} by a * function instead of signaling the error via {@code onError}. *

    - * + * *

    * By default, when a {@code Single} encounters an error that prevents it from emitting the expected item to * its {@link SingleObserver}, the {@code Single} invokes its {@code SingleObserver}'s {@code onError} method, and then quits @@ -4012,7 +4012,7 @@ public final Single onTerminateDetach() { /** * Repeatedly re-subscribes to the current {@code Single} and emits each success value as a {@link Flowable} sequence. *

    - * + * *

    *
    Backpressure:
    *
    The returned {@code Flowable} honors the backpressure of the downstream consumer.
    @@ -4033,7 +4033,7 @@ public final Flowable repeat() { /** * Re-subscribes to the current {@code Single} at most the given number of times and emits each success value as a {@link Flowable} sequence. *

    - * + * *

    *
    Backpressure:
    *
    The returned {@code Flowable} honors the backpressure of the downstream consumer.
    @@ -4058,7 +4058,7 @@ public final Flowable repeat(long times) { * the {@link Publisher} returned by the handler function signals a value in response to a * value signaled through the {@link Flowable} the handler receives. *

    - * + * *

    *
    Backpressure:
    *
    The returned {@code Flowable} honors the backpressure of the downstream consumer. @@ -4951,7 +4951,7 @@ public final Single takeUntil(@NonNull SingleSource other) { * Signals a {@link TimeoutException} if the current {@code Single} doesn't signal a success value within the * specified timeout window. *

    - * + * *

    *
    Scheduler:
    *
    {@code timeout} signals the {@code TimeoutException} on the {@code computation} {@link Scheduler}.
    @@ -5428,7 +5428,7 @@ public final Flowable flattenStreamAsFlowable(@NonNull Function - * + * *

    * The operator closes the {@code Stream} upon cancellation and when it terminates. The exceptions raised when * closing a {@code Stream} are routed to the global error handler ({@link RxJavaPlugins#onError(Throwable)}. diff --git a/src/main/java/io/reactivex/rxjava3/parallel/ParallelFlowable.java b/src/main/java/io/reactivex/rxjava3/parallel/ParallelFlowable.java index 403f69b1a0..58152e2400 100644 --- a/src/main/java/io/reactivex/rxjava3/parallel/ParallelFlowable.java +++ b/src/main/java/io/reactivex/rxjava3/parallel/ParallelFlowable.java @@ -1394,7 +1394,7 @@ public final ParallelFlowable concatMapDelayError( * Returns a {@code ParallelFlowable} that merges each item emitted by the source on each rail with the values in an * {@link Iterable} corresponding to that item that is generated by a selector. *

    - * + * *

    *
    Backpressure:
    *
    The operator honors backpressure from each downstream rail. The source {@code ParallelFlowable}s is @@ -1427,7 +1427,7 @@ public final ParallelFlowable flatMapIterable(@NonNull Function - * + * *
    *
    Backpressure:
    *
    The operator honors backpressure from each downstream rail. The source {@code ParallelFlowable}s is diff --git a/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java b/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java new file mode 100644 index 0000000000..420df2f648 --- /dev/null +++ b/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java @@ -0,0 +1,107 @@ +/** + * Copyright (c) 2016-present, RxJava Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is + * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See + * the License for the specific language governing permissions and limitations under the License. + */ +package io.reactivex.rxjava3.internal.util; + +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URL; +import java.nio.file.Files; +import java.util.*; +import java.util.regex.*; + +import javax.imageio.ImageIO; + +import io.reactivex.rxjava3.core.*; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.parallel.ParallelFlowable; +import io.reactivex.rxjava3.testsupport.TestHelper; + +/** + * Parses the main sources, locates the {@code } tags, downloads + * the referenced image and checks if the scaled dimensions are correct. + */ +public final class MarbleDimensions { + + /** Helper program. */ + private MarbleDimensions() { + throw new IllegalStateException("No instances!"); + } + + public static void main(String[] args) throws Throwable { + Pattern p = Pattern.compile("\\s*\\*\\s*\\ dimensions = new HashMap<>(); + + for (Class clazz : CLASSES) { + String simpleName = clazz.getSimpleName(); + System.out.println(simpleName); + System.out.println("----"); + String packageName = clazz.getPackage().getName(); + + File f = TestHelper.findSource(clazz.getSimpleName(), packageName); + if (f == null) { + System.err.println("Unable to locate " + clazz); + continue; + } + + List lines = Files.readAllLines(f.toPath()); + + for (int i = 0; i < lines.size(); i++) { + Matcher m = p.matcher(lines.get(i)); + if (m.matches()) { + int width = Integer.parseInt(m.group(2)); + int height = Integer.parseInt(m.group(5)); + String url = m.group(8); + + Integer[] imageDim = dimensions.get(url); + if (imageDim == null) { + Thread.sleep(SLEEP_PER_IMAGE_MILLIS); + + + try { + BufferedImage bimg = ImageIO.read(new URL(url)); + + if (bimg == null) { + throw new IOException("not found"); + } + imageDim = new Integer[] { 0, 0 }; + imageDim[0] = bimg.getWidth(); + imageDim[1] = bimg.getHeight(); + + dimensions.put(url, imageDim); + } catch (IOException ex) { + System.err.printf("%s => %s%n", url, ex); + System.err.printf(" at %s.%s.method(%s.java:%d)%n", packageName, simpleName, simpleName, i + 1); + } + } + + if (imageDim != null) { + int expectedHeight = (int)Math.round(1.0 * width / imageDim[0] * imageDim[1]); + + if (expectedHeight != height) { + System.out.printf(" %d => %d%n", height, expectedHeight); + System.out.printf(" at %s.%s.method(%s.java:%d)%n", packageName, simpleName, simpleName, i + 1); + } + } + // System.out.printf("%d: %d x %d => %s%n", i + 1, width, height, url); + } + } + } + } + + static final int SLEEP_PER_IMAGE_MILLIS = 100; + + static final Class[] CLASSES = { + Flowable.class, Observable.class, Maybe.class, Single.class, Completable.class, ParallelFlowable.class + }; +} From 3a5e88e9981189505c6e3343af3ed3f5d4b492e0 Mon Sep 17 00:00:00 2001 From: akarnokd Date: Tue, 28 Jan 2020 16:10:26 +0100 Subject: [PATCH 2/2] Remove an empty line. --- .../io/reactivex/rxjava3/internal/util/MarbleDimensions.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java b/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java index 420df2f648..5c0886ea9d 100644 --- a/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java +++ b/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java @@ -67,7 +67,6 @@ public static void main(String[] args) throws Throwable { if (imageDim == null) { Thread.sleep(SLEEP_PER_IMAGE_MILLIS); - try { BufferedImage bimg = ImageIO.read(new URL(url));