package com.kickstarter.libs.rx.transformers; import android.os.Looper; import com.kickstarter.KSRobolectricTestCase; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.robolectric.shadows.ShadowLooper; import java.util.concurrent.atomic.AtomicInteger; import rx.Observable; import rx.Scheduler; import rx.android.plugins.RxAndroidPlugins; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; public final class ObserveForUITransformerTest extends KSRobolectricTestCase { @Before public void setUp() { RxAndroidPlugins.getInstance().reset(); ShadowLooper.pauseMainLooper(); } @After public void tearDown() { RxAndroidPlugins.getInstance().reset(); ShadowLooper.unPauseMainLooper(); } @Test public void test() { final Scheduler scheduler = AndroidSchedulers.from(Looper.getMainLooper()); final AtomicInteger x = new AtomicInteger(); Observable.just(1) .observeOn(AndroidSchedulers.mainThread()) .subscribe(x::set); // Main looper is paused, so value should not change. assertEquals(0, x.get()); Observable.just(2) .observeOn(Schedulers.immediate()) .subscribe(x::set); // Since the work used the immediate scheduler, it is unaffected by the main looper being paused. assertEquals(2, x.get()); Observable.just(3) .compose(observeForUI()) .subscribe(x::set); // The main looper is paused but the code is executing on the main thread, so observeForUI() should schedule the // work immediately rather than queueing it up. assertEquals(3, x.get()); // Run the queued work. ShadowLooper.runUiThreadTasks(); // Code observed using `AndroidSchedulers.mainThread()` is now run. assertEquals(1, x.get()); } }