/** * 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.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; import java.util.Arrays; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; import rx.Observable; import rx.Observable.OnSubscribe; import rx.Observer; import rx.Subscriber; import rx.exceptions.TestException; import rx.functions.Func1; import rx.observers.TestSubscriber; import rx.schedulers.Schedulers; public class OperatorRepeatTest { @Test(timeout = 2000) public void testRepetition() { int NUM = 10; final AtomicInteger count = new AtomicInteger(); int value = Observable.create(new OnSubscribe<Integer>() { @Override public void call(final Subscriber<? super Integer> o) { o.onNext(count.incrementAndGet()); o.onCompleted(); } }).repeat(Schedulers.computation()).take(NUM).toBlocking().last(); assertEquals(NUM, value); } @Test(timeout = 2000) public void testRepeatTake() { Observable<Integer> xs = Observable.just(1, 2); Object[] ys = xs.repeat(Schedulers.newThread()).take(4).toList().toBlocking().last().toArray(); assertArrayEquals(new Object[] { 1, 2, 1, 2 }, ys); } @Test(timeout = 20000) public void testNoStackOverFlow() { Observable.just(1).repeat(Schedulers.newThread()).take(100000).toBlocking().last(); } @Test public void testRepeatTakeWithSubscribeOn() throws InterruptedException { final AtomicInteger counter = new AtomicInteger(); Observable<Integer> oi = Observable.create(new OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> sub) { counter.incrementAndGet(); sub.onNext(1); sub.onNext(2); sub.onCompleted(); } }).subscribeOn(Schedulers.newThread()); Object[] ys = oi.repeat(Schedulers.newThread()).map(new Func1<Integer, Integer>() { @Override public Integer call(Integer t1) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } return t1; } }).take(4).toList().toBlocking().last().toArray(); assertEquals(2, counter.get()); assertArrayEquals(new Object[] { 1, 2, 1, 2 }, ys); } @Test(timeout = 2000) public void testRepeatAndTake() { @SuppressWarnings("unchecked") Observer<Object> o = mock(Observer.class); Observable.just(1).repeat().take(10).subscribe(o); verify(o, times(10)).onNext(1); verify(o).onCompleted(); verify(o, never()).onError(any(Throwable.class)); } @Test(timeout = 2000) public void testRepeatLimited() { @SuppressWarnings("unchecked") Observer<Object> o = mock(Observer.class); Observable.just(1).repeat(10).subscribe(o); verify(o, times(10)).onNext(1); verify(o).onCompleted(); verify(o, never()).onError(any(Throwable.class)); } @Test(timeout = 2000) public void testRepeatError() { @SuppressWarnings("unchecked") Observer<Object> o = mock(Observer.class); Observable.error(new TestException()).repeat(10).subscribe(o); verify(o).onError(any(TestException.class)); verify(o, never()).onNext(any()); verify(o, never()).onCompleted(); } @Test(timeout = 2000) public void testRepeatZero() { @SuppressWarnings("unchecked") Observer<Object> o = mock(Observer.class); Observable.just(1).repeat(0).subscribe(o); verify(o).onCompleted(); verify(o, never()).onNext(any()); verify(o, never()).onError(any(Throwable.class)); } @Test(timeout = 2000) public void testRepeatOne() { @SuppressWarnings("unchecked") Observer<Object> o = mock(Observer.class); Observable.just(1).repeat(1).subscribe(o); verify(o).onCompleted(); verify(o, times(1)).onNext(any()); verify(o, never()).onError(any(Throwable.class)); } /** Issue #2587. */ @Test public void testRepeatAndDistinctUnbounded() { Observable<Integer> src = Observable.from(Arrays.asList(1, 2, 3, 4, 5)) .take(3) .repeat(3) .distinct(); TestSubscriber<Integer> ts = new TestSubscriber<Integer>(); src.subscribe(ts); ts.assertNoErrors(); ts.assertTerminalEvent(); ts.assertReceivedOnNext(Arrays.asList(1, 2, 3)); } }