Skip to content

Commit 848a4e0

Browse files
Merge pull request #410 from zsxwing/contains
Implemented the 'Contains' operator
2 parents b941aa1 + bdddee6 commit 848a4e0

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

rxjava-core/src/main/java/rx/Observable.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3152,6 +3152,22 @@ public Observable<Boolean> exists(Func1<? super T, Boolean> predicate) {
31523152
return create(OperationAny.exists(this, predicate));
31533153
}
31543154

3155+
/**
3156+
* Determines whether an observable sequence contains a specified element.
3157+
*
3158+
* @param value
3159+
* The element to search in the sequence.
3160+
* @return an Observable that emits if the element is in the source sequence.
3161+
* @see <a href="http://msdn.microsoft.com/en-us/library/hh228965(v=vs.103).aspx">MSDN: Observable.Contains</a>
3162+
*/
3163+
public Observable<Boolean> contains(final T element) {
3164+
return exists(new Func1<T, Boolean>() {
3165+
public Boolean call(T t1) {
3166+
return element == null ? t1 == null : element.equals(t1);
3167+
}
3168+
});
3169+
}
3170+
31553171
/**
31563172
* Registers an {@link Action0} to be called when this Observable invokes {@link Observer#onCompleted onCompleted} or {@link Observer#onError onError}.
31573173
* <p>

rxjava-core/src/test/java/rx/ObservableTests.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,4 +783,59 @@ public void testOfTypeWithPolymorphism() {
783783
verify(aObserver, times(1)).onCompleted();
784784
}
785785

786+
@Test
787+
public void testContains() {
788+
Observable<Boolean> observable = Observable.from("a", "b", null).contains("b");
789+
790+
@SuppressWarnings("unchecked")
791+
Observer<Object> aObserver = mock(Observer.class);
792+
observable.subscribe(aObserver);
793+
verify(aObserver, times(1)).onNext(true);
794+
verify(aObserver, never()).onNext(false);
795+
verify(aObserver, never()).onError(
796+
org.mockito.Matchers.any(Throwable.class));
797+
verify(aObserver, times(1)).onCompleted();
798+
}
799+
800+
@Test
801+
public void testContainsWithInexistence() {
802+
Observable<Boolean> observable = Observable.from("a", "b", null).contains("c");
803+
804+
@SuppressWarnings("unchecked")
805+
Observer<Object> aObserver = mock(Observer.class);
806+
observable.subscribe(aObserver);
807+
verify(aObserver, times(1)).onNext(false);
808+
verify(aObserver, never()).onNext(true);
809+
verify(aObserver, never()).onError(
810+
org.mockito.Matchers.any(Throwable.class));
811+
verify(aObserver, times(1)).onCompleted();
812+
}
813+
814+
@Test
815+
public void testContainsWithNull() {
816+
Observable<Boolean> observable = Observable.from("a", "b", null).contains(null);
817+
818+
@SuppressWarnings("unchecked")
819+
Observer<Object> aObserver = mock(Observer.class);
820+
observable.subscribe(aObserver);
821+
verify(aObserver, times(1)).onNext(true);
822+
verify(aObserver, never()).onNext(false);
823+
verify(aObserver, never()).onError(
824+
org.mockito.Matchers.any(Throwable.class));
825+
verify(aObserver, times(1)).onCompleted();
826+
}
827+
828+
@Test
829+
public void testContainsWithEmptyObservable() {
830+
Observable<Boolean> observable = Observable.<String>empty().contains("a");
831+
832+
@SuppressWarnings("unchecked")
833+
Observer<Object> aObserver = mock(Observer.class);
834+
observable.subscribe(aObserver);
835+
verify(aObserver, times(1)).onNext(false);
836+
verify(aObserver, never()).onNext(true);
837+
verify(aObserver, never()).onError(
838+
org.mockito.Matchers.any(Throwable.class));
839+
verify(aObserver, times(1)).onCompleted();
840+
}
786841
}

0 commit comments

Comments
 (0)