/**
* 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.mockito.ArgumentMatchers.isA;
import static org.mockito.Mockito.*;
import org.junit.*;
import org.mockito.InOrder;
import io.reactivex.*;
import io.reactivex.exceptions.TestException;
import io.reactivex.functions.BiPredicate;
import io.reactivex.observers.TestObserver;
import io.reactivex.subjects.PublishSubject;
public class ObservableSequenceEqualTest {
@Test
public void test1Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three"),
Observable.just("one", "two", "three")).toObservable();
verifyResult(o, true);
}
@Test
public void test2Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three"),
Observable.just("one", "two", "three", "four")).toObservable();
verifyResult(o, false);
}
@Test
public void test3Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three", "four"),
Observable.just("one", "two", "three")).toObservable();
verifyResult(o, false);
}
@Test
public void testWithError1Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.concat(Observable.just("one"),
Observable.<String> error(new TestException())),
Observable.just("one", "two", "three")).toObservable();
verifyError(o);
}
@Test
public void testWithError2Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three"),
Observable.concat(Observable.just("one"),
Observable.<String> error(new TestException()))).toObservable();
verifyError(o);
}
@Test
public void testWithError3Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.concat(Observable.just("one"),
Observable.<String> error(new TestException())),
Observable.concat(Observable.just("one"),
Observable.<String> error(new TestException()))).toObservable();
verifyError(o);
}
@Test
public void testWithEmpty1Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.<String> empty(),
Observable.just("one", "two", "three")).toObservable();
verifyResult(o, false);
}
@Test
public void testWithEmpty2Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three"),
Observable.<String> empty()).toObservable();
verifyResult(o, false);
}
@Test
public void testWithEmpty3Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.<String> empty(), Observable.<String> empty()).toObservable();
verifyResult(o, true);
}
@Test
@Ignore("Null values not allowed")
public void testWithNull1Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.just((String) null), Observable.just("one")).toObservable();
verifyResult(o, false);
}
@Test
@Ignore("Null values not allowed")
public void testWithNull2Observable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.just((String) null), Observable.just((String) null)).toObservable();
verifyResult(o, true);
}
@Test
public void testWithEqualityErrorObservable() {
Observable<Boolean> o = Observable.sequenceEqual(
Observable.just("one"), Observable.just("one"),
new BiPredicate<String, String>() {
@Override
public boolean test(String t1, String t2) {
throw new TestException();
}
}).toObservable();
verifyError(o);
}
private void verifyResult(Single<Boolean> o, boolean result) {
SingleObserver<Boolean> observer = TestHelper.mockSingleObserver();
o.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onSuccess(result);
inOrder.verifyNoMoreInteractions();
}
private void verifyError(Observable<Boolean> observable) {
Observer<Boolean> observer = TestHelper.mockObserver();
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onError(isA(TestException.class));
inOrder.verifyNoMoreInteractions();
}
private void verifyError(Single<Boolean> observable) {
SingleObserver<Boolean> observer = TestHelper.mockSingleObserver();
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onError(isA(TestException.class));
inOrder.verifyNoMoreInteractions();
}
@Test
public void prefetchObservable() {
Observable.sequenceEqual(Observable.range(1, 20), Observable.range(1, 20), 2)
.toObservable()
.test()
.assertResult(true);
}
@Test
public void disposedObservable() {
TestHelper.checkDisposed(Observable.sequenceEqual(Observable.just(1), Observable.just(2)).toObservable());
}
@Test
public void test1() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three"),
Observable.just("one", "two", "three"));
verifyResult(o, true);
}
@Test
public void test2() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three"),
Observable.just("one", "two", "three", "four"));
verifyResult(o, false);
}
@Test
public void test3() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three", "four"),
Observable.just("one", "two", "three"));
verifyResult(o, false);
}
@Test
public void testWithError1() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.concat(Observable.just("one"),
Observable.<String> error(new TestException())),
Observable.just("one", "two", "three"));
verifyError(o);
}
@Test
public void testWithError2() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three"),
Observable.concat(Observable.just("one"),
Observable.<String> error(new TestException())));
verifyError(o);
}
@Test
public void testWithError3() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.concat(Observable.just("one"),
Observable.<String> error(new TestException())),
Observable.concat(Observable.just("one"),
Observable.<String> error(new TestException())));
verifyError(o);
}
@Test
public void testWithEmpty1() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.<String> empty(),
Observable.just("one", "two", "three"));
verifyResult(o, false);
}
@Test
public void testWithEmpty2() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.just("one", "two", "three"),
Observable.<String> empty());
verifyResult(o, false);
}
@Test
public void testWithEmpty3() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.<String> empty(), Observable.<String> empty());
verifyResult(o, true);
}
@Test
@Ignore("Null values not allowed")
public void testWithNull1() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.just((String) null), Observable.just("one"));
verifyResult(o, false);
}
@Test
@Ignore("Null values not allowed")
public void testWithNull2() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.just((String) null), Observable.just((String) null));
verifyResult(o, true);
}
@Test
public void testWithEqualityError() {
Single<Boolean> o = Observable.sequenceEqual(
Observable.just("one"), Observable.just("one"),
new BiPredicate<String, String>() {
@Override
public boolean test(String t1, String t2) {
throw new TestException();
}
});
verifyError(o);
}
private void verifyResult(Observable<Boolean> o, boolean result) {
Observer<Boolean> observer = TestHelper.mockObserver();
o.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(result);
inOrder.verify(observer).onComplete();
inOrder.verifyNoMoreInteractions();
}
@Test
public void prefetch() {
Observable.sequenceEqual(Observable.range(1, 20), Observable.range(1, 20), 2)
.test()
.assertResult(true);
}
@Test
public void disposed() {
TestHelper.checkDisposed(Observable.sequenceEqual(Observable.just(1), Observable.just(2)));
}
@Test
public void simpleInequal() {
Observable.sequenceEqual(Observable.just(1), Observable.just(2))
.test()
.assertResult(false);
}
@Test
public void simpleInequalObservable() {
Observable.sequenceEqual(Observable.just(1), Observable.just(2))
.toObservable()
.test()
.assertResult(false);
}
@Test
public void onNextCancelRace() {
for (int i = 0; i < 500; i++) {
final PublishSubject<Integer> ps = PublishSubject.create();
final TestObserver<Boolean> to = Observable.sequenceEqual(Observable.never(), ps).test();
Runnable r1 = new Runnable() {
@Override
public void run() {
to.cancel();
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
ps.onNext(1);
}
};
TestHelper.race(r1, r2);
to.assertEmpty();
}
}
@Test
public void onNextCancelRaceObservable() {
for (int i = 0; i < 500; i++) {
final PublishSubject<Integer> ps = PublishSubject.create();
final TestObserver<Boolean> to = Observable.sequenceEqual(Observable.never(), ps).toObservable().test();
Runnable r1 = new Runnable() {
@Override
public void run() {
to.cancel();
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
ps.onNext(1);
}
};
TestHelper.race(r1, r2);
to.assertEmpty();
}
}
}