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