GravityCompatTest.java revision 754cb29c50f09a83251dd4bb633ba445b2411adb
1/*
2 * Copyright (C) 2015 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 */
16package android.support.v4.view;
17
18import static org.junit.Assert.assertEquals;
19
20import android.graphics.Rect;
21import android.os.Build;
22import android.support.test.filters.SmallTest;
23import android.support.test.runner.AndroidJUnit4;
24import android.support.v4.testutils.TestUtils;
25import android.view.Gravity;
26
27import org.junit.Test;
28import org.junit.runner.RunWith;
29
30@RunWith(AndroidJUnit4.class)
31@SmallTest
32public class GravityCompatTest {
33    @Test
34    public void testConstants() {
35        // Compat constants must match core constants since they can be OR'd with
36        // other core constants.
37        assertEquals("Start constants", Gravity.START, GravityCompat.START);
38        assertEquals("End constants", Gravity.END, GravityCompat.END);
39    }
40
41    @Test
42    public void testGetAbsoluteGravity() {
43        assertEquals("Left under LTR",
44                GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_LTR),
45                Gravity.LEFT);
46        assertEquals("Right under LTR",
47                GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_LTR),
48                Gravity.RIGHT);
49        assertEquals("Left under RTL",
50                GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_RTL),
51                Gravity.LEFT);
52        assertEquals("Right under RTL",
53                GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_RTL),
54                Gravity.RIGHT);
55
56        assertEquals("Start under LTR",
57                GravityCompat.getAbsoluteGravity(GravityCompat.START,
58                        ViewCompat.LAYOUT_DIRECTION_LTR),
59                Gravity.LEFT);
60        assertEquals("End under LTR",
61                GravityCompat.getAbsoluteGravity(GravityCompat.END,
62                        ViewCompat.LAYOUT_DIRECTION_LTR),
63                Gravity.RIGHT);
64
65        if (Build.VERSION.SDK_INT >= 17) {
66            // The following tests are only expected to pass on v17+ devices
67            assertEquals("Start under RTL",
68                    GravityCompat.getAbsoluteGravity(GravityCompat.START,
69                            ViewCompat.LAYOUT_DIRECTION_RTL),
70                    Gravity.RIGHT);
71            assertEquals("End under RTL",
72                    GravityCompat.getAbsoluteGravity(GravityCompat.END,
73                            ViewCompat.LAYOUT_DIRECTION_RTL),
74                    Gravity.LEFT);
75        } else {
76            // And on older devices START is always LEFT, END is always RIGHT
77            assertEquals("Start under RTL",
78                    GravityCompat.getAbsoluteGravity(GravityCompat.START,
79                            ViewCompat.LAYOUT_DIRECTION_RTL),
80                    Gravity.LEFT);
81            assertEquals("End under RTL",
82                    GravityCompat.getAbsoluteGravity(GravityCompat.END,
83                            ViewCompat.LAYOUT_DIRECTION_RTL),
84                    Gravity.RIGHT);
85        }
86    }
87
88    @Test
89    public void testApplyNoOffsetsLtr() {
90        Rect outRect = new Rect();
91
92        // Left / top aligned under LTR direction
93        GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
94                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
95        TestUtils.assertRectangleBounds("Left / top aligned under LTR: ",
96                outRect, 0, 0, 100, 50);
97
98        // Center / top aligned under LTR direction
99        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
100                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
101        TestUtils.assertRectangleBounds("Center / top aligned under LTR: ",
102                outRect, 50, 0, 150, 50);
103
104        // Right / top aligned under LTR direction
105        GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
106                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
107        TestUtils.assertRectangleBounds("Right / top aligned under LTR: ",
108                outRect, 100, 0, 200, 50);
109
110        // Left / center aligned under LTR direction
111        GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
112                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
113        TestUtils.assertRectangleBounds("Left / center aligned under LTR: ",
114                outRect, 0, 25, 100, 75);
115
116        // Center / center aligned under LTR direction
117        GravityCompat.apply(Gravity.CENTER, 100, 50,
118                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
119        TestUtils.assertRectangleBounds("Center / center aligned under LTR: ",
120                outRect, 50, 25, 150, 75);
121
122        // Right / center aligned under LTR direction
123        GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
124                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
125        TestUtils.assertRectangleBounds("Right / center aligned under LTR: ",
126                outRect, 100, 25, 200, 75);
127
128        // Left / bottom aligned under LTR direction
129        GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
130                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
131        TestUtils.assertRectangleBounds("Left / bottom aligned under LTR: ",
132                outRect, 0, 50, 100, 100);
133
134        // Center / bottom aligned under LTR direction
135        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
136                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
137        TestUtils.assertRectangleBounds("Center / bottom aligned under LTR: ",
138                outRect, 50, 50, 150, 100);
139
140        // Right / bottom aligned under LTR direction
141        GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
142                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
143        TestUtils.assertRectangleBounds("Right / bottom aligned under LTR: ",
144                outRect, 100, 50, 200, 100);
145
146        // The following tests are expected to pass on all devices since START under LTR is LEFT
147        // and END under LTR is RIGHT on pre-v17 and v17+ versions of the platform.
148
149        // Start / top aligned under LTR direction
150        GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
151                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
152        TestUtils.assertRectangleBounds("Start / top aligned under LTR: ",
153                outRect, 0, 0, 100, 50);
154
155        // End / top aligned under LTR direction
156        GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
157                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
158        TestUtils.assertRectangleBounds("End / top aligned under LTR: ",
159                outRect, 100, 0, 200, 50);
160
161        // Start / center aligned under LTR direction
162        GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
163                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
164        TestUtils.assertRectangleBounds("Start / center aligned under LTR: ",
165                outRect, 0, 25, 100, 75);
166
167        // End / center aligned under LTR direction
168        GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
169                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
170        TestUtils.assertRectangleBounds("End / center aligned under LTR: ",
171                outRect, 100, 25, 200, 75);
172
173        // Start / bottom aligned under LTR direction
174        GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
175                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
176        TestUtils.assertRectangleBounds("Start / bottom aligned under LTR: ",
177                outRect, 0, 50, 100, 100);
178
179        // End / bottom aligned under LTR direction
180        GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
181                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
182        TestUtils.assertRectangleBounds("End / bottom aligned under LTR: ",
183                outRect, 100, 50, 200, 100);
184    }
185
186    @Test
187    public void testApplyNoOffsetsRtl() {
188        Rect outRect = new Rect();
189
190        // The following tests are expected to pass on all devices since they are using
191        // Gravity constants that are not RTL-aware
192
193        // Left / top aligned under RTL direction
194        GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
195                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
196        TestUtils.assertRectangleBounds("Left / top aligned under RTL: ",
197                outRect, 0, 0, 100, 50);
198
199        // Center / top aligned under RTL direction
200        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
201                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
202        TestUtils.assertRectangleBounds("Center / top aligned under RTL: ",
203                outRect, 50, 0, 150, 50);
204
205        // Right / top aligned under RTL direction
206        GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
207                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
208        TestUtils.assertRectangleBounds("Right / top aligned under RTL: ",
209                outRect, 100, 0, 200, 50);
210
211        // Left / center aligned under RTL direction
212        GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
213                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
214        TestUtils.assertRectangleBounds("Left / center aligned under RTL: ",
215                outRect, 0, 25, 100, 75);
216
217        // Center / center aligned under RTL direction
218        GravityCompat.apply(Gravity.CENTER, 100, 50,
219                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
220        TestUtils.assertRectangleBounds("Center / center aligned under RTL: ",
221                outRect, 50, 25, 150, 75);
222
223        // Right / center aligned under RTL direction
224        GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
225                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
226        TestUtils.assertRectangleBounds("Right / center aligned under RTL: ",
227                outRect, 100, 25, 200, 75);
228
229        // Left / bottom aligned under RTL direction
230        GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
231                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
232        TestUtils.assertRectangleBounds("Left / bottom aligned under RTL: ",
233                outRect, 0, 50, 100, 100);
234
235        // Center / bottom aligned under RTL direction
236        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
237                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
238        TestUtils.assertRectangleBounds("Center / bottom aligned under RTL: ",
239                outRect, 50, 50, 150, 100);
240
241        // Right / bottom aligned under RTL direction
242        GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
243                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
244        TestUtils.assertRectangleBounds("Right / bottom aligned under RTL: ",
245                outRect, 100, 50, 200, 100);
246
247
248        if (Build.VERSION.SDK_INT >= 17) {
249            // The following tests are only expected to pass on v17+ devices since START under
250            // RTL is RIGHT and END under RTL is LEFT only on those devices.
251
252            // Start / top aligned under RTL direction
253            GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
254                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
255            TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
256                    outRect, 100, 0, 200, 50);
257
258            // End / top aligned under RTL direction
259            GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
260                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
261            TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
262                    outRect, 0, 0, 100, 50);
263
264            // Start / center aligned under RTL direction
265            GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
266                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
267            TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
268                    outRect, 100, 25, 200, 75);
269
270            // End / center aligned under RTL direction
271            GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
272                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
273            TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
274                    outRect, 0, 25, 100, 75);
275
276            // Start / bottom aligned under RTL direction
277            GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
278                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
279            TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
280                    outRect, 100, 50, 200, 100);
281
282            // End / bottom aligned under RTL direction
283            GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
284                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
285            TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
286                    outRect, 0, 50, 100, 100);
287        } else {
288            // And on older devices START is always LEFT, END is always RIGHT
289
290            // Start / top aligned under RTL direction
291            GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
292                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
293            TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
294                    outRect, 0, 0, 100, 50);
295
296            // End / top aligned under RTL direction
297            GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
298                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
299            TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
300                    outRect, 100, 0, 200, 50);
301
302            // Start / center aligned under RTL direction
303            GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
304                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
305            TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
306                    outRect, 0, 25, 100, 75);
307
308            // End / center aligned under RTL direction
309            GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
310                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
311            TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
312                    outRect, 100, 25, 200, 75);
313
314            // Start / bottom aligned under RTL direction
315            GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
316                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
317            TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
318                    outRect, 0, 50, 100, 100);
319
320            // End / bottom aligned under RTL direction
321            GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
322                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
323            TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
324                    outRect, 100, 50, 200, 100);
325        }
326    }
327}
328