package com.jakewharton.rxbinding2.widget; import android.app.Instrumentation; import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import android.widget.RatingBar; import com.jakewharton.rxbinding2.RecordingObserver; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Consumer; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_UP; import static com.jakewharton.rxbinding.MotionEventUtil.motionEventAtPosition; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public final class RxRatingBarTest { @Rule public final ActivityTestRule<RxRatingBarTestActivity> activityRule = new ActivityTestRule<>(RxRatingBarTestActivity.class); private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); RatingBar view; @Before public void setUp() { view = activityRule.getActivity().ratingBar; } @Test public void ratingChanges() { RecordingObserver<Float> o = new RecordingObserver<>(); RxRatingBar.ratingChanges(view) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(o); assertEquals(0f, o.takeNext(), 0f); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { view.setRating(1f); } }); assertEquals(1f, o.takeNext(), 0f); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { view.setRating(2f); } }); assertEquals(2f, o.takeNext(), 0f); o.dispose(); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { view.setRating(1f); } }); o.assertNoMoreEvents(); } @Test public void ratingChangeEvents() { RecordingObserver<RatingBarChangeEvent> o = new RecordingObserver<>(); RxRatingBar.ratingChangeEvents(view) // .subscribeOn(AndroidSchedulers.mainThread()) // .subscribe(o); assertEquals(RatingBarChangeEvent.create(view, 0f, false), o.takeNext()); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { view.setRating(5f); } }); assertEquals(RatingBarChangeEvent.create(view, 5f, false), o.takeNext()); instrumentation.sendPointerSync(motionEventAtPosition(view, ACTION_DOWN, 0, 50)); instrumentation.sendPointerSync(motionEventAtPosition(view, ACTION_UP, 0, 50)); instrumentation.waitForIdleSync(); assertEquals(RatingBarChangeEvent.create(view, 1f, true), o.takeNext()); o.dispose(); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { view.setRating(1f); } }); o.assertNoMoreEvents(); } @Test @UiThreadTest public void rating() throws Exception { Consumer<? super Float> action = RxRatingBar.rating(view); assertEquals(0f, view.getRating(), 0f); action.accept(1f); assertEquals(1f, view.getRating(), 0f); action.accept(2f); assertEquals(2f, view.getRating(), 0f); } @Test @UiThreadTest public void isIndicator() throws Exception { Consumer<? super Boolean> action = RxRatingBar.isIndicator(view); assertFalse(view.isIndicator()); action.accept(true); assertTrue(view.isIndicator()); action.accept(false); assertFalse(view.isIndicator()); } }