/**
* 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.internal.operators.observable;
import static org.junit.Assert.*;
import java.util.*;
import java.util.concurrent.*;
import org.junit.*;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposables;
import io.reactivex.exceptions.TestException;
public class BlockingObservableToFutureTest {
@Ignore("No separate file")
@Test
public void constructorShouldBePrivate() {
// TestHelper.checkUtilityClass(FlowableToFuture.class);
}
@Test
public void testToFuture() throws InterruptedException, ExecutionException {
Observable<String> obs = Observable.just("one");
Future<String> f = obs.toFuture();
assertEquals("one", f.get());
}
@Test
public void testToFutureList() throws InterruptedException, ExecutionException {
Observable<String> obs = Observable.just("one", "two", "three");
Future<List<String>> f = obs.toList().toFuture();
assertEquals("one", f.get().get(0));
assertEquals("two", f.get().get(1));
assertEquals("three", f.get().get(2));
}
@Test(/* timeout = 5000, */expected = IndexOutOfBoundsException.class)
public void testExceptionWithMoreThanOneElement() throws Throwable {
Observable<String> obs = Observable.just("one", "two");
Future<String> f = obs.toFuture();
try {
// we expect an exception since there are more than 1 element
f.get();
fail("Should have thrown!");
}
catch (ExecutionException e) {
throw e.getCause();
}
}
@Test
public void testToFutureWithException() {
Observable<String> obs = Observable.unsafeCreate(new ObservableSource<String>() {
@Override
public void subscribe(Observer<? super String> observer) {
observer.onSubscribe(Disposables.empty());
observer.onNext("one");
observer.onError(new TestException());
}
});
Future<String> f = obs.toFuture();
try {
f.get();
fail("expected exception");
} catch (Throwable e) {
assertEquals(TestException.class, e.getCause().getClass());
}
}
@Test(expected = CancellationException.class)
public void testGetAfterCancel() throws Exception {
Observable<String> obs = Observable.never();
Future<String> f = obs.toFuture();
boolean cancelled = f.cancel(true);
assertTrue(cancelled); // because OperationNeverComplete never does
f.get(); // Future.get() docs require this to throw
}
@Test(expected = CancellationException.class)
public void testGetWithTimeoutAfterCancel() throws Exception {
Observable<String> obs = Observable.never();
Future<String> f = obs.toFuture();
boolean cancelled = f.cancel(true);
assertTrue(cancelled); // because OperationNeverComplete never does
f.get(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // Future.get() docs require this to throw
}
@Test(expected = NoSuchElementException.class)
public void testGetWithEmptyFlowable() throws Throwable {
Observable<String> obs = Observable.empty();
Future<String> f = obs.toFuture();
try {
f.get();
}
catch (ExecutionException e) {
throw e.getCause();
}
}
@Ignore("null value is not allowed")
@Test
public void testGetWithASingleNullItem() throws Exception {
Observable<String> obs = Observable.just((String)null);
Future<String> f = obs.toFuture();
assertEquals(null, f.get());
}
}