package com.github.davidmoten.rx.internal.operators;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import com.github.davidmoten.rx.Transformers;
import com.github.davidmoten.rx.exceptions.TooManySubscribersException;
import rx.Observable;
import rx.observers.TestSubscriber;
public class TransformerLimitSubscribersTest {
@Test
public void testOneSubscriber() {
List<Integer> list = Observable.just(1, 2, 3)
.compose(Transformers.<Integer> limitSubscribers(1)).toList().toBlocking().single();
assertEquals(Arrays.asList(1, 2, 3), list);
}
@Test
public void testMoreThanMaxSubscribers() {
TestSubscriber<Integer> ts = TestSubscriber.create();
Observable.just(1, 2, 3).compose(Transformers.<Integer> limitSubscribers(0)).subscribe(ts);
ts.assertNoValues();
ts.assertError(TooManySubscribersException.class);
}
@Test
public void testTwoSubscribersOk() {
TestSubscriber<Long> ts1 = TestSubscriber.create();
TestSubscriber<Long> ts2 = TestSubscriber.create();
Observable<Long> o = Observable.interval(100, TimeUnit.MILLISECONDS).take(3)
.compose(Transformers.<Long> limitSubscribers(2));
o.subscribe(ts1);
o.subscribe(ts2);
ts1.awaitTerminalEvent(3, TimeUnit.SECONDS);
ts1.assertCompleted();
ts2.awaitTerminalEvent(3, TimeUnit.SECONDS);
ts2.assertCompleted();
}
@Test
public void testThreeSubscribersNotOk() {
TestSubscriber<Long> ts1 = TestSubscriber.create();
TestSubscriber<Long> ts2 = TestSubscriber.create();
TestSubscriber<Long> ts3 = TestSubscriber.create();
Observable<Long> o = Observable.interval(100, TimeUnit.MILLISECONDS).take(3)
.compose(Transformers.<Long> limitSubscribers(2))
.onErrorResumeNext(Observable.<Long> empty());
o.subscribe(ts1);
o.subscribe(ts2);
o.subscribe(ts3);
ts1.awaitTerminalEvent(3, TimeUnit.SECONDS);
ts2.awaitTerminalEvent(3, TimeUnit.SECONDS);
ts3.awaitTerminalEvent(3, TimeUnit.SECONDS);
ts3.assertNoValues();
ts3.assertCompleted();
}
}