/**
* 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.assertEquals;
import static org.mockito.Mockito.*;
import java.util.Arrays;
import org.junit.Test;
import io.reactivex.*;
import io.reactivex.observers.TestObserver;
public class ObservableSkipTest {
@Test
public void testSkipNegativeElements() {
Observable<String> skip = Observable.just("one", "two", "three").skip(-99);
Observer<String> observer = TestHelper.mockObserver();
skip.subscribe(observer);
verify(observer, times(1)).onNext("one");
verify(observer, times(1)).onNext("two");
verify(observer, times(1)).onNext("three");
verify(observer, never()).onError(any(Throwable.class));
verify(observer, times(1)).onComplete();
}
@Test
public void testSkipZeroElements() {
Observable<String> skip = Observable.just("one", "two", "three").skip(0);
Observer<String> observer = TestHelper.mockObserver();
skip.subscribe(observer);
verify(observer, times(1)).onNext("one");
verify(observer, times(1)).onNext("two");
verify(observer, times(1)).onNext("three");
verify(observer, never()).onError(any(Throwable.class));
verify(observer, times(1)).onComplete();
}
@Test
public void testSkipOneElement() {
Observable<String> skip = Observable.just("one", "two", "three").skip(1);
Observer<String> observer = TestHelper.mockObserver();
skip.subscribe(observer);
verify(observer, never()).onNext("one");
verify(observer, times(1)).onNext("two");
verify(observer, times(1)).onNext("three");
verify(observer, never()).onError(any(Throwable.class));
verify(observer, times(1)).onComplete();
}
@Test
public void testSkipTwoElements() {
Observable<String> skip = Observable.just("one", "two", "three").skip(2);
Observer<String> observer = TestHelper.mockObserver();
skip.subscribe(observer);
verify(observer, never()).onNext("one");
verify(observer, never()).onNext("two");
verify(observer, times(1)).onNext("three");
verify(observer, never()).onError(any(Throwable.class));
verify(observer, times(1)).onComplete();
}
@Test
public void testSkipEmptyStream() {
Observable<String> w = Observable.empty();
Observable<String> skip = w.skip(1);
Observer<String> observer = TestHelper.mockObserver();
skip.subscribe(observer);
verify(observer, never()).onNext(any(String.class));
verify(observer, never()).onError(any(Throwable.class));
verify(observer, times(1)).onComplete();
}
@Test
public void testSkipMultipleObservers() {
Observable<String> skip = Observable.just("one", "two", "three")
.skip(2);
Observer<String> observer1 = TestHelper.mockObserver();
skip.subscribe(observer1);
Observer<String> observer2 = TestHelper.mockObserver();
skip.subscribe(observer2);
verify(observer1, times(1)).onNext(any(String.class));
verify(observer1, never()).onError(any(Throwable.class));
verify(observer1, times(1)).onComplete();
verify(observer2, times(1)).onNext(any(String.class));
verify(observer2, never()).onError(any(Throwable.class));
verify(observer2, times(1)).onComplete();
}
@Test
public void testSkipError() {
Exception e = new Exception();
Observable<String> ok = Observable.just("one");
Observable<String> error = Observable.error(e);
Observable<String> skip = Observable.concat(ok, error).skip(100);
Observer<String> observer = TestHelper.mockObserver();
skip.subscribe(observer);
verify(observer, never()).onNext(any(String.class));
verify(observer, times(1)).onError(e);
verify(observer, never()).onComplete();
}
@Test
public void testRequestOverflowDoesNotOccur() {
TestObserver<Integer> ts = new TestObserver<Integer>();
Observable.range(1, 10).skip(5).subscribe(ts);
ts.assertTerminated();
ts.assertComplete();
ts.assertNoErrors();
assertEquals(Arrays.asList(6,7,8,9,10), ts.values());
}
@Test
public void dispose() {
TestHelper.checkDisposed(Observable.just(1).skip(2));
}
}