package com.jakewharton.rxbinding2.support.design.widget; import android.content.Context; import android.support.design.widget.TabLayout; 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.view.ContextThemeWrapper; import com.jakewharton.rxbinding2.RecordingObserver; import com.jakewharton.rxbinding2.support.design.R; 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.assertSame; import static org.junit.Assert.fail; @RunWith(AndroidJUnit4.class) public final class RxTabLayoutTest { @Rule public final UiThreadTestRule uiThreadTestRule = new UiThreadTestRule(); private final Context rawContext = InstrumentationRegistry.getContext(); private final Context context = new ContextThemeWrapper(rawContext, R.style.Theme_AppCompat); private final TabLayout view = new TabLayout(context); private final TabLayout.Tab tab1 = view.newTab(); private final TabLayout.Tab tab2 = view.newTab(); @Before public void setUp() { view.addTab(tab1); view.addTab(tab2); } @Test @UiThreadTest public void selectionEvents() { RecordingObserver<TabLayoutSelectionEvent> o = new RecordingObserver<>(); RxTabLayout.selectionEvents(view).subscribe(o); assertEquals(TabLayoutSelectionSelectedEvent.create(view, tab1), o.takeNext()); tab2.select(); assertEquals(TabLayoutSelectionUnselectedEvent.create(view, tab1), o.takeNext()); assertEquals(TabLayoutSelectionSelectedEvent.create(view, tab2), o.takeNext()); tab2.select(); // Reselection assertEquals(TabLayoutSelectionReselectedEvent.create(view, tab2), o.takeNext()); tab1.select(); assertEquals(TabLayoutSelectionUnselectedEvent.create(view, tab2), o.takeNext()); assertEquals(TabLayoutSelectionSelectedEvent.create(view, tab1), o.takeNext()); o.dispose(); tab2.select(); o.assertNoMoreEvents(); } @Test @UiThreadTest public void selectionEventsNoInitial() { TabLayout empty = new TabLayout(context); RecordingObserver<TabLayoutSelectionEvent> o = new RecordingObserver<>(); RxTabLayout.selectionEvents(empty).subscribe(o); o.assertNoMoreEvents(); } @Test @UiThreadTest public void selections() { RecordingObserver<TabLayout.Tab> o = new RecordingObserver<>(); RxTabLayout.selections(view).subscribe(o); assertSame(tab1, o.takeNext()); tab2.select(); assertSame(tab2, o.takeNext()); tab2.select(); // Reselection o.assertNoMoreEvents(); tab1.select(); assertSame(tab1, o.takeNext()); o.dispose(); tab2.select(); o.assertNoMoreEvents(); } @Test @UiThreadTest public void selectionsNoInitial() { TabLayout empty = new TabLayout(context); RecordingObserver<TabLayout.Tab> o = new RecordingObserver<>(); RxTabLayout.selections(empty).subscribe(o); o.assertNoMoreEvents(); } @Test @UiThreadTest public void select() throws Exception { Consumer<? super Integer> action = RxTabLayout.select(view); assertEquals(0, view.getSelectedTabPosition()); action.accept(1); assertEquals(1, view.getSelectedTabPosition()); action.accept(0); assertEquals(0, view.getSelectedTabPosition()); } @Test @UiThreadTest public void selectInvalidValueThrows() throws Exception { Consumer<? super Integer> action = RxTabLayout.select(view); try { action.accept(2); fail(); } catch (IllegalArgumentException e) { assertEquals("No tab for index 2", e.getMessage()); } try { action.accept(-1); fail(); } catch (IllegalArgumentException e) { assertEquals("No tab for index -1", e.getMessage()); } } }