Skip to content

Commit 699e8e9

Browse files
vanniktechakarnokd
authored andcommitted
2.x: Add Single.fromObservable(ObservableSource) (#4760)
* 2.x: Add Single.fromObservable(ObservableSource) * Add Null test
1 parent b0520da commit 699e8e9

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed

src/main/java/io/reactivex/Single.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import io.reactivex.internal.operators.completable.*;
2828
import io.reactivex.internal.operators.flowable.*;
2929
import io.reactivex.internal.operators.maybe.*;
30-
import io.reactivex.internal.operators.observable.ObservableConcatMap;
30+
import io.reactivex.internal.operators.observable.*;
3131
import io.reactivex.internal.operators.single.*;
3232
import io.reactivex.internal.util.*;
3333
import io.reactivex.observers.TestObserver;
@@ -573,6 +573,27 @@ public static <T> Single<T> fromPublisher(final Publisher<? extends T> publisher
573573
return RxJavaPlugins.onAssembly(new SingleFromPublisher<T>(publisher));
574574
}
575575

576+
/**
577+
* Wraps a specific ObservableSource into a Single and signals its single element or error.
578+
* <p>If the ObservableSource is empty, a NoSuchElementException is signalled.
579+
* If the source has more than one element, an IndexOutOfBoundsException is signalled.
580+
* <p>
581+
* <dl>
582+
* <dt><b>Scheduler:</b></dt>
583+
* <dd>{@code fromObservable} does not operate by default on a particular {@link Scheduler}.</dd>
584+
* </dl>
585+
*
586+
* @param observableSource the source Observable, not null
587+
* @param <T>
588+
* the type of the item emitted by the {@link Single}.
589+
* @return the new Single instance
590+
*/
591+
@SchedulerSupport(SchedulerSupport.NONE)
592+
public static <T> Single<T> fromObservable(ObservableSource<? extends T> observableSource) {
593+
ObjectHelper.requireNonNull(observableSource, "observableSource is null");
594+
return RxJavaPlugins.onAssembly(new ObservableSingleSingle<T>(observableSource, null));
595+
}
596+
576597
/**
577598
* Returns a {@code Single} that emits a specified item.
578599
* <p>

src/main/java/io/reactivex/internal/operators/observable/ObservableSingleSingle.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121

2222
public final class ObservableSingleSingle<T> extends Single<T> {
2323

24-
final ObservableSource<T> source;
24+
final ObservableSource<? extends T> source;
2525

2626
final T defaultValue;
2727

28-
public ObservableSingleSingle(ObservableSource<T> source, T defaultValue) {
28+
public ObservableSingleSingle(ObservableSource<? extends T> source, T defaultValue) {
2929
this.source = source;
3030
this.defaultValue = defaultValue;
3131
}

src/test/java/io/reactivex/single/SingleTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.junit.*;
2323

2424
import io.reactivex.*;
25+
import io.reactivex.Observable;
2526
import io.reactivex.disposables.*;
2627
import io.reactivex.exceptions.TestException;
2728
import io.reactivex.functions.*;
@@ -541,5 +542,40 @@ public Integer apply(Single<Integer> v) throws Exception {
541542
}
542543
}).intValue());
543544
}
545+
546+
@Test(expected = NullPointerException.class)
547+
public void fromObservableNull() {
548+
Single.fromObservable(null);
549+
}
550+
551+
@Test
552+
public void fromObservableEmpty() {
553+
Single.fromObservable(Observable.empty())
554+
.test()
555+
.assertFailure(NoSuchElementException.class);
556+
}
557+
558+
@Test
559+
public void fromObservableMoreThan1Elements() {
560+
Single.fromObservable(Observable.just(1, 2))
561+
.test()
562+
.assertFailure(IllegalArgumentException.class)
563+
.assertErrorMessage("Sequence contains more than one element!");
564+
}
565+
566+
@Test
567+
public void fromObservableOneElement() {
568+
Single.fromObservable(Observable.just(1))
569+
.test()
570+
.assertResult(1);
571+
}
572+
573+
@Test
574+
public void fromObservableError() {
575+
Single.fromObservable(Observable.error(new RuntimeException("some error")))
576+
.test()
577+
.assertFailure(RuntimeException.class)
578+
.assertErrorMessage("some error");
579+
}
544580
}
545581

0 commit comments

Comments
 (0)