1394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov/* 2394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Copyright (C) 2015 The Android Open Source Project 3394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * 4394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * you may not use this file except in compliance with the License. 6394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * You may obtain a copy of the License at 7394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * 8394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * http://www.apache.org/licenses/LICENSE-2.0 9394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * 10394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * Unless required by applicable law or agreed to in writing, software 11394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS, 12394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * See the License for the specific language governing permissions and 14394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov * limitations under the License. 15394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov */ 16394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovpackage android.support.design.widget; 17394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 18754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.design.testutils.TabLayoutActions.setupWithViewPager; 19754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.design.testutils.ViewPagerActions.setAdapter; 20754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.Espresso.onView; 21754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.assertion.ViewAssertions.matches; 22754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; 23754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; 24754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed; 25754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA; 26754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.matcher.ViewMatchers.withId; 27754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.matcher.ViewMatchers.withParent; 28754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static android.support.test.espresso.matcher.ViewMatchers.withText; 29754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas 30754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.hamcrest.Matchers.allOf; 31754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.hamcrest.Matchers.not; 32754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.assertEquals; 33754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.assertNotEquals; 34754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas 353f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikovimport android.content.res.Resources; 36394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.graphics.Color; 373f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikovimport android.support.annotation.DimenRes; 383f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikovimport android.support.annotation.LayoutRes; 39c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikovimport android.support.design.test.R; 40394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.support.design.testutils.TabLayoutActions; 41c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikovimport android.support.design.testutils.TestUtilsActions; 42c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikovimport android.support.design.testutils.TestUtilsMatchers; 43394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.support.design.testutils.ViewPagerActions; 44005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikovimport android.support.test.espresso.UiController; 45005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikovimport android.support.test.espresso.ViewAction; 464bb57b2c7c5e8fa607119bd5089535d5862cb979Aurimas Liutikasimport android.support.test.filters.LargeTest; 47754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest; 48394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.support.v4.view.PagerAdapter; 49394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.support.v4.view.ViewPager; 50394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.util.Pair; 51394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.view.View; 52394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.view.ViewGroup; 53c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikovimport android.widget.HorizontalScrollView; 54394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport android.widget.TextView; 55754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas 56c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikovimport org.hamcrest.Matcher; 57ee3e8053ef6b55e31fa0be004061318ec394eb64Kirill Grouchnikovimport org.junit.Before; 58394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport org.junit.Test; 59394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 60394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovimport java.util.ArrayList; 61394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 62394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikovpublic class TabLayoutWithViewPagerTest 63394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov extends BaseInstrumentationTestCase<TabLayoutWithViewPagerActivity> { 64394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov private TabLayout mTabLayout; 65394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 66394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov private ViewPager mViewPager; 67394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 68e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov private ColorPagerAdapter mDefaultPagerAdapter; 69e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 70394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov protected static class BasePagerAdapter<Q> extends PagerAdapter { 71394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov protected ArrayList<Pair<String, Q>> mEntries = new ArrayList<>(); 72394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 73394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void add(String title, Q content) { 74abc73958d264e1eed7fd401a18be1d9ede8304ebAurimas Liutikas mEntries.add(new Pair<>(title, content)); 75394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 76394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 77394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 78394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public int getCount() { 79394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return mEntries.size(); 80394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 81394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 82394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov protected void configureInstantiatedItem(View view, int position) { 83394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov switch (position) { 84394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 0: 85394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_0); 86394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 87394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 1: 88394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_1); 89394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 90394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 2: 91394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_2); 92394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 93394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 3: 94394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_3); 95394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 96394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 4: 97394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_4); 98394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 99394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 5: 100394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_5); 101394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 102394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 6: 103394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_6); 104394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 105394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 7: 106394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_7); 107394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 108394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 8: 109394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_8); 110394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 111394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov case 9: 112394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setId(R.id.page_9); 113394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov break; 114394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 115394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 116394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 117394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 118394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void destroyItem(ViewGroup container, int position, Object object) { 119394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov // The adapter is also responsible for removing the view. 120394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov container.removeView(((ViewHolder) object).view); 121394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 122394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 123394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 124394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public int getItemPosition(Object object) { 125394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return ((ViewHolder) object).position; 126394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 127394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 128394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 129394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public boolean isViewFromObject(View view, Object object) { 130394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return ((ViewHolder) object).view == view; 131394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 132394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 133394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 134394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public CharSequence getPageTitle(int position) { 135394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return mEntries.get(position).first; 136394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 137394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 138394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov protected static class ViewHolder { 139394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov final View view; 140394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov final int position; 141394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 142394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public ViewHolder(View view, int position) { 143394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov this.view = view; 144394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov this.position = position; 145394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 146394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 147394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 148394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 149394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov protected static class ColorPagerAdapter extends BasePagerAdapter<Integer> { 150394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 151394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public Object instantiateItem(ViewGroup container, int position) { 152394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov final View view = new View(container.getContext()); 153394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setBackgroundColor(mEntries.get(position).second); 154394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov configureInstantiatedItem(view, position); 155394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 156394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov // Unlike ListView adapters, the ViewPager adapter is responsible 157394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov // for adding the view to the container. 158394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov container.addView(view); 159394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 160394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return new ViewHolder(view, position); 161394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 162394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 163394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 164394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov protected static class TextPagerAdapter extends BasePagerAdapter<String> { 165394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Override 166394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public Object instantiateItem(ViewGroup container, int position) { 167394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov final TextView view = new TextView(container.getContext()); 168394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov view.setText(mEntries.get(position).second); 169394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov configureInstantiatedItem(view, position); 170394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 171394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov // Unlike ListView adapters, the ViewPager adapter is responsible 172394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov // for adding the view to the container. 173394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov container.addView(view); 174394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 175394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov return new ViewHolder(view, position); 176394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 177394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 178394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 179005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov private static <Q> ViewAction addItemToPager(final String title, final Q content) { 180005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov return new ViewAction() { 181005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov @Override 182005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov public Matcher<View> getConstraints() { 183005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov return isAssignableFrom(ViewPager.class); 184005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov } 185005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 186005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov @Override 187005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov public String getDescription() { 188005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov return "Add item and notify on content change"; 189005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov } 190005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 191005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov @Override 192005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov public void perform(UiController uiController, View view) { 193005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 194005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 195005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov final ViewPager viewPager = (ViewPager) view; 196005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov final BasePagerAdapter<Q> viewPagerAdapter = 197005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov (BasePagerAdapter<Q>) viewPager.getAdapter(); 198005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov viewPagerAdapter.add(title, content); 199005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov viewPagerAdapter.notifyDataSetChanged(); 200005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 201005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 202005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov } 203005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov }; 204005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov } 205005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 206005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov private static <Q> ViewAction addItemsToPager(final String[] title, final Q[] content) { 207005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov return new ViewAction() { 208005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov @Override 209005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov public Matcher<View> getConstraints() { 210005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov return isAssignableFrom(ViewPager.class); 211005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov } 212005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 213005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov @Override 214005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov public String getDescription() { 215005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov return "Add items and notify on content change"; 216005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov } 217005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 218005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov @Override 219005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov public void perform(UiController uiController, View view) { 220005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 221005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 222005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov final ViewPager viewPager = (ViewPager) view; 223005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov final BasePagerAdapter<Q> viewPagerAdapter = 224005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov (BasePagerAdapter<Q>) viewPager.getAdapter(); 225005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov int itemCount = title.length; 226005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov for (int i = 0; i < itemCount; i++) { 227005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov viewPagerAdapter.add(title[i], content[i]); 228005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov } 229005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov viewPagerAdapter.notifyDataSetChanged(); 230005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 231005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov uiController.loopMainThreadUntilIdle(); 232005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov } 233005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov }; 234005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov } 235005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov 236394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public TabLayoutWithViewPagerTest() { 237394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov super(TabLayoutWithViewPagerActivity.class); 238394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 239394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 240ee3e8053ef6b55e31fa0be004061318ec394eb64Kirill Grouchnikov @Before 241394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void setUp() throws Exception { 242ee3e8053ef6b55e31fa0be004061318ec394eb64Kirill Grouchnikov final TabLayoutWithViewPagerActivity activity = mActivityTestRule.getActivity(); 243394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov mTabLayout = (TabLayout) activity.findViewById(R.id.tabs); 244394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov mViewPager = (ViewPager) activity.findViewById(R.id.tabs_viewpager); 245394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 246e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mDefaultPagerAdapter = new ColorPagerAdapter(); 247e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mDefaultPagerAdapter.add("Red", Color.RED); 248e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mDefaultPagerAdapter.add("Green", Color.GREEN); 249e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mDefaultPagerAdapter.add("Blue", Color.BLUE); 250394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 251394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov // Configure view pager 252e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov onView(withId(R.id.tabs_viewpager)).perform( 25353a4343a126baa3d232a5f46804091af3ea73082Chris Banes setAdapter(mDefaultPagerAdapter), 254394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov ViewPagerActions.scrollToPage(0)); 255617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes } 256394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 257617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes private void setupTabLayoutWithViewPager() { 258394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov // And wire the tab layout to it 2593cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager)); 260394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 261394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 262e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov /** 263e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov * Verifies that selecting pages in <code>ViewPager</code> also updates the tab selection 264e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov * in the wired <code>TabLayout</code> 265e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov */ 266e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov private void verifyViewPagerSelection() { 267e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov int itemCount = mViewPager.getAdapter().getCount(); 268e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 269e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollToPage(0)); 270e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Selected page", 0, mViewPager.getCurrentItem()); 271e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Selected tab", 0, mTabLayout.getSelectedTabPosition()); 272e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 273e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Scroll tabs to the right 274e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov for (int i = 0; i < (itemCount - 1); i++) { 275e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Scroll one tab to the right 276e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollRight()); 277e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov final int expectedCurrentTabIndex = i + 1; 278e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Scroll right #" + i, expectedCurrentTabIndex, 279e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mViewPager.getCurrentItem()); 280e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Selected tab after scrolling right #" + i, expectedCurrentTabIndex, 281e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mTabLayout.getSelectedTabPosition()); 282e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 283e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 284e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Scroll tabs to the left 285e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov for (int i = 0; i < (itemCount - 1); i++) { 286e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Scroll one tab to the left 287e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollLeft()); 288e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov final int expectedCurrentTabIndex = itemCount - i - 2; 289e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Scroll left #" + i, expectedCurrentTabIndex, mViewPager.getCurrentItem()); 290e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Selected tab after scrolling left #" + i, expectedCurrentTabIndex, 291e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mTabLayout.getSelectedTabPosition()); 292e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 293e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 294e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 295e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov /** 296e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov * Verifies that selecting pages in <code>ViewPager</code> also updates the tab selection 297e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov * in the wired <code>TabLayout</code> 298e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov */ 299e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov private void verifyTabLayoutSelection() { 300e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov int itemCount = mTabLayout.getTabCount(); 301e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 302e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollToPage(0)); 303e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Selected tab", 0, mTabLayout.getSelectedTabPosition()); 304e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Selected page", 0, mViewPager.getCurrentItem()); 305e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 306e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Select tabs "going" to the right. Note that the first loop iteration tests the 307e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // scenario of "selecting" the first tab when it's already selected. 308e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov for (int i = 0; i < itemCount; i++) { 309e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov onView(withId(R.id.tabs)).perform(TabLayoutActions.selectTab(i)); 310e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Selected tab after selecting #" + i, i, 311e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mTabLayout.getSelectedTabPosition()); 312e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Select tab #" + i, i, mViewPager.getCurrentItem()); 313e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 314e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 315e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Select tabs "going" to the left. Note that the first loop iteration tests the 316e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // scenario of "selecting" the last tab when it's already selected. 317e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov for (int i = itemCount - 1; i >= 0; i--) { 318e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov onView(withId(R.id.tabs)).perform(TabLayoutActions.selectTab(i)); 319e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Scroll left #" + i, i, mViewPager.getCurrentItem()); 320e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Selected tab after scrolling left #" + i, i, 321e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mTabLayout.getSelectedTabPosition()); 322e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 323e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 324e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 325394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @Test 326394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov @SmallTest 327394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov public void testBasics() { 328617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes setupTabLayoutWithViewPager(); 329617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes 330394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov final int itemCount = mViewPager.getAdapter().getCount(); 331394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 332394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov assertEquals("Matching item count", itemCount, mTabLayout.getTabCount()); 333394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 334394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov for (int i = 0; i < itemCount; i++) { 335394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov assertEquals("Tab #" +i, mViewPager.getAdapter().getPageTitle(i), 336394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov mTabLayout.getTabAt(i).getText()); 337394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 338394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 339394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov assertEquals("Selected tab", mViewPager.getCurrentItem(), 340394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov mTabLayout.getSelectedTabPosition()); 341394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov 342e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov verifyViewPagerSelection(); 343e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 344e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 345e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov @Test 346e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov @SmallTest 347e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov public void testInteraction() { 348617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes setupTabLayoutWithViewPager(); 349617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes 350e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Default selected page", 0, mViewPager.getCurrentItem()); 351e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Default selected tab", 0, mTabLayout.getSelectedTabPosition()); 352e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 353e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov verifyTabLayoutSelection(); 354e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 355e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 356e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov @Test 357e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov @SmallTest 358e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov public void testAdapterContentChange() { 359617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes setupTabLayoutWithViewPager(); 360617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes 361e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Verify that we have the expected initial adapter 362e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov PagerAdapter initialAdapter = mViewPager.getAdapter(); 363e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Initial adapter class", ColorPagerAdapter.class, initialAdapter.getClass()); 364e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Initial adapter page count", 3, initialAdapter.getCount()); 365e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 366e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Add two more entries to our adapter 367005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov onView(withId(R.id.tabs_viewpager)).perform( 368005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov addItemsToPager(new String[] { "Yellow", "Magenta"}, 369005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov new Integer[] { Color.YELLOW, Color.MAGENTA })); 370e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 371e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // We have more comprehensive test coverage for changing the ViewPager adapter in v4/tests. 372e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Here we are focused on testing the continuous integration of TabLayout with the new 373e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // content of ViewPager 374e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 375005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov final int newItemCount = mDefaultPagerAdapter.getCount(); 376e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Matching item count", newItemCount, mTabLayout.getTabCount()); 377e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 378e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov for (int i = 0; i < newItemCount; i++) { 379e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Tab #" +i, mViewPager.getAdapter().getPageTitle(i), 380e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mTabLayout.getTabAt(i).getText()); 381e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 382e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 383e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov verifyViewPagerSelection(); 384e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov verifyTabLayoutSelection(); 385e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 386e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 387e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov @Test 388e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov @SmallTest 3893cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes public void testAdapterContentChangeWithAutoRefreshDisabled() { 3903cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager, false)); 3913cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 3923cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes // Verify that we have the expected initial adapter 3933cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes PagerAdapter initialAdapter = mViewPager.getAdapter(); 3943cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes assertEquals("Initial adapter class", ColorPagerAdapter.class, initialAdapter.getClass()); 3953cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes assertEquals("Initial adapter page count", 3, initialAdapter.getCount()); 3963cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 397005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov // Add two entries to our adapter 398005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov onView(withId(R.id.tabs_viewpager)).perform( 399005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov addItemsToPager(new String[] { "Yellow", "Magenta"}, 400005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov new Integer[] { Color.YELLOW, Color.MAGENTA })); 4013cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 4023cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes // Assert that the TabLayout did not update and add the new items 403005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov final int newItemCount = mDefaultPagerAdapter.getCount(); 4043cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes assertNotEquals("Matching item count", newItemCount, mTabLayout.getTabCount()); 4053cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes } 4063cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 4073cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes @Test 4083cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes @SmallTest 4093cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes public void testBasicAutoRefreshDisabled() { 4103cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager, false)); 4113cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 4123cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes // Check that the TabLayout has the same number of items are the adapter 4133cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes PagerAdapter initialAdapter = mViewPager.getAdapter(); 4143cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes assertEquals("Initial adapter page count", initialAdapter.getCount(), 4153cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes mTabLayout.getTabCount()); 4163cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 4173cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes // Add two more entries to our adapter 4183cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes mDefaultPagerAdapter.add("Yellow", Color.YELLOW); 4193cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes mDefaultPagerAdapter.add("Magenta", Color.MAGENTA); 4203cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes final int newItemCount = mDefaultPagerAdapter.getCount(); 4213cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 4223cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes // Assert that the TabLayout did not update and add the new items 4233cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes assertNotEquals("Matching item count", newItemCount, mTabLayout.getTabCount()); 4243cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 4253cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes // Now setup again to update the tabs 4263cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager, false)); 4273cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 4283cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes // Assert that the TabLayout updated and added the new items 4293cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes assertEquals("Matching item count", newItemCount, mTabLayout.getTabCount()); 4303cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes } 4313cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes 4323cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes @Test 4333cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes @SmallTest 434e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov public void testAdapterChange() { 435617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes setupTabLayoutWithViewPager(); 436617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes 437e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Verify that we have the expected initial adapter 438e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov PagerAdapter initialAdapter = mViewPager.getAdapter(); 439e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Initial adapter class", ColorPagerAdapter.class, initialAdapter.getClass()); 440e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Initial adapter page count", 3, initialAdapter.getCount()); 441e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 442e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Create a new adapter 443e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov TextPagerAdapter newAdapter = new TextPagerAdapter(); 444e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov final int newItemCount = 6; 445e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov for (int i = 0; i < newItemCount; i++) { 446e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov newAdapter.add("Title " + i, "Body " + i); 447e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 448e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // And set it on the ViewPager 44953a4343a126baa3d232a5f46804091af3ea73082Chris Banes onView(withId(R.id.tabs_viewpager)).perform(setAdapter(newAdapter), 450e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov ViewPagerActions.scrollToPage(0)); 451e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 452e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // As TabLayout doesn't track adapter changes, we need to re-wire the new adapter 4533cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager)); 454e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 455e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // We have more comprehensive test coverage for changing the ViewPager adapter in v4/tests. 456e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // Here we are focused on testing the integration of TabLayout with the new 457e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov // content of ViewPager 458e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 459e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Matching item count", newItemCount, mTabLayout.getTabCount()); 460e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 461e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov for (int i = 0; i < newItemCount; i++) { 462e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov assertEquals("Tab #" +i, mViewPager.getAdapter().getPageTitle(i), 463e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov mTabLayout.getTabAt(i).getText()); 464e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov } 465e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov 466e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov verifyViewPagerSelection(); 467e2f344dcf51e299fce191eee0712cd45a30cc931Kirill Grouchnikov verifyTabLayoutSelection(); 468394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov } 469c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 470c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov @Test 471e6cf359406cd7baaa0659b54c1b7d8ac45db122aAurimas Liutikas @LargeTest 472c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov public void testFixedTabMode() { 473c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // Create a new adapter (with no content) 474c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov final TextPagerAdapter newAdapter = new TextPagerAdapter(); 475c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // And set it on the ViewPager 47653a4343a126baa3d232a5f46804091af3ea73082Chris Banes onView(withId(R.id.tabs_viewpager)).perform(setAdapter(newAdapter)); 477c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // As TabLayout doesn't track adapter changes, we need to re-wire the new adapter 4783cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager)); 479c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 480c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // Set fixed mode on the TabLayout 481c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov onView(withId(R.id.tabs)).perform(TabLayoutActions.setTabMode(TabLayout.MODE_FIXED)); 482c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov assertEquals("Fixed tab mode", TabLayout.MODE_FIXED, mTabLayout.getTabMode()); 483c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 484c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // Add a bunch of tabs and verify that all of them are visible on the screen 485c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov for (int i = 0; i < 8; i++) { 486005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov onView(withId(R.id.tabs_viewpager)).perform(addItemToPager("Title " + i, "Body " + i)); 487c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 488c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov int expectedTabCount = i + 1; 489c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov assertEquals("Tab count after adding #" + i, expectedTabCount, 490c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov mTabLayout.getTabCount()); 491c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov assertEquals("Page count after adding #" + i, expectedTabCount, 492c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov mViewPager.getAdapter().getCount()); 493c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 494c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov verifyViewPagerSelection(); 495c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov verifyTabLayoutSelection(); 496c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 497c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // Check that all tabs are fully visible (the content may or may not be elided) 498c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov for (int j = 0; j < expectedTabCount; j++) { 499c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov onView(allOf(isDescendantOfA(withId(R.id.tabs)), withText("Title " + j))). 500c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov check(matches(isCompletelyDisplayed())); 501c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov } 502c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov } 503c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov } 504c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 5053f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov /** 5063f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * Helper method to verify support for min and max tab width on TabLayout in scrollable mode. 5073f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * It replaces the TabLayout based on the passed layout resource ID and then adds a bunch of 5083f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * tab titles to the wired ViewPager with progressively longer texts. After each tab is added 5093f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * this method then checks that all tab views respect the minimum and maximum tab width set 5103f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * on TabLayout. 5113f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * 5123f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * @param tabLayoutResId Layout resource for the TabLayout to be wired to the ViewPager. 5133f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * @param tabMinWidthResId If non zero, points to the dimension resource to use for tab min 5143f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * width check. 5153f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * @param tabMaxWidthResId If non zero, points to the dimension resource to use for tab max 5163f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov * width check. 5173f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov */ 5183f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov private void verifyMinMaxTabWidth(@LayoutRes int tabLayoutResId, @DimenRes int tabMinWidthResId, 5193f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov @DimenRes int tabMaxWidthResId) { 520617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes setupTabLayoutWithViewPager(); 521617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes 5223f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov assertEquals("Scrollable tab mode", TabLayout.MODE_SCROLLABLE, mTabLayout.getTabMode()); 5233f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov 524ee3e8053ef6b55e31fa0be004061318ec394eb64Kirill Grouchnikov final Resources res = mActivityTestRule.getActivity().getResources(); 5253f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov final int minTabWidth = (tabMinWidthResId == 0) ? -1 : 5263f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov res.getDimensionPixelSize(tabMinWidthResId); 5273f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov final int maxTabWidth = (tabMaxWidthResId == 0) ? -1 : 5283f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov res.getDimensionPixelSize(tabMaxWidthResId); 5293f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov 530c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // Create a new adapter (with no content) 531c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov final TextPagerAdapter newAdapter = new TextPagerAdapter(); 532c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // And set it on the ViewPager 53353a4343a126baa3d232a5f46804091af3ea73082Chris Banes onView(withId(R.id.tabs_viewpager)).perform(setAdapter(newAdapter)); 534c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 5353f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov // Replace the default TabLayout with the passed one 5363f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov onView(withId(R.id.container)).perform(TestUtilsActions.replaceTabLayout(tabLayoutResId)); 537c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 538c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // Now that we have a new TabLayout, wire it to the new content of our ViewPager 5393cbbf6cc4d8124ae40181b5ce38c7a89e749ff0fChris Banes onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager)); 540c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 5413f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov // Since TabLayout doesn't expose a getter for fetching the configured max tab width, 542c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // start adding a variety of tabs with progressively longer tab titles and test that 5433f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov // no tab is wider than the configured max width. Before we start that test, 544c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // verify that we're in the scrollable mode so that each tab title gets as much width 545c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // as needed to display its text. 546c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov assertEquals("Scrollable tab mode", TabLayout.MODE_SCROLLABLE, mTabLayout.getTabMode()); 547c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 548c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov final StringBuilder tabTitleBuilder = new StringBuilder(); 549c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov for (int i = 0; i < 40; i++) { 550c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov final char titleComponent = (char) ('A' + i); 551c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov for (int j = 0; j <= (i + 1); j++) { 552c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov tabTitleBuilder.append(titleComponent); 553c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov } 554c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov final String tabTitle = tabTitleBuilder.toString(); 555005d6d4b81b7f1c80bec1d2d6e0f4e2b85436660Kirill Grouchnikov onView(withId(R.id.tabs_viewpager)).perform(addItemToPager(tabTitle, "Body " + i)); 556c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 557c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov int expectedTabCount = i + 1; 5583f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov // Check that all tabs are at least as wide as min width *and* at most as wide as max 5593f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov // width specified in the XML for the newly loaded TabLayout 560c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov for (int j = 0; j < expectedTabCount; j++) { 561c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // Find the view that is our tab title. It should be: 562c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // 1. Descendant of our TabLayout 563c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // 2. But not a direct child of the horizontal scroller 564c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // 3. With just-added title text 565c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // These conditions make sure that we're selecting the "top-level" tab view 566c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // instead of the inner (and narrower) TextView 567c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov Matcher<View> tabMatcher = allOf( 568c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov isDescendantOfA(withId(R.id.tabs)), 569c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov not(withParent(isAssignableFrom(HorizontalScrollView.class))), 570c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov hasDescendant(withText(tabTitle))); 5713f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov if (minTabWidth >= 0) { 5723f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov onView(tabMatcher).check(matches( 5733f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov TestUtilsMatchers.isNotNarrowerThan(minTabWidth))); 5743f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov } 5753f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov if (maxTabWidth >= 0) { 5763f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov onView(tabMatcher).check(matches( 5773f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov TestUtilsMatchers.isNotWiderThan(maxTabWidth))); 5783f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov } 579c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov } 580c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 581c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov // Reset the title builder for the next tab 582c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov tabTitleBuilder.setLength(0); 583c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov tabTitleBuilder.trimToSize(); 584c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov } 5853f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov 586c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov } 587c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 588c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov @Test 5894bb57b2c7c5e8fa607119bd5089535d5862cb979Aurimas Liutikas @LargeTest 5903f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov public void testMinTabWidth() { 5913f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov verifyMinMaxTabWidth(R.layout.tab_layout_bound_min, R.dimen.tab_width_limit_medium, 0); 5923f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov } 593c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 5943f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov @Test 5954bb57b2c7c5e8fa607119bd5089535d5862cb979Aurimas Liutikas @LargeTest 5963f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov public void testMaxTabWidth() { 5973f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov verifyMinMaxTabWidth(R.layout.tab_layout_bound_max, 0, R.dimen.tab_width_limit_medium); 5983f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov } 599c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov 6003f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov @Test 6014bb57b2c7c5e8fa607119bd5089535d5862cb979Aurimas Liutikas @LargeTest 6023f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov public void testMinMaxTabWidth() { 6033f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov verifyMinMaxTabWidth(R.layout.tab_layout_bound_minmax, R.dimen.tab_width_limit_small, 6043f5b018c7f76dc299aa3819c37ba3deba2905addKirill Grouchnikov R.dimen.tab_width_limit_large); 605c7f2aad754af4373c32fcab613de0ba164ada2a2Kirill Grouchnikov } 606617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes 607617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes @Test 608617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes @SmallTest 609617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes public void testSetupAfterViewPagerScrolled() { 610617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes // Scroll to the last item 611617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes final int selected = mViewPager.getAdapter().getCount() - 1; 612617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollToPage(selected)); 613617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes 614617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes // Now setup the TabLayout with the ViewPager 615617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes setupTabLayoutWithViewPager(); 616617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes 617617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes assertEquals("Selected page", selected, mViewPager.getCurrentItem()); 618617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes assertEquals("Selected tab", selected, mTabLayout.getSelectedTabPosition()); 619617471b5d3c1465056c542de6343812cc6d6cd06Chris Banes } 62053a4343a126baa3d232a5f46804091af3ea73082Chris Banes 62153a4343a126baa3d232a5f46804091af3ea73082Chris Banes @Test 62253a4343a126baa3d232a5f46804091af3ea73082Chris Banes @SmallTest 62353a4343a126baa3d232a5f46804091af3ea73082Chris Banes public void testEmptyAdapter() { 62453a4343a126baa3d232a5f46804091af3ea73082Chris Banes ColorPagerAdapter adapter = new ColorPagerAdapter(); 62553a4343a126baa3d232a5f46804091af3ea73082Chris Banes onView(withId(R.id.tabs_viewpager)).perform(setAdapter(adapter)); 62653a4343a126baa3d232a5f46804091af3ea73082Chris Banes } 62753a4343a126baa3d232a5f46804091af3ea73082Chris Banes 628394c4272d0e220cf7af236665eecaf99dfed25b1Kirill Grouchnikov} 629