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