package com.jakewharton.rxbinding2.widget; import android.app.Instrumentation; import android.support.test.InstrumentationRegistry; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import android.widget.ListView; import android.widget.Spinner; import com.jakewharton.rxbinding2.RecordingObserver; import com.jakewharton.rxbinding2.UnsafeRunnable; 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 org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; @RunWith(AndroidJUnit4.class) public final class RxAdapterViewTest { @Rule public final ActivityTestRule<RxAdapterViewTestActivity> activityRule = new ActivityTestRule<>(RxAdapterViewTestActivity.class); private Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); RxAdapterViewTestActivity activity; Spinner spinner; ListView listView; @Before public void setUp() { activity = activityRule.getActivity(); spinner = activity.spinner; listView = activity.listView; } @Test public void itemSelections() { RecordingObserver<Integer> o = new RecordingObserver<>(); RxAdapterView.itemSelections(spinner) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(o); assertEquals(0, o.takeNext().intValue()); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { spinner.setSelection(2); } }); assertEquals(2, o.takeNext().intValue()); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { spinner.setSelection(0); } }); assertEquals(0, o.takeNext().intValue()); o.dispose(); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { spinner.setSelection(1); } }); o.assertNoMoreEvents(); } @Test public void selectionEvents() { RecordingObserver<AdapterViewSelectionEvent> o = new RecordingObserver<>(); RxAdapterView.selectionEvents(spinner) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(o); AdapterViewItemSelectionEvent event1 = (AdapterViewItemSelectionEvent) o.takeNext(); assertSame(spinner, event1.view()); assertNotNull(event1.selectedView()); assertEquals(0, event1.position()); assertEquals(0, event1.id()); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { spinner.setSelection(2); } }); AdapterViewItemSelectionEvent event2 = (AdapterViewItemSelectionEvent) o.takeNext(); assertSame(spinner, event2.view()); assertNotNull(event2.selectedView()); assertEquals(2, event2.position()); assertEquals(2, event2.id()); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { activity.values.clear(); activity.adapter.notifyDataSetChanged(); } }); assertEquals(AdapterViewNothingSelectionEvent.create(spinner), o.takeNext()); o.dispose(); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { activity.values.add("Hello"); activity.adapter.notifyDataSetChanged(); } }); o.assertNoMoreEvents(); } @Test public void selection() { final Consumer<? super Integer> action = RxAdapterView.selection(spinner); instrumentation.runOnMainSync(new UnsafeRunnable() { @Override public void unsafeRun() throws Exception { action.accept(2); } }); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { assertEquals(2, spinner.getSelectedItemPosition()); } }); instrumentation.runOnMainSync(new UnsafeRunnable() { @Override public void unsafeRun() throws Exception { action.accept(1); } }); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { assertEquals(1, spinner.getSelectedItemPosition()); } }); } @Test public void itemClicks() { RecordingObserver<Integer> o = new RecordingObserver<>(); RxAdapterView.itemClicks(listView) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(o); o.assertNoMoreEvents(); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { listView.performItemClick(listView.getChildAt(2), 2, 2); } }); assertEquals(2, o.takeNext().intValue()); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { listView.performItemClick(listView.getChildAt(0), 0, 0); } }); assertEquals(0, o.takeNext().intValue()); o.dispose(); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { listView.performItemClick(listView.getChildAt(1), 1, 1); } }); o.assertNoMoreEvents(); } @Test public void itemClickEvents() { RecordingObserver<AdapterViewItemClickEvent> o = new RecordingObserver<>(); RxAdapterView.itemClickEvents(listView) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(o); o.assertNoMoreEvents(); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { listView.performItemClick(listView.getChildAt(2), 2, 2); } }); AdapterViewItemClickEvent event = o.takeNext(); assertEquals(listView, event.view()); assertNotNull(event.clickedView()); assertEquals(2, event.position()); assertEquals(2, event.id()); o.dispose(); instrumentation.runOnMainSync(new Runnable() { @Override public void run() { listView.performItemClick(listView.getChildAt(1), 1, 1); } }); o.assertNoMoreEvents(); } @Test public void itemLongClicks() { // TODO } @Test public void itemLongClickEvents() { // TODO } }