/**
* 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.flowable;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import java.util.List;
import org.junit.Test;
import org.reactivestreams.Subscriber;
import io.reactivex.*;
import io.reactivex.exceptions.TestException;
import io.reactivex.functions.*;
import io.reactivex.internal.functions.Functions;
import io.reactivex.internal.subscriptions.BooleanSubscription;
import io.reactivex.plugins.RxJavaPlugins;
import io.reactivex.processors.PublishProcessor;
import io.reactivex.subscribers.TestSubscriber;
;
public class FlowableTakeUntilPredicateTest {
@Test
public void takeEmpty() {
Subscriber<Object> o = TestHelper.mockSubscriber();
Flowable.empty().takeUntil(new Predicate<Object>() {
@Override
public boolean test(Object v) {
return true;
}
}).subscribe(o);
verify(o, never()).onNext(any());
verify(o, never()).onError(any(Throwable.class));
verify(o).onComplete();
}
@Test
public void takeAll() {
Subscriber<Object> o = TestHelper.mockSubscriber();
Flowable.just(1, 2).takeUntil(new Predicate<Integer>() {
@Override
public boolean test(Integer v) {
return false;
}
}).subscribe(o);
verify(o).onNext(1);
verify(o).onNext(2);
verify(o, never()).onError(any(Throwable.class));
verify(o).onComplete();
}
@Test
public void takeFirst() {
Subscriber<Object> o = TestHelper.mockSubscriber();
Flowable.just(1, 2).takeUntil(new Predicate<Integer>() {
@Override
public boolean test(Integer v) {
return true;
}
}).subscribe(o);
verify(o).onNext(1);
verify(o, never()).onNext(2);
verify(o, never()).onError(any(Throwable.class));
verify(o).onComplete();
}
@Test
public void takeSome() {
Subscriber<Object> o = TestHelper.mockSubscriber();
Flowable.just(1, 2, 3).takeUntil(new Predicate<Integer>() {
@Override
public boolean test(Integer t1) {
return t1 == 2;
}
})
.subscribe(o);
verify(o).onNext(1);
verify(o).onNext(2);
verify(o, never()).onNext(3);
verify(o, never()).onError(any(Throwable.class));
verify(o).onComplete();
}
@Test
public void functionThrows() {
Subscriber<Object> o = TestHelper.mockSubscriber();
Predicate<Integer> predicate = new Predicate<Integer>() {
@Override
public boolean test(Integer t1) {
throw new TestException("Forced failure");
}
};
Flowable.just(1, 2, 3).takeUntil(predicate).subscribe(o);
verify(o).onNext(1);
verify(o, never()).onNext(2);
verify(o, never()).onNext(3);
verify(o).onError(any(TestException.class));
verify(o, never()).onComplete();
}
@Test
public void sourceThrows() {
Subscriber<Object> o = TestHelper.mockSubscriber();
Flowable.just(1)
.concatWith(Flowable.<Integer>error(new TestException()))
.concatWith(Flowable.just(2))
.takeUntil(new Predicate<Integer>() {
@Override
public boolean test(Integer v) {
return false;
}
}).subscribe(o);
verify(o).onNext(1);
verify(o, never()).onNext(2);
verify(o).onError(any(TestException.class));
verify(o, never()).onComplete();
}
@Test
public void backpressure() {
TestSubscriber<Integer> ts = new TestSubscriber<Integer>(5L);
Flowable.range(1, 1000).takeUntil(new Predicate<Integer>() {
@Override
public boolean test(Integer v) {
return false;
}
}).subscribe(ts);
ts.assertNoErrors();
ts.assertValues(1, 2, 3, 4, 5);
ts.assertNotComplete();
}
@Test
public void testErrorIncludesLastValueAsCause() {
TestSubscriber<String> ts = new TestSubscriber<String>();
final TestException e = new TestException("Forced failure");
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean test(String t) {
throw e;
}
};
Flowable.just("abc").takeUntil(predicate).subscribe(ts);
ts.assertTerminated();
ts.assertNotComplete();
ts.assertError(TestException.class);
// FIXME last cause value is not saved
// assertTrue(ts.errors().get(0).getCause().getMessage().contains("abc"));
}
@Test
public void dispose() {
TestHelper.checkDisposed(PublishProcessor.create().takeUntil(Functions.alwaysFalse()));
}
@Test
public void doubleOnSubscribe() {
TestHelper.checkDoubleOnSubscribeFlowable(new Function<Flowable<Object>, Flowable<Object>>() {
@Override
public Flowable<Object> apply(Flowable<Object> o) throws Exception {
return o.takeUntil(Functions.alwaysFalse());
}
});
}
@Test
public void badSource() {
List<Throwable> errors = TestHelper.trackPluginErrors();
try {
new Flowable<Integer>() {
@Override
protected void subscribeActual(Subscriber<? super Integer> observer) {
observer.onSubscribe(new BooleanSubscription());
observer.onComplete();
observer.onNext(1);
observer.onError(new TestException());
observer.onComplete();
}
}
.takeUntil(Functions.alwaysFalse())
.test()
.assertResult();
TestHelper.assertUndeliverable(errors, 0, TestException.class);
} finally {
RxJavaPlugins.reset();
}
}
}