/** * 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.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import java.util.ArrayList; import java.util.List; import org.junit.Test; import rx.Observable; import rx.Observer; import rx.exceptions.TestException; import rx.subjects.PublishSubject; public class OperatorWindowWithObservableTest { @Test public void testWindowViaObservableNormal1() { PublishSubject<Integer> source = PublishSubject.create(); PublishSubject<Integer> boundary = PublishSubject.create(); @SuppressWarnings("unchecked") final Observer<Object> o = mock(Observer.class); final List<Observer<Object>> values = new ArrayList<Observer<Object>>(); Observer<Observable<Integer>> wo = new Observer<Observable<Integer>>() { @Override public void onNext(Observable<Integer> args) { @SuppressWarnings("unchecked") final Observer<Object> mo = mock(Observer.class); values.add(mo); args.subscribe(mo); } @Override public void onError(Throwable e) { o.onError(e); } @Override public void onCompleted() { o.onCompleted(); } }; source.window(boundary).subscribe(wo); int n = 30; for (int i = 0; i < n; i++) { source.onNext(i); if (i % 3 == 2 && i < n - 1) { boundary.onNext(i / 3); } } source.onCompleted(); assertEquals(n / 3, values.size()); int j = 0; for (Observer<Object> mo : values) { for (int i = 0; i < 3; i++) { verify(mo).onNext(j + i); } verify(mo).onCompleted(); verify(mo, never()).onError(any(Throwable.class)); j += 3; } verify(o).onCompleted(); verify(o, never()).onError(any(Throwable.class)); } @Test public void testWindowViaObservableBoundaryCompletes() { PublishSubject<Integer> source = PublishSubject.create(); PublishSubject<Integer> boundary = PublishSubject.create(); @SuppressWarnings("unchecked") final Observer<Object> o = mock(Observer.class); final List<Observer<Object>> values = new ArrayList<Observer<Object>>(); Observer<Observable<Integer>> wo = new Observer<Observable<Integer>>() { @Override public void onNext(Observable<Integer> args) { @SuppressWarnings("unchecked") final Observer<Object> mo = mock(Observer.class); values.add(mo); args.subscribe(mo); } @Override public void onError(Throwable e) { o.onError(e); } @Override public void onCompleted() { o.onCompleted(); } }; source.window(boundary).subscribe(wo); int n = 30; for (int i = 0; i < n; i++) { source.onNext(i); if (i % 3 == 2 && i < n - 1) { boundary.onNext(i / 3); } } boundary.onCompleted(); assertEquals(n / 3, values.size()); int j = 0; for (Observer<Object> mo : values) { for (int i = 0; i < 3; i++) { verify(mo).onNext(j + i); } verify(mo).onCompleted(); verify(mo, never()).onError(any(Throwable.class)); j += 3; } verify(o).onCompleted(); verify(o, never()).onError(any(Throwable.class)); } @Test public void testWindowViaObservableBoundaryThrows() { PublishSubject<Integer> source = PublishSubject.create(); PublishSubject<Integer> boundary = PublishSubject.create(); @SuppressWarnings("unchecked") final Observer<Object> o = mock(Observer.class); final List<Observer<Object>> values = new ArrayList<Observer<Object>>(); Observer<Observable<Integer>> wo = new Observer<Observable<Integer>>() { @Override public void onNext(Observable<Integer> args) { @SuppressWarnings("unchecked") final Observer<Object> mo = mock(Observer.class); values.add(mo); args.subscribe(mo); } @Override public void onError(Throwable e) { o.onError(e); } @Override public void onCompleted() { o.onCompleted(); } }; source.window(boundary).subscribe(wo); source.onNext(0); source.onNext(1); source.onNext(2); boundary.onError(new TestException()); assertEquals(1, values.size()); Observer<Object> mo = values.get(0); verify(mo).onNext(0); verify(mo).onNext(1); verify(mo).onNext(2); verify(mo).onError(any(TestException.class)); verify(o, never()).onCompleted(); verify(o).onError(any(TestException.class)); } @Test public void testWindowViaObservableSourceThrows() { PublishSubject<Integer> source = PublishSubject.create(); PublishSubject<Integer> boundary = PublishSubject.create(); @SuppressWarnings("unchecked") final Observer<Object> o = mock(Observer.class); final List<Observer<Object>> values = new ArrayList<Observer<Object>>(); Observer<Observable<Integer>> wo = new Observer<Observable<Integer>>() { @Override public void onNext(Observable<Integer> args) { @SuppressWarnings("unchecked") final Observer<Object> mo = mock(Observer.class); values.add(mo); args.subscribe(mo); } @Override public void onError(Throwable e) { o.onError(e); } @Override public void onCompleted() { o.onCompleted(); } }; source.window(boundary).subscribe(wo); source.onNext(0); source.onNext(1); source.onNext(2); source.onError(new TestException()); assertEquals(1, values.size()); Observer<Object> mo = values.get(0); verify(mo).onNext(0); verify(mo).onNext(1); verify(mo).onNext(2); verify(mo).onError(any(TestException.class)); verify(o, never()).onCompleted(); verify(o).onError(any(TestException.class)); } }