package com.badoo.unittest.rx; import android.support.annotation.Nullable; import java.util.concurrent.TimeUnit; import rx.Scheduler; import rx.schedulers.TestScheduler; public class TestSchedulerFactory implements SchedulerFactory { @Nullable private TestScheduler mIOScheduler; @Nullable private TestScheduler mComputationScheduler; @Nullable private TestScheduler mNewThreadScheduler; @Nullable private TestScheduler mMainThreadScheduler; @Override public Scheduler createIOScheduler() { mIOScheduler = new TestScheduler(); return mIOScheduler; } @Override public Scheduler createComputationScheduler() { mComputationScheduler = new TestScheduler(); return mComputationScheduler; } @Override public Scheduler createNewThreadScheduler() { mNewThreadScheduler = new TestScheduler(); return mNewThreadScheduler; } @Override public Scheduler createMainThreadScheduler() { mMainThreadScheduler = new TestScheduler(); return mMainThreadScheduler; } @Nullable public TestScheduler getIOScheduler() { return mIOScheduler; } @Nullable public TestScheduler getComputationScheduler() { return mComputationScheduler; } @Nullable public TestScheduler getNewThreadScheduler() { return mNewThreadScheduler; } @Nullable public TestScheduler getMainThreadScheduler() { return mMainThreadScheduler; } public void advanceTimeBy(long delayTime, TimeUnit unit) { if (mIOScheduler != null) mIOScheduler.advanceTimeBy(delayTime, unit); if (mComputationScheduler != null) mComputationScheduler.advanceTimeBy(delayTime, unit); if (mNewThreadScheduler != null) mNewThreadScheduler.advanceTimeBy(delayTime, unit); if (mMainThreadScheduler != null) mMainThreadScheduler.advanceTimeBy(delayTime, unit); } public void advanceTimeTo(long delayTime, TimeUnit unit) { if (mIOScheduler != null) mIOScheduler.advanceTimeTo(delayTime, unit); if (mComputationScheduler != null) mComputationScheduler.advanceTimeTo(delayTime, unit); if (mNewThreadScheduler != null) mNewThreadScheduler.advanceTimeTo(delayTime, unit); if (mMainThreadScheduler != null) mMainThreadScheduler.advanceTimeTo(delayTime, unit); } public void triggerActions() { if (mIOScheduler != null) mIOScheduler.triggerActions(); if (mComputationScheduler != null) mComputationScheduler.triggerActions(); if (mNewThreadScheduler != null) mNewThreadScheduler.triggerActions(); if (mMainThreadScheduler != null) mMainThreadScheduler.triggerActions(); } /** * Advance all schedulers by 1ms */ public void tick() { advanceTimeBy(1, TimeUnit.MILLISECONDS); } }