GridLayoutManagerRtlTest.java revision e9f9cd8d0e9008340985d17a2541ab24b3adb391
1b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz/*
2e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour * Copyright (C) 2016 The Android Open Source Project
3b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz *
4b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz * Licensed under the Apache License, Version 2.0 (the "License");
5b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz * you may not use this file except in compliance with the License.
6b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz * You may obtain a copy of the License at
7e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour *
843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn *      http://www.apache.org/licenses/LICENSE-2.0
943b53e83705f02245da6ae61e31273866a35b833Jon Ashburn *
1043b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Unless required by applicable law or agreed to in writing, software
11e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour * distributed under the License is distributed on an "AS IS" BASIS,
1243b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz * See the License for the specific language governing permissions and
1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * limitations under the License.
1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn */
1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn
1743b53e83705f02245da6ae61e31273866a35b833Jon Ashburnpackage android.support.v7.widget;
1843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn
19b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz
20e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport static android.support.v7.widget.LinearLayoutManager.HORIZONTAL;
21e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport static android.support.v7.widget.LinearLayoutManager.VERTICAL;
22e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour
23e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport static org.junit.Assert.assertEquals;
24e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport static org.junit.Assert.assertNotNull;
25ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northropimport static org.junit.Assert.assertTrue;
26e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour
27e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport android.view.View;
28f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labourimport android.view.ViewGroup;
29f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour
30e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport org.junit.Test;
31e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport org.junit.runner.RunWith;
32e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport org.junit.runners.Parameterized;
33e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour
34e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport java.util.ArrayList;
35e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport java.util.List;
3666e6a3f23e9332bfae6219e97cb5616208d7f30cJesse Hall
37e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour@RunWith(Parameterized.class)
38e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourpublic class GridLayoutManagerRtlTest extends BaseGridLayoutManagerTest {
39e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour
40e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour    public GridLayoutManagerRtlTest(Config config, boolean changeRtlAfter, boolean oneLine,
41ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop            boolean itemsWrapContent) {
42ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop        mConfig = config;
43ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop        mChangeRtlAfter = changeRtlAfter;
44ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop        mOneLine = oneLine;
45e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour        mItemsWrapContent = itemsWrapContent;
46ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop    }
47e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour
48e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour    @Parameterized.Parameters(name = "conf:{0},changeRl:{1},oneLine:{2},itemsWrap:{3}")
49e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour    public static List<Object[]> params() {
50e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour        List<Object[]> result = new ArrayList<>();
51e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour        for (boolean changeRtlAfter : new boolean[]{false, true}) {
52e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour            for (boolean oneLine : new boolean[]{false, true}) {
5306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                for (boolean itemsWrapContent : new boolean[]{false, true}) {
54e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour                    for (Config config : createBaseVariations()) {
55e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour                        result.add(new Object[] {
56e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour                                config,
5706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                                changeRtlAfter,
5806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                                oneLine,
5906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                                itemsWrapContent
6006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                        });
6106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    }
6206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                }
6306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            }
6406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        }
6506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        return result;
6606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang    }
6706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang    final Config mConfig;
6806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang    final boolean mChangeRtlAfter;
6906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang    final boolean mOneLine;
7006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang    final boolean mItemsWrapContent;
7106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang
7206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang
7306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang    @Test
7406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang    public void rtlTest() throws Throwable {
7506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        if (mOneLine && mConfig.mOrientation != VERTICAL) {
7606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            return;// nothing to test
7706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        }
7806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        if (mConfig.mSpanCount == 1) {
7906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            mConfig.mSpanCount = 2;
8006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        }
8106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        String logPrefix = mConfig + ", changeRtlAfterLayout:" + mChangeRtlAfter + ","
8206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                + "oneLine:" + mOneLine + " itemsWrap:" + mItemsWrapContent;
8306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        mConfig.mItemCount = 5;
8406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        if (mOneLine) {
8506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            mConfig.mSpanCount = mConfig.mItemCount + 1;
8606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        } else {
8706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            mConfig.mSpanCount = Math.min(mConfig.mItemCount - 1, mConfig.mSpanCount);
8806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        }
8906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang
9006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        RecyclerView rv = setupBasic(mConfig, new GridTestAdapter(mConfig.mItemCount) {
9106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            @Override
9206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            public void onBindViewHolder(TestViewHolder holder,
9306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    int position) {
9406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                super.onBindViewHolder(holder, position);
9506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                if (mItemsWrapContent) {
9606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
9706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    if (lp == null) {
9806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                        lp = mGlm.generateDefaultLayoutParams();
9906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    }
10006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    if (mConfig.mOrientation == HORIZONTAL) {
10106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                        lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
10206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    } else {
10306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                        lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;
10406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    }
10506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                }
10606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            }
10706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        });
10806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        if (mChangeRtlAfter) {
10906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            waitForFirstLayout(rv);
11006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            mGlm.expectLayout(1);
11106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            mGlm.setFakeRtl(true);
11206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            mGlm.waitForLayout(2);
11306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        } else {
11406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            mGlm.mFakeRTL = true;
11506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            waitForFirstLayout(rv);
11606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        }
11706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang
11806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        assertEquals("view should become rtl", true, mGlm.isLayoutRTL());
11906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        OrientationHelper helper = OrientationHelper.createHorizontalHelper(mGlm);
12006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        View child0 = mGlm.findViewByPosition(0);
12106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        final int secondChildPos = mConfig.mOrientation == VERTICAL ? 1
12206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                : mConfig.mSpanCount;
12306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        View child1 = mGlm.findViewByPosition(secondChildPos);
12406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        assertNotNull(logPrefix + " child position 0 should be laid out", child0);
12506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        assertNotNull(
12606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                logPrefix + " second child position " + (secondChildPos) + " should be laid out",
12706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                child1);
12806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        if (mConfig.mOrientation == VERTICAL || !mConfig.mReverseLayout) {
12906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            assertTrue(logPrefix + " second child should be to the left of first child",
13006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    helper.getDecoratedStart(child0) >= helper.getDecoratedEnd(child1));
13106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            assertEquals(logPrefix + " first child should be right aligned",
13206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    helper.getDecoratedEnd(child0), helper.getEndAfterPadding());
13306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        } else {
13406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            assertTrue(logPrefix + " first child should be to the left of second child",
13506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    helper.getDecoratedStart(child1) >= helper.getDecoratedEnd(child0));
13606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang            assertEquals(logPrefix + " first child should be left aligned",
13706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang                    helper.getDecoratedStart(child0), helper.getStartAfterPadding());
13806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        }
13906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang        checkForMainThreadException();
14006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang    }
14106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang}
14206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang