1aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar/*
2aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
3aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar *
4aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar * you may not use this file except in compliance with the License.
6aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar * You may obtain a copy of the License at
7aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar *
8aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar *
10aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar * See the License for the specific language governing permissions and
14aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar * limitations under the License.
15aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar */
16aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar
171d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovpackage android.support.v7.widget;
18aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar
19aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyarimport android.app.Activity;
201d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport android.app.Instrumentation;
2170d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyarimport android.content.Context;
221d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport android.support.test.InstrumentationRegistry;
231d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport android.support.test.rule.ActivityTestRule;
241d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport android.support.test.runner.AndroidJUnit4;
25daea069fe33cc750bcb733ebcb6206d2dcedae76Chris Banesimport android.support.v7.gridlayout.test.R;
261d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport android.test.suitebuilder.annotation.SmallTest;
2770d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyarimport android.util.AttributeSet;
28aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyarimport android.view.Gravity;
29aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyarimport android.view.View;
30aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyarimport android.view.ViewGroup;
311d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport org.junit.Rule;
321d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport org.junit.Test;
331d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport org.junit.runner.RunWith;
34aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar
351d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport static org.junit.Assert.assertEquals;
361d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovimport static org.junit.Assert.assertTrue;
371d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov
381d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov@RunWith(AndroidJUnit4.class)
39daea069fe33cc750bcb733ebcb6206d2dcedae76Chris Banes@SmallTest
401d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikovpublic class GridLayoutTest {
411d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    @Rule public final ActivityTestRule<GridLayoutTestActivity> mActivityTestRule;
421d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov
431d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    private View mLeftView;
441d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    private View mRightView;
451d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    private View mGridView;
46aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar
47aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar    public GridLayoutTest() {
481d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        mActivityTestRule = new ActivityTestRule<>(GridLayoutTestActivity.class);
49aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar    }
50aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar
511d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    private void setContentView(final int layoutId) {
521d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
531d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        instrumentation.runOnMainSync(new Runnable() {
54aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar            @Override
55aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar            public void run() {
561d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov                final Activity activity = mActivityTestRule.getActivity();
57aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar                activity.setContentView(layoutId);
581d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov                // Now that we've set the content view, find the views we'll be testing
591d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov                mLeftView = activity.findViewById(R.id.leftView);
601d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov                mRightView = activity.findViewById(R.id.rightView);
611d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov                mGridView = activity.findViewById(R.id.gridView);
62aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar            }
63aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        });
641d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        instrumentation.waitForIdleSync();
65aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar    }
66aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar
671d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    @Test
681d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    public void testUseDefaultMargin() {
69aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        setContentView(R.layout.use_default_margin_test);
701d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int left = mLeftView.getWidth();
711d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int right = mRightView.getWidth();
721d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int total = mGridView.getWidth();
73aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("left item should get some width", left > 0);
74aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("right item should get some width", right > 0);
75aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("test sanity", total > 0);
76aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("left view should be almost two times right view " + left + " vs " + right,
77aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar                Math.abs(right * 2 - left) < 2);
78aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar    }
79aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar
801d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    @Test
811d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    public void testImplicitFillHorizontal() {
82aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        setContentView(R.layout.fill_horizontal_test);
831d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int left = mLeftView.getWidth();
841d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int right = mRightView.getWidth();
851d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int total = mGridView.getWidth();
86aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("left item should get some width", left > 0);
87aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("right item should get some width", right > 0);
88aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("test sanity", total > 0);
89aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("left view should be almost two times right view " + left + " vs " + right,
90aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar                Math.abs(right * 2 - left) < 2);
91aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar    }
92aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar
931d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    @Test
941d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    public void testMakeViewGone() {
95aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        setContentView(R.layout.make_view_gone_test);
961d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int left = mLeftView.getWidth();
971d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int right = mRightView.getWidth();
981d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int total = mGridView.getWidth();
99aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("left item should get some width", left > 0);
100aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("right item should get some width", right > 0);
101aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("test sanity", total > 0);
102aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        // set second view to gone
1031d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
1041d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        instrumentation.runOnMainSync(new Runnable() {
105aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar            @Override
106aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar            public void run() {
1071d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov                final View rightView = mActivityTestRule.getActivity().findViewById(R.id.rightView);
108aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar                GridLayout.LayoutParams lp = (GridLayout.LayoutParams) rightView.getLayoutParams();
109aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar                lp.setGravity(Gravity.NO_GRAVITY);
110aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar                rightView.setVisibility(View.GONE);
111aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar            }
112aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        });
1131d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        instrumentation.waitForIdleSync();
1141d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        left = mActivityTestRule.getActivity().findViewById(R.id.leftView).getWidth();
115aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertEquals(total, left);
116aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar    }
1171d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov
1181d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    @Test
1191d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov    public void testWrapContentInOtherDirection() {
120aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        setContentView(R.layout.height_wrap_content_test);
1211d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int left = mLeftView.getHeight();
1221d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int right = mRightView.getHeight();
1231d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov        int total = mGridView.getHeight();
124aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("test sanity", left > 0);
125aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("test sanity", right > 0);
126aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("test sanity", total > 0);
127aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("right should be taller than left", right > left);
128aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar        assertTrue("total height should be smaller than what it could be",
1291d3991c0a215d89f59df4e5a12084ca793a25ba6Kirill Grouchnikov                total < ((ViewGroup) mGridView.getParent()).getHeight());
130aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar    }
13170d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar
13270d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar    @Test
13370d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar    public void testGenerateLayoutParamsFromMarginParams() {
13470d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        MyGridLayout gridLayout = new MyGridLayout(mActivityTestRule.getActivity());
13570d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(3, 5);
13670d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        lp.leftMargin = 1;
13770d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        lp.topMargin = 2;
13870d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        lp.rightMargin = 3;
13970d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        lp.bottomMargin = 4;
14070d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        GridLayout.LayoutParams generated = gridLayout.generateLayoutParams(lp);
14170d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        assertEquals(3, generated.width);
14270d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        assertEquals(5, generated.height);
14370d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar
14470d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        assertEquals(1, generated.leftMargin);
14570d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        assertEquals(2, generated.topMargin);
14670d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        assertEquals(3, generated.rightMargin);
14770d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        assertEquals(4, generated.bottomMargin);
14870d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar    }
14970d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar
15070d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar    private static class MyGridLayout extends GridLayout {
15170d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar
15270d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        public MyGridLayout(Context context) {
15370d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar            super(context);
15470d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        }
15570d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar
15670d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        public MyGridLayout(Context context, AttributeSet attrs) {
15770d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar            super(context, attrs);
15870d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        }
15970d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar
16070d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        public MyGridLayout(Context context, AttributeSet attrs, int defStyleAttr) {
16170d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar            super(context, attrs, defStyleAttr);
16270d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        }
16370d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar
16470d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        @Override
16570d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
16670d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar            return super.generateLayoutParams(p);
16770d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar        }
16870d141daa825e7443df4aa149acddbfdb0bab64aYigit Boyar    }
169aba8d47bf2f26c657a83ab3fbd24f531df5b0510Yigit Boyar}
170