blob: c575fc5982bf6ff0d3260ab098aa828d8677fe57 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2007 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
17package android.test;
18
19import static junit.framework.Assert.*;
20
21import android.view.View;
22import android.view.ViewGroup;
23
24/**
25 * Some useful assertions about views.
26 */
27public class ViewAsserts {
28
29 private ViewAsserts() {}
30
31 /**
32 * Assert that view is on the screen.
33 * @param origin The root view of the screen.
34 * @param view The view.
35 */
36 static public void assertOnScreen(View origin, View view) {
37 int[] xy = new int[2];
38 view.getLocationOnScreen(xy);
39
40 int[] xyRoot = new int[2];
41 origin.getLocationOnScreen(xyRoot);
42
43 int y = xy[1] - xyRoot[1];
44
45 assertTrue("view should have positive y coordinate on screen",
46 y >= 0);
47
48 assertTrue("view should have y location on screen less than drawing "
49 + "height of root view",
50 y <= view.getRootView().getHeight());
51 }
52
53 /**
54 * Assert that view is below the visible screen.
55 * @param origin The root view of the screen.
56 * @param view The view
57 */
58 static public void assertOffScreenBelow(View origin, View view) {
59 int[] xy = new int[2];
60 view.getLocationOnScreen(xy);
61
62 int[] xyRoot = new int[2];
63 origin.getLocationOnScreen(xyRoot);
64
65 int y = xy[1] - xyRoot[1];
66
67 assertTrue("view should have y location on screen greater than drawing "
68 + "height of origen view (" + y + " is not greater than "
69 + origin.getHeight() + ")",
70 y > origin.getHeight());
71 }
72
73 /**
74 * Assert that view is above the visible screen.
75 * @param origin Te root view of the screen.
76 * @param view The view
77 */
78 static public void assertOffScreenAbove(View origin, View view) {
79 int[] xy = new int[2];
80 view.getLocationOnScreen(xy);
81
82 int[] xyRoot = new int[2];
83 origin.getLocationOnScreen(xyRoot);
84
85 int y = xy[1] - xyRoot[1];
86
87 assertTrue("view should have y location less than that of origin view",
88 y < 0);
89 }
90
91 /**
92 * Assert that a view has a particular x and y position on the visible screen.
93 * @param origin The root view of the screen.
94 * @param view The view.
95 * @param x The expected x coordinate.
96 * @param y The expected y coordinate.
97 */
98 static public void assertHasScreenCoordinates(View origin, View view, int x, int y) {
99 int[] xy = new int[2];
100 view.getLocationOnScreen(xy);
101
102 int[] xyRoot = new int[2];
103 origin.getLocationOnScreen(xyRoot);
104
105 assertEquals("x coordinate", x, xy[0] - xyRoot[0]);
106 assertEquals("y coordinate", y, xy[1] - xyRoot[1]);
107 }
108
109 /**
110 * Assert that two views are aligned on their baseline, that is that their baselines
111 * are on the same y location.
112 *
113 * @param first The first view
114 * @param second The second view
115 */
116 static public void assertBaselineAligned(View first, View second) {
117 int[] xy = new int[2];
118 first.getLocationOnScreen(xy);
119 int firstTop = xy[1] + first.getBaseline();
120
121 second.getLocationOnScreen(xy);
122 int secondTop = xy[1] + second.getBaseline();
123
124 assertEquals("views are not baseline aligned", firstTop, secondTop);
125 }
126
127 /**
128 * Assert that two views are right aligned, that is that their right edges
129 * are on the same x location.
130 *
131 * @param first The first view
132 * @param second The second view
133 */
134 static public void assertRightAligned(View first, View second) {
135 int[] xy = new int[2];
136 first.getLocationOnScreen(xy);
137 int firstRight = xy[0] + first.getMeasuredWidth();
138
139 second.getLocationOnScreen(xy);
140 int secondRight = xy[0] + second.getMeasuredWidth();
141
142 assertEquals("views are not right aligned", firstRight, secondRight);
143 }
144
145 /**
146 * Assert that two views are right aligned, that is that their right edges
147 * are on the same x location, with respect to the specified margin.
148 *
149 * @param first The first view
150 * @param second The second view
151 * @param margin The margin between the first view and the second view
152 */
153 static public void assertRightAligned(View first, View second, int margin) {
154 int[] xy = new int[2];
155 first.getLocationOnScreen(xy);
156 int firstRight = xy[0] + first.getMeasuredWidth();
157
158 second.getLocationOnScreen(xy);
159 int secondRight = xy[0] + second.getMeasuredWidth();
160
161 assertEquals("views are not right aligned", Math.abs(firstRight - secondRight), margin);
162 }
163
164 /**
165 * Assert that two views are left aligned, that is that their left edges
166 * are on the same x location.
167 *
168 * @param first The first view
169 * @param second The second view
170 */
171 static public void assertLeftAligned(View first, View second) {
172 int[] xy = new int[2];
173 first.getLocationOnScreen(xy);
174 int firstLeft = xy[0];
175
176 second.getLocationOnScreen(xy);
177 int secondLeft = xy[0];
178
179 assertEquals("views are not left aligned", firstLeft, secondLeft);
180 }
181
182 /**
183 * Assert that two views are left aligned, that is that their left edges
184 * are on the same x location, with respect to the specified margin.
185 *
186 * @param first The first view
187 * @param second The second view
188 * @param margin The margin between the first view and the second view
189 */
190 static public void assertLeftAligned(View first, View second, int margin) {
191 int[] xy = new int[2];
192 first.getLocationOnScreen(xy);
193 int firstLeft = xy[0];
194
195 second.getLocationOnScreen(xy);
196 int secondLeft = xy[0];
197
198 assertEquals("views are not left aligned", Math.abs(firstLeft - secondLeft), margin);
199 }
200
201 /**
202 * Assert that two views are bottom aligned, that is that their bottom edges
203 * are on the same y location.
204 *
205 * @param first The first view
206 * @param second The second view
207 */
208 static public void assertBottomAligned(View first, View second) {
209 int[] xy = new int[2];
210 first.getLocationOnScreen(xy);
211 int firstBottom = xy[1] + first.getMeasuredHeight();
212
213 second.getLocationOnScreen(xy);
214 int secondBottom = xy[1] + second.getMeasuredHeight();
215
216 assertEquals("views are not bottom aligned", firstBottom, secondBottom);
217 }
218
219 /**
220 * Assert that two views are bottom aligned, that is that their bottom edges
221 * are on the same y location, with respect to the specified margin.
222 *
223 * @param first The first view
224 * @param second The second view
225 * @param margin The margin between the first view and the second view
226 */
227 static public void assertBottomAligned(View first, View second, int margin) {
228 int[] xy = new int[2];
229 first.getLocationOnScreen(xy);
230 int firstBottom = xy[1] + first.getMeasuredHeight();
231
232 second.getLocationOnScreen(xy);
233 int secondBottom = xy[1] + second.getMeasuredHeight();
234
235 assertEquals("views are not bottom aligned", Math.abs(firstBottom - secondBottom), margin);
236 }
237
238 /**
239 * Assert that two views are top aligned, that is that their top edges
240 * are on the same y location.
241 *
242 * @param first The first view
243 * @param second The second view
244 */
245 static public void assertTopAligned(View first, View second) {
246 int[] xy = new int[2];
247 first.getLocationOnScreen(xy);
248 int firstTop = xy[1];
249
250 second.getLocationOnScreen(xy);
251 int secondTop = xy[1];
252
253 assertEquals("views are not top aligned", firstTop, secondTop);
254 }
255
256 /**
257 * Assert that two views are top aligned, that is that their top edges
258 * are on the same y location, with respect to the specified margin.
259 *
260 * @param first The first view
261 * @param second The second view
262 * @param margin The margin between the first view and the second view
263 */
264 static public void assertTopAligned(View first, View second, int margin) {
265 int[] xy = new int[2];
266 first.getLocationOnScreen(xy);
267 int firstTop = xy[1];
268
269 second.getLocationOnScreen(xy);
270 int secondTop = xy[1];
271
272 assertEquals("views are not top aligned", Math.abs(firstTop - secondTop), margin);
273 }
274
275 /**
276 * Assert that the <code>test</code> view is horizontally center aligned
277 * with respect to the <code>reference</code> view.
278 *
279 * @param reference The reference view
280 * @param test The view that should be center aligned with the reference view
281 */
282 static public void assertHorizontalCenterAligned(View reference, View test) {
283 int[] xy = new int[2];
284 reference.getLocationOnScreen(xy);
285 int referenceLeft = xy[0];
286
287 test.getLocationOnScreen(xy);
288 int testLeft = xy[0];
289
290 int center = (reference.getMeasuredWidth() - test.getMeasuredWidth()) / 2;
291 int delta = testLeft - referenceLeft;
292
293 assertEquals("views are not horizontally center aligned", center, delta);
294 }
295
296 /**
297 * Assert that the <code>test</code> view is vertically center aligned
298 * with respect to the <code>reference</code> view.
299 *
300 * @param reference The reference view
301 * @param test The view that should be center aligned with the reference view
302 */
303 static public void assertVerticalCenterAligned(View reference, View test) {
304 int[] xy = new int[2];
305 reference.getLocationOnScreen(xy);
306 int referenceTop = xy[1];
307
308 test.getLocationOnScreen(xy);
309 int testTop = xy[1];
310
311 int center = (reference.getMeasuredHeight() - test.getMeasuredHeight()) / 2;
312 int delta = testTop - referenceTop;
313
314 assertEquals("views are not vertically center aligned", center, delta);
315 }
316
317 /**
318 * Assert the specified group's integrity. The children count should be >= 0 and each
319 * child should be non-null.
320 *
321 * @param parent The group whose integrity to check
322 */
323 static public void assertGroupIntegrity(ViewGroup parent) {
324 final int count = parent.getChildCount();
325 assertTrue("child count should be >= 0", count >= 0);
326
327 for (int i = 0; i < count; i++) {
328 assertNotNull("group should not contain null children", parent.getChildAt(i));
329 assertSame(parent, parent.getChildAt(i).getParent());
330 }
331 }
332
333 /**
334 * Assert that the specified group contains a specific child once and only once.
335 *
336 * @param parent The group
337 * @param child The child that should belong to group
338 */
339 static public void assertGroupContains(ViewGroup parent, View child) {
340 final int count = parent.getChildCount();
341 assertTrue("Child count should be >= 0", count >= 0);
342
343 boolean found = false;
344 for (int i = 0; i < count; i++) {
345 if (parent.getChildAt(i) == child) {
346 if (!found) {
347 found = true;
348 } else {
349 assertTrue("child " + child + " is duplicated in parent", false);
350 }
351 }
352 }
353
354 assertTrue("group does not contain " + child, found);
355 }
356
357 /**
358 * Assert that the specified group does not contain a specific child.
359 *
360 * @param parent The group
361 * @param child The child that should not belong to group
362 */
363 static public void assertGroupNotContains(ViewGroup parent, View child) {
364 final int count = parent.getChildCount();
365 assertTrue("Child count should be >= 0", count >= 0);
366
367 for (int i = 0; i < count; i++) {
368 if (parent.getChildAt(i) == child) {
369 assertTrue("child " + child + " is found in parent", false);
370 }
371 }
372 }
373}