package com.badoo.unittest.rx; import org.junit.After; import org.junit.Before; import rx.Observable; import rx.observers.TestSubscriber; import rx.plugins.RxTestSchedulerProxy; /** * Base unit test to track the schedulers calls are made upon. */ public class BaseRxTestCase { private static final String ASSERT_TEXT = "Result not returned on %s scheduler [%s]"; private SchedulerFactory mSchedulerFactory = new ImmediateSchedulerFactory(); @Before public void beforeTest() { setModeDefault(); } @After public void afterTest() { RxTestSchedulerProxy.getInstance().reset(); } public ImmediateSchedulerFactory setModeDefault() { mSchedulerFactory = new ImmediateSchedulerFactory(); RxTestSchedulerProxy.getInstance().setSchedulerFactory(mSchedulerFactory); return (ImmediateSchedulerFactory) mSchedulerFactory; } public TrackingSchedulerFactory setModeTracking() { throw new UnsupportedOperationException("Tracking mode is not current available"); //RxTestSchedulerProxy.getInstance().setSchedulerFactory(mSchedulerFactory); } public TestSchedulerFactory setModeTest() { mSchedulerFactory = new TestSchedulerFactory(); RxTestSchedulerProxy.getInstance().setSchedulerFactory(mSchedulerFactory); return (TestSchedulerFactory) mSchedulerFactory; } protected <T extends SchedulerFactory> T getSchedulerFactory(Class<T> type) { if (!type.isAssignableFrom(mSchedulerFactory.getClass())) { throw new IllegalArgumentException("Unexpected type, current scheduler factory is of type " + mSchedulerFactory.getClass().getName()); } //noinspection unchecked return (T) mSchedulerFactory; } protected <T> TestSubscriber<T> executeTarget(Observable<T> result) { final TestSubscriber<T> testSubscriber = new TestSubscriber<>(); result.doOnError(Throwable::printStackTrace) .subscribe(testSubscriber); testSubscriber.awaitTerminalEvent(); return testSubscriber; } }