package com.github.davidmoten.rx.testing; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.concurrent.TimeUnit; import org.junit.Assert; import rx.Observable; import rx.Producer; import rx.Subscriber; import rx.functions.Action0; import rx.functions.Func1; import rx.observers.TestSubscriber; public class TestSubscriber2<T> extends Subscriber<T> { private final TestSubscriber<T> ts; private TestSubscriber2(TestSubscriber<T> ts) { this.ts = ts; } public static <T> TestSubscriber2<T> createWithRequest(long initialRequest) { TestSubscriber<T> t1 = new TestSubscriber<T>(initialRequest); TestSubscriber2<T> t2 = new TestSubscriber2<T>(t1); t2.add(t1); return t2; } static <T> Func1<Observable<T>, TestSubscriber2<T>> test() { return testWithRequest(Long.MAX_VALUE); } static <T> Func1<Observable<T>, TestSubscriber2<T>> testWithRequest(final long initialRequest) { return new Func1<Observable<T>, TestSubscriber2<T>>() { @Override public TestSubscriber2<T> call(Observable<T> o) { TestSubscriber2<T> ts2 = createWithRequest(initialRequest); o.subscribe(ts2.ts); return ts2; } }; } public void onStart() { ts.onStart(); } public void onCompleted() { ts.onCompleted(); } public void setProducer(Producer p) { ts.setProducer(p); } public final int getCompletions() { return ts.getCompletions(); } public void onError(Throwable e) { ts.onError(e); } public List<Throwable> getOnErrorEvents() { return ts.getOnErrorEvents(); } public void onNext(T t) { ts.onNext(t); } public String toString() { return ts.toString(); } public final int getValueCount() { return ts.getValueCount(); } public TestSubscriber2<T> requestMore(long n) { ts.requestMore(n); return this; } public List<T> getOnNextEvents() { return ts.getOnNextEvents(); } public TestSubscriber2<T> assertReceivedOnNext(List<T> items) { ts.assertReceivedOnNext(items); return this; } public final boolean awaitValueCount(int expected, long timeout, TimeUnit unit) { return ts.awaitValueCount(expected, timeout, unit); } public TestSubscriber2<T> assertTerminalEvent() { ts.assertTerminalEvent(); return this; } public TestSubscriber2<T> assertUnsubscribed() { ts.assertUnsubscribed(); return this; } public TestSubscriber2<T> assertNoErrors() { ts.assertNoErrors(); return this; } public TestSubscriber2<T> awaitTerminalEvent() { ts.awaitTerminalEvent(); return this; } public TestSubscriber2<T> awaitTerminalEvent(long timeout, TimeUnit unit) { ts.awaitTerminalEvent(timeout, unit); return this; } public TestSubscriber2<T> awaitTerminalEventAndUnsubscribeOnTimeout(long timeout, TimeUnit unit) { ts.awaitTerminalEventAndUnsubscribeOnTimeout(timeout, unit); return this; } public Thread getLastSeenThread() { return ts.getLastSeenThread(); } public TestSubscriber2<T> assertCompleted() { ts.assertCompleted(); return this; } public TestSubscriber2<T> assertNotCompleted() { ts.assertNotCompleted(); return this; } public TestSubscriber2<T> assertError(Class<? extends Throwable> clazz) { ts.assertError(clazz); return this; } public TestSubscriber2<T> assertError(Throwable throwable) { ts.assertError(throwable); return this; } public TestSubscriber2<T> assertNoTerminalEvent() { ts.assertNoTerminalEvent(); return this; } public TestSubscriber2<T> assertNoValues() { ts.assertNoValues(); return this; } public TestSubscriber2<T> assertValueCount(int count) { ts.assertValueCount(count); return this; } public TestSubscriber2<T> assertValues(T... values) { ts.assertValues(values); return this; } public TestSubscriber2<T> assertValue(T value) { ts.assertValue(value); return this; } public final TestSubscriber2<T> assertValuesAndClear(T expectedFirstValue, T... expectedRestValues) { ts.assertValuesAndClear(expectedFirstValue, expectedRestValues); return this; } public final TestSubscriber2<T> perform(Action0 action) { action.call(); return this; } public TestSubscriber2<T> assertValuesSet(T... values) { Assert.assertEquals(new HashSet<T>(Arrays.asList(values)), new HashSet<T>(ts.getOnNextEvents())); return this; } }