package com.jakewharton.rxbinding2.widget;
import android.annotation.TargetApi;
import android.app.Instrumentation;
import android.os.Build;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.SdkSuppress;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import com.jakewharton.rxbinding2.test.R;
import com.jakewharton.rxbinding2.RecordingObserver;
import io.reactivex.android.schedulers.AndroidSchedulers;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.support.test.espresso.Espresso.onData;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.clearText;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.matcher.RootMatchers.withDecorView;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.startsWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@RunWith(AndroidJUnit4.class)
public final class RxAutoCompleteTextViewTest {
@Rule public final ActivityTestRule<RxAutoCompleteTextViewTestActivity> activityRule =
new ActivityTestRule<>(RxAutoCompleteTextViewTestActivity.class);
private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
private RxAutoCompleteTextViewTestActivity activity;
AutoCompleteTextView autoCompleteTextView;
@Before public void setUp() {
activity = activityRule.getActivity();
autoCompleteTextView = activity.autoCompleteTextView;
}
@Test public void itemClickEvents() {
instrumentation.runOnMainSync(new Runnable() {
@Override public void run() {
autoCompleteTextView.setThreshold(1);
List<String> values = Arrays.asList("Two", "Three", "Twenty");
ArrayAdapter<String> adapter = new ArrayAdapter<>(autoCompleteTextView.getContext(),
android.R.layout.simple_list_item_1, values);
autoCompleteTextView.setAdapter(adapter);
}
});
RecordingObserver<AdapterViewItemClickEvent> o = new RecordingObserver<>();
RxAutoCompleteTextView.itemClickEvents(autoCompleteTextView)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
o.assertNoMoreEvents();
onView(withId(R.id.auto_complete)).perform(typeText("Tw"));
onData(startsWith("Twenty"))
.inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))))
.perform(click());
AdapterViewItemClickEvent event = o.takeNext();
assertNotNull(event.view());
assertNotNull(event.clickedView());
assertEquals(1, event.position()); // Second item in two-item filtered list.
assertEquals(1, event.id()); // Second item in two-item filtered list.
o.dispose();
onView(withId(R.id.auto_complete)).perform(clearText(), typeText("Tw"));
onData(startsWith("Twenty"))
.inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))))
.perform(click());
o.assertNoMoreEvents();
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.JELLY_BEAN)
@Test @UiThreadTest public void completionHint() throws Exception {
RxAutoCompleteTextView.completionHint(autoCompleteTextView).accept("Test hint");
assertEquals("Test hint", autoCompleteTextView.getCompletionHint());
}
@Test @UiThreadTest public void threshold() throws Exception {
RxAutoCompleteTextView.threshold(autoCompleteTextView).accept(10);
assertEquals(10, autoCompleteTextView.getThreshold());
}
}