package com.jakewharton.rxbinding2.widget;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
import android.support.test.rule.UiThreadTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.widget.TextView;
import com.jakewharton.rxbinding2.test.R;
import com.jakewharton.rxbinding2.RecordingObserver;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.view.inputmethod.EditorInfo.IME_ACTION_GO;
import static android.view.inputmethod.EditorInfo.IME_ACTION_NEXT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
@RunWith(AndroidJUnit4.class)
public final class RxTextViewTest {
@Rule public final UiThreadTestRule uiThread = new UiThreadTestRule();
private final Context context = InstrumentationRegistry.getContext();
private final TextView view = new TextView(context);
@Test @UiThreadTest public void editorActions() {
RecordingObserver<Integer> o = new RecordingObserver<>();
RxTextView.editorActions(view).subscribe(o);
o.assertNoMoreEvents();
view.onEditorAction(IME_ACTION_GO);
assertEquals(IME_ACTION_GO, o.takeNext().intValue());
view.onEditorAction(IME_ACTION_NEXT);
assertEquals(IME_ACTION_NEXT, o.takeNext().intValue());
o.dispose();
view.onEditorAction(IME_ACTION_GO);
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void editorActionEvents() {
RecordingObserver<TextViewEditorActionEvent> o = new RecordingObserver<>();
RxTextView.editorActionEvents(view).subscribe(o);
o.assertNoMoreEvents();
view.onEditorAction(IME_ACTION_GO);
TextViewEditorActionEvent event1 = o.takeNext();
assertSame(view, event1.view());
assertEquals(IME_ACTION_GO, event1.actionId());
assertNull(event1.keyEvent());
view.onEditorAction(IME_ACTION_NEXT);
TextViewEditorActionEvent event2 = o.takeNext();
assertSame(view, event2.view());
assertEquals(IME_ACTION_NEXT, event2.actionId());
assertNull(event2.keyEvent()); // TODO figure out a user event?
o.dispose();
view.onEditorAction(IME_ACTION_GO);
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void textChanges() {
view.setText("Initial");
RecordingObserver<CharSequence> o = new RecordingObserver<>();
RxTextView.textChanges(view).subscribe(o);
assertEquals("Initial", o.takeNext().toString());
view.setText("H");
assertEquals("H", o.takeNext().toString());
view.setText("He");
assertEquals("He", o.takeNext().toString());
view.setText(null); // Internally coerced to empty string.
assertEquals("", o.takeNext().toString());
o.dispose();
view.setText("Silent");
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void textChangeEvents() {
view.setText("Initial");
RecordingObserver<TextViewTextChangeEvent> o = new RecordingObserver<>();
RxTextView.textChangeEvents(view).subscribe(o);
TextViewTextChangeEvent event0 = o.takeNext();
assertSame(view, event0.view());
assertEquals("Initial", event0.text().toString());
assertEquals(0, event0.start());
assertEquals(0, event0.before());
assertEquals(0, event0.count());
view.setText("H");
TextViewTextChangeEvent event1 = o.takeNext();
assertSame(view, event1.view());
assertEquals("H", event1.text().toString());
assertEquals(0, event1.start());
assertEquals(7, event1.before());
assertEquals(1, event1.count());
view.setText("He");
TextViewTextChangeEvent event2 = o.takeNext();
assertSame(view, event2.view());
assertEquals("He", event2.text().toString());
assertEquals(0, event2.start());
assertEquals(1, event2.before());
assertEquals(2, event2.count());
o.dispose();
view.setText("Silent");
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void beforeTextChangeEvents() {
view.setText("Initial");
RecordingObserver<TextViewBeforeTextChangeEvent> o = new RecordingObserver<>();
RxTextView.beforeTextChangeEvents(view).subscribe(o);
TextViewBeforeTextChangeEvent event0 = o.takeNext();
assertSame(view, event0.view());
assertEquals("Initial", event0.text().toString());
assertEquals(0, event0.start());
assertEquals(0, event0.count());
assertEquals(0, event0.after());
view.setText("H");
TextViewBeforeTextChangeEvent event1 = o.takeNext();
assertSame(view, event1.view());
assertEquals("Initial", event1.text().toString());
assertEquals(0, event1.start());
assertEquals(7, event1.count());
assertEquals(1, event1.after());
view.setText("He");
TextViewBeforeTextChangeEvent event2 = o.takeNext();
assertSame(view, event2.view());
assertEquals("H", event2.text().toString());
assertEquals(0, event2.start());
assertEquals(1, event2.count());
assertEquals(2, event2.after());
o.dispose();
view.setText("Silent");
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void afterTextChangeEvents() {
view.setText("Initial");
RecordingObserver<TextViewAfterTextChangeEvent> o = new RecordingObserver<>();
RxTextView.afterTextChangeEvents(view).subscribe(o);
TextViewAfterTextChangeEvent event0 = o.takeNext();
assertSame(view, event0.view());
assertEquals(null, event0.editable());
view.setText("H");
TextViewAfterTextChangeEvent event1 = o.takeNext();
assertSame(view, event1.view());
assertEquals("H", event1.editable().toString());
view.setText("He");
TextViewAfterTextChangeEvent event2 = o.takeNext();
assertSame(view, event2.view());
assertEquals("He", event2.editable().toString());
o.dispose();
view.setText("Silent");
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void text() throws Exception {
RxTextView.text(view).accept("Hey");
assertEquals("Hey", view.getText().toString());
}
@Test @UiThreadTest public void textRes() throws Exception {
RxTextView.textRes(view).accept(R.string.hey);
assertEquals("Hey", view.getText().toString());
}
@Test @UiThreadTest public void error() throws Exception {
RxTextView.error(view).accept("Ouch");
assertEquals("Ouch", view.getError().toString());
}
@Test @UiThreadTest public void errorRes() throws Exception {
RxTextView.errorRes(view).accept(R.string.ouch);
assertEquals("Ouch", view.getError().toString());
}
@Test @UiThreadTest public void hint() throws Exception {
RxTextView.hint(view).accept("Your name here");
assertEquals("Your name here", view.getHint().toString());
}
@Test @UiThreadTest public void hintRes() throws Exception {
RxTextView.hintRes(view).accept(R.string.hint);
assertEquals("Your name here", view.getHint().toString());
}
@Test @UiThreadTest public void color() throws Exception {
RxTextView.color(view).accept(0x3F51B5);
assertEquals(0x3F51B5, view.getCurrentTextColor());
}
}