/**
* Copyright 2014 Netflix, Inc.
*
* 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 rx.internal.operators;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
import java.util.NoSuchElementException;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
import rx.Observable;
import rx.Observer;
import rx.functions.Func1;
public class OperatorFirstTest {
@Mock
Observer<String> w;
private static final Func1<String, Boolean> IS_D = new Func1<String, Boolean>() {
@Override
public Boolean call(String value) {
return "d".equals(value);
}
};
@Before
public void before() {
initMocks(this);
}
@Test
public void testFirstOrElseOfNone() {
Observable<String> src = Observable.empty();
src.firstOrDefault("default").subscribe(w);
verify(w, times(1)).onNext(anyString());
verify(w, times(1)).onNext("default");
verify(w, never()).onError(any(Throwable.class));
verify(w, times(1)).onCompleted();
}
@Test
public void testFirstOrElseOfSome() {
Observable<String> src = Observable.just("a", "b", "c");
src.firstOrDefault("default").subscribe(w);
verify(w, times(1)).onNext(anyString());
verify(w, times(1)).onNext("a");
verify(w, never()).onError(any(Throwable.class));
verify(w, times(1)).onCompleted();
}
@Test
public void testFirstOrElseWithPredicateOfNoneMatchingThePredicate() {
Observable<String> src = Observable.just("a", "b", "c");
src.firstOrDefault("default", IS_D).subscribe(w);
verify(w, times(1)).onNext(anyString());
verify(w, times(1)).onNext("default");
verify(w, never()).onError(any(Throwable.class));
verify(w, times(1)).onCompleted();
}
@Test
public void testFirstOrElseWithPredicateOfSome() {
Observable<String> src = Observable.just("a", "b", "c", "d", "e", "f");
src.firstOrDefault("default", IS_D).subscribe(w);
verify(w, times(1)).onNext(anyString());
verify(w, times(1)).onNext("d");
verify(w, never()).onError(any(Throwable.class));
verify(w, times(1)).onCompleted();
}
@Test
public void testFirst() {
Observable<Integer> observable = Observable.just(1, 2, 3).first();
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(1);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstWithOneElement() {
Observable<Integer> observable = Observable.just(1).first();
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(1);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstWithEmpty() {
Observable<Integer> observable = Observable.<Integer> empty().first();
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onError(
isA(NoSuchElementException.class));
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstWithPredicate() {
Observable<Integer> observable = Observable.just(1, 2, 3, 4, 5, 6)
.first(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer t1) {
return t1 % 2 == 0;
}
});
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(2);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstWithPredicateAndOneElement() {
Observable<Integer> observable = Observable.just(1, 2).first(
new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer t1) {
return t1 % 2 == 0;
}
});
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(2);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstWithPredicateAndEmpty() {
Observable<Integer> observable = Observable.just(1).first(
new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer t1) {
return t1 % 2 == 0;
}
});
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onError(
isA(NoSuchElementException.class));
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstOrDefault() {
Observable<Integer> observable = Observable.just(1, 2, 3)
.firstOrDefault(4);
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(1);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstOrDefaultWithOneElement() {
Observable<Integer> observable = Observable.just(1).firstOrDefault(2);
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(1);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstOrDefaultWithEmpty() {
Observable<Integer> observable = Observable.<Integer> empty()
.firstOrDefault(1);
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(1);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstOrDefaultWithPredicate() {
Observable<Integer> observable = Observable.just(1, 2, 3, 4, 5, 6)
.firstOrDefault(8, new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer t1) {
return t1 % 2 == 0;
}
});
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(2);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstOrDefaultWithPredicateAndOneElement() {
Observable<Integer> observable = Observable.just(1, 2).firstOrDefault(
4, new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer t1) {
return t1 % 2 == 0;
}
});
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(2);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
@Test
public void testFirstOrDefaultWithPredicateAndEmpty() {
Observable<Integer> observable = Observable.just(1).firstOrDefault(2,
new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer t1) {
return t1 % 2 == 0;
}
});
@SuppressWarnings("unchecked")
Observer<Integer> observer = mock(Observer.class);
observable.subscribe(observer);
InOrder inOrder = inOrder(observer);
inOrder.verify(observer, times(1)).onNext(2);
inOrder.verify(observer, times(1)).onCompleted();
inOrder.verifyNoMoreInteractions();
}
}