1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.view.cts; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertNotNull; 21 import static org.junit.Assert.fail; 22 23 import android.content.Context; 24 import android.content.res.XmlResourceParser; 25 import android.graphics.Rect; 26 import android.support.test.InstrumentationRegistry; 27 import android.support.test.filters.SmallTest; 28 import android.support.test.runner.AndroidJUnit4; 29 import android.view.LayoutInflater; 30 import android.view.View; 31 import android.view.ViewGroup; 32 import android.view.ViewGroup.MarginLayoutParams; 33 import android.view.cts.util.XmlUtils; 34 import android.widget.LinearLayout; 35 36 import org.junit.Before; 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 40 @SmallTest 41 @RunWith(AndroidJUnit4.class) 42 public class ViewGroup_MarginLayoutParamsTest { 43 private Context mContext; 44 private ViewGroup.MarginLayoutParams mMarginLayoutParams; 45 46 @Before 47 public void setup() { 48 mContext = InstrumentationRegistry.getTargetContext(); 49 } 50 51 @Test 52 public void testConstructor() { 53 // create a new MarginLayoutParams instance 54 XmlResourceParser p = mContext.getResources().getLayout( 55 R.layout.viewgroup_margin_layout); 56 try { 57 XmlUtils.beginDocument(p, "LinearLayout"); 58 } catch (Exception e) { 59 fail("Fail in preparing AttibuteSet."); 60 } 61 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(mContext, p); 62 assertNotNull(mMarginLayoutParams); 63 64 mMarginLayoutParams = null; 65 // create a new MarginLayoutParams instance 66 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(320, 480); 67 assertNotNull(mMarginLayoutParams); 68 69 mMarginLayoutParams = null; 70 // create a new MarginLayoutParams instance 71 MarginLayoutParams temp = new ViewGroup.MarginLayoutParams(320, 480); 72 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(temp); 73 assertNotNull(mMarginLayoutParams); 74 75 mMarginLayoutParams = null; 76 // create a new MarginLayoutParams instance 77 ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(320, 480); 78 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(lp); 79 assertNotNull(mMarginLayoutParams); 80 } 81 82 @Test 83 public void testSetMargins() { 84 // create a new MarginLayoutParams instance 85 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(320, 480); 86 mMarginLayoutParams.setMargins(20, 30, 120, 140); 87 assertEquals(20, mMarginLayoutParams.leftMargin); 88 assertEquals(30, mMarginLayoutParams.topMargin); 89 assertEquals(120, mMarginLayoutParams.rightMargin); 90 assertEquals(140, mMarginLayoutParams.bottomMargin); 91 92 assertEquals(20, mMarginLayoutParams.getMarginStart()); 93 assertEquals(120, mMarginLayoutParams.getMarginEnd()); 94 95 assertEquals(false, mMarginLayoutParams.isMarginRelative()); 96 } 97 98 @Test 99 public void testSetMarginsRelative() { 100 // create a new MarginLayoutParams instance 101 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(320, 480); 102 mMarginLayoutParams.setMargins(0, 30, 0, 140); 103 mMarginLayoutParams.setMarginStart(20); 104 mMarginLayoutParams.setMarginEnd(120); 105 assertEquals(20, mMarginLayoutParams.getMarginStart()); 106 assertEquals(30, mMarginLayoutParams.topMargin); 107 assertEquals(120, mMarginLayoutParams.getMarginEnd()); 108 assertEquals(140, mMarginLayoutParams.bottomMargin); 109 110 assertEquals(0, mMarginLayoutParams.leftMargin); 111 assertEquals(0, mMarginLayoutParams.rightMargin); 112 113 assertEquals(true, mMarginLayoutParams.isMarginRelative()); 114 } 115 116 @Test 117 public void testResolveMarginsRelative() { 118 ViewGroup vg = new LinearLayout(mContext); 119 120 // LTR / normal margin case 121 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(320, 480); 122 mMarginLayoutParams.setMargins(20, 30, 120, 140); 123 vg.setLayoutParams(mMarginLayoutParams); 124 125 assertEquals(20, mMarginLayoutParams.leftMargin); 126 assertEquals(30, mMarginLayoutParams.topMargin); 127 assertEquals(120, mMarginLayoutParams.rightMargin); 128 assertEquals(140, mMarginLayoutParams.bottomMargin); 129 130 assertEquals(20, mMarginLayoutParams.getMarginStart()); 131 assertEquals(120, mMarginLayoutParams.getMarginEnd()); 132 133 assertEquals(false, mMarginLayoutParams.isMarginRelative()); 134 135 // LTR / relative margin case 136 mMarginLayoutParams.setMargins(0, 30, 0, 140); 137 mMarginLayoutParams.setMarginStart(20); 138 mMarginLayoutParams.setMarginEnd(120); 139 vg.setLayoutParams(mMarginLayoutParams); 140 141 assertEquals(20, mMarginLayoutParams.getMarginStart()); 142 assertEquals(30, mMarginLayoutParams.topMargin); 143 assertEquals(120, mMarginLayoutParams.getMarginEnd()); 144 assertEquals(140, mMarginLayoutParams.bottomMargin); 145 146 assertEquals(20, mMarginLayoutParams.leftMargin); 147 assertEquals(120, mMarginLayoutParams.rightMargin); 148 149 assertEquals(true, mMarginLayoutParams.isMarginRelative()); 150 151 // RTL / normal margin case 152 vg.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 153 154 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(320, 480); 155 mMarginLayoutParams.setMargins(20, 30, 120, 140); 156 vg.setLayoutParams(mMarginLayoutParams); 157 158 assertEquals(20, mMarginLayoutParams.leftMargin); 159 assertEquals(30, mMarginLayoutParams.topMargin); 160 assertEquals(120, mMarginLayoutParams.rightMargin); 161 assertEquals(140, mMarginLayoutParams.bottomMargin); 162 163 assertEquals(120, mMarginLayoutParams.getMarginStart()); 164 assertEquals(20, mMarginLayoutParams.getMarginEnd()); 165 166 assertEquals(false, mMarginLayoutParams.isMarginRelative()); 167 168 // RTL / relative margin case 169 mMarginLayoutParams.setMargins(0, 30, 0, 140); 170 mMarginLayoutParams.setMarginStart(20); 171 mMarginLayoutParams.setMarginEnd(120); 172 vg.setLayoutParams(mMarginLayoutParams); 173 174 assertEquals(20, mMarginLayoutParams.getMarginStart()); 175 assertEquals(30, mMarginLayoutParams.topMargin); 176 assertEquals(120, mMarginLayoutParams.getMarginEnd()); 177 assertEquals(140, mMarginLayoutParams.bottomMargin); 178 179 assertEquals(120, mMarginLayoutParams.leftMargin); 180 assertEquals(20, mMarginLayoutParams.rightMargin); 181 182 assertEquals(true, mMarginLayoutParams.isMarginRelative()); 183 } 184 185 @Test 186 public void testResolveMarginsExplicit() { 187 // LTR / relative margin case 188 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(320, 480); 189 mMarginLayoutParams.setMargins(0, 30, 0, 140); 190 mMarginLayoutParams.setMarginStart(20); 191 mMarginLayoutParams.setMarginEnd(120); 192 mMarginLayoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_LTR); 193 194 assertEquals(20, mMarginLayoutParams.getMarginStart()); 195 assertEquals(30, mMarginLayoutParams.topMargin); 196 assertEquals(120, mMarginLayoutParams.getMarginEnd()); 197 assertEquals(140, mMarginLayoutParams.bottomMargin); 198 199 assertEquals(20, mMarginLayoutParams.leftMargin); 200 assertEquals(120, mMarginLayoutParams.rightMargin); 201 202 assertEquals(true, mMarginLayoutParams.isMarginRelative()); 203 204 // RTL / relative margin case 205 mMarginLayoutParams = new ViewGroup.MarginLayoutParams(320, 480); 206 mMarginLayoutParams.setMargins(0, 30, 0, 140); 207 mMarginLayoutParams.setMarginStart(20); 208 mMarginLayoutParams.setMarginEnd(120); 209 mMarginLayoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_RTL); 210 211 assertEquals(20, mMarginLayoutParams.getMarginStart()); 212 assertEquals(30, mMarginLayoutParams.topMargin); 213 assertEquals(120, mMarginLayoutParams.getMarginEnd()); 214 assertEquals(140, mMarginLayoutParams.bottomMargin); 215 216 assertEquals(120, mMarginLayoutParams.leftMargin); 217 assertEquals(20, mMarginLayoutParams.rightMargin); 218 219 assertEquals(true, mMarginLayoutParams.isMarginRelative()); 220 } 221 222 @Test 223 public void testVerticalHorizontalMargins() { 224 LayoutInflater inflater = LayoutInflater.from(mContext); 225 226 LinearLayout viewGroup = (LinearLayout) 227 inflater.inflate(R.layout.viewgroup_margin_layout_verticalhorizontal, null); 228 int measureSpec = View.MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY); 229 viewGroup.measure(measureSpec, measureSpec); 230 viewGroup.layout(0, 0, 1000, 1000); 231 232 View view1 = viewGroup.findViewById(R.id.view1); 233 View view2 = viewGroup.findViewById(R.id.view2); 234 View view3 = viewGroup.findViewById(R.id.view3); 235 View view4 = viewGroup.findViewById(R.id.view4); 236 View view5 = viewGroup.findViewById(R.id.view5); 237 View view6 = viewGroup.findViewById(R.id.view6); 238 View view7 = viewGroup.findViewById(R.id.view7); 239 240 Rect defaultBounds = new Rect(view1.getLeft(), view1.getTop(), view1.getRight(), 241 view1.getBottom()); 242 int marginStart = mContext.getResources().getDimensionPixelSize(R.dimen.marginStart); 243 int marginEnd = mContext.getResources().getDimensionPixelSize(R.dimen.marginEnd); 244 int marginAll = mContext.getResources().getDimensionPixelSize(R.dimen.marginAll); 245 int marginHorizontal = 246 mContext.getResources().getDimensionPixelSize(R.dimen.marginHorizontal); 247 int marginVertical = mContext.getResources().getDimensionPixelSize(R.dimen.marginVertical); 248 249 checkBounds(view2, defaultBounds, marginHorizontal, 0, marginHorizontal, 0); 250 checkBounds(view3, defaultBounds, 0, marginVertical, 0, marginVertical); 251 checkBounds(view4, defaultBounds, marginHorizontal, marginVertical, 252 marginHorizontal, marginVertical); 253 checkBounds(view5, defaultBounds, marginHorizontal, marginVertical, 254 marginHorizontal, marginVertical); 255 checkBounds(view6, defaultBounds, marginStart, marginVertical, marginEnd, marginVertical); 256 checkBounds(view7, defaultBounds, marginAll, marginAll, marginAll, marginAll); 257 } 258 259 private void checkBounds(View view, Rect defaultBounds, 260 int insetLeft, int insetTop, int insetRight, int insetBottom) { 261 assertEquals("Left", defaultBounds.left + insetLeft, view.getLeft()); 262 assertEquals("Top", defaultBounds.top + insetTop, view.getTop()); 263 assertEquals("Right", defaultBounds.right - insetRight, view.getRight()); 264 assertEquals("Bottom", defaultBounds.bottom - insetBottom, view.getBottom()); 265 } 266 } 267