| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.test; |
| |
| import static junit.framework.Assert.*; |
| |
| import android.view.View; |
| import android.view.ViewGroup; |
| |
| /** |
| * Some useful assertions about views. |
| */ |
| public class ViewAsserts { |
| |
| private ViewAsserts() {} |
| |
| /** |
| * Assert that view is on the screen. |
| * @param origin The root view of the screen. |
| * @param view The view. |
| */ |
| static public void assertOnScreen(View origin, View view) { |
| int[] xy = new int[2]; |
| view.getLocationOnScreen(xy); |
| |
| int[] xyRoot = new int[2]; |
| origin.getLocationOnScreen(xyRoot); |
| |
| int y = xy[1] - xyRoot[1]; |
| |
| assertTrue("view should have positive y coordinate on screen", |
| y >= 0); |
| |
| assertTrue("view should have y location on screen less than drawing " |
| + "height of root view", |
| y <= view.getRootView().getHeight()); |
| } |
| |
| /** |
| * Assert that view is below the visible screen. |
| * @param origin The root view of the screen. |
| * @param view The view |
| */ |
| static public void assertOffScreenBelow(View origin, View view) { |
| int[] xy = new int[2]; |
| view.getLocationOnScreen(xy); |
| |
| int[] xyRoot = new int[2]; |
| origin.getLocationOnScreen(xyRoot); |
| |
| int y = xy[1] - xyRoot[1]; |
| |
| assertTrue("view should have y location on screen greater than drawing " |
| + "height of origen view (" + y + " is not greater than " |
| + origin.getHeight() + ")", |
| y > origin.getHeight()); |
| } |
| |
| /** |
| * Assert that view is above the visible screen. |
| * @param origin Te root view of the screen. |
| * @param view The view |
| */ |
| static public void assertOffScreenAbove(View origin, View view) { |
| int[] xy = new int[2]; |
| view.getLocationOnScreen(xy); |
| |
| int[] xyRoot = new int[2]; |
| origin.getLocationOnScreen(xyRoot); |
| |
| int y = xy[1] - xyRoot[1]; |
| |
| assertTrue("view should have y location less than that of origin view", |
| y < 0); |
| } |
| |
| /** |
| * Assert that a view has a particular x and y position on the visible screen. |
| * @param origin The root view of the screen. |
| * @param view The view. |
| * @param x The expected x coordinate. |
| * @param y The expected y coordinate. |
| */ |
| static public void assertHasScreenCoordinates(View origin, View view, int x, int y) { |
| int[] xy = new int[2]; |
| view.getLocationOnScreen(xy); |
| |
| int[] xyRoot = new int[2]; |
| origin.getLocationOnScreen(xyRoot); |
| |
| assertEquals("x coordinate", x, xy[0] - xyRoot[0]); |
| assertEquals("y coordinate", y, xy[1] - xyRoot[1]); |
| } |
| |
| /** |
| * Assert that two views are aligned on their baseline, that is that their baselines |
| * are on the same y location. |
| * |
| * @param first The first view |
| * @param second The second view |
| */ |
| static public void assertBaselineAligned(View first, View second) { |
| int[] xy = new int[2]; |
| first.getLocationOnScreen(xy); |
| int firstTop = xy[1] + first.getBaseline(); |
| |
| second.getLocationOnScreen(xy); |
| int secondTop = xy[1] + second.getBaseline(); |
| |
| assertEquals("views are not baseline aligned", firstTop, secondTop); |
| } |
| |
| /** |
| * Assert that two views are right aligned, that is that their right edges |
| * are on the same x location. |
| * |
| * @param first The first view |
| * @param second The second view |
| */ |
| static public void assertRightAligned(View first, View second) { |
| int[] xy = new int[2]; |
| first.getLocationOnScreen(xy); |
| int firstRight = xy[0] + first.getMeasuredWidth(); |
| |
| second.getLocationOnScreen(xy); |
| int secondRight = xy[0] + second.getMeasuredWidth(); |
| |
| assertEquals("views are not right aligned", firstRight, secondRight); |
| } |
| |
| /** |
| * Assert that two views are right aligned, that is that their right edges |
| * are on the same x location, with respect to the specified margin. |
| * |
| * @param first The first view |
| * @param second The second view |
| * @param margin The margin between the first view and the second view |
| */ |
| static public void assertRightAligned(View first, View second, int margin) { |
| int[] xy = new int[2]; |
| first.getLocationOnScreen(xy); |
| int firstRight = xy[0] + first.getMeasuredWidth(); |
| |
| second.getLocationOnScreen(xy); |
| int secondRight = xy[0] + second.getMeasuredWidth(); |
| |
| assertEquals("views are not right aligned", Math.abs(firstRight - secondRight), margin); |
| } |
| |
| /** |
| * Assert that two views are left aligned, that is that their left edges |
| * are on the same x location. |
| * |
| * @param first The first view |
| * @param second The second view |
| */ |
| static public void assertLeftAligned(View first, View second) { |
| int[] xy = new int[2]; |
| first.getLocationOnScreen(xy); |
| int firstLeft = xy[0]; |
| |
| second.getLocationOnScreen(xy); |
| int secondLeft = xy[0]; |
| |
| assertEquals("views are not left aligned", firstLeft, secondLeft); |
| } |
| |
| /** |
| * Assert that two views are left aligned, that is that their left edges |
| * are on the same x location, with respect to the specified margin. |
| * |
| * @param first The first view |
| * @param second The second view |
| * @param margin The margin between the first view and the second view |
| */ |
| static public void assertLeftAligned(View first, View second, int margin) { |
| int[] xy = new int[2]; |
| first.getLocationOnScreen(xy); |
| int firstLeft = xy[0]; |
| |
| second.getLocationOnScreen(xy); |
| int secondLeft = xy[0]; |
| |
| assertEquals("views are not left aligned", Math.abs(firstLeft - secondLeft), margin); |
| } |
| |
| /** |
| * Assert that two views are bottom aligned, that is that their bottom edges |
| * are on the same y location. |
| * |
| * @param first The first view |
| * @param second The second view |
| */ |
| static public void assertBottomAligned(View first, View second) { |
| int[] xy = new int[2]; |
| first.getLocationOnScreen(xy); |
| int firstBottom = xy[1] + first.getMeasuredHeight(); |
| |
| second.getLocationOnScreen(xy); |
| int secondBottom = xy[1] + second.getMeasuredHeight(); |
| |
| assertEquals("views are not bottom aligned", firstBottom, secondBottom); |
| } |
| |
| /** |
| * Assert that two views are bottom aligned, that is that their bottom edges |
| * are on the same y location, with respect to the specified margin. |
| * |
| * @param first The first view |
| * @param second The second view |
| * @param margin The margin between the first view and the second view |
| */ |
| static public void assertBottomAligned(View first, View second, int margin) { |
| int[] xy = new int[2]; |
| first.getLocationOnScreen(xy); |
| int firstBottom = xy[1] + first.getMeasuredHeight(); |
| |
| second.getLocationOnScreen(xy); |
| int secondBottom = xy[1] + second.getMeasuredHeight(); |
| |
| assertEquals("views are not bottom aligned", Math.abs(firstBottom - secondBottom), margin); |
| } |
| |
| /** |
| * Assert that two views are top aligned, that is that their top edges |
| * are on the same y location. |
| * |
| * @param first The first view |
| * @param second The second view |
| */ |
| static public void assertTopAligned(View first, View second) { |
| int[] xy = new int[2]; |
| first.getLocationOnScreen(xy); |
| int firstTop = xy[1]; |
| |
| second.getLocationOnScreen(xy); |
| int secondTop = xy[1]; |
| |
| assertEquals("views are not top aligned", firstTop, secondTop); |
| } |
| |
| /** |
| * Assert that two views are top aligned, that is that their top edges |
| * are on the same y location, with respect to the specified margin. |
| * |
| * @param first The first view |
| * @param second The second view |
| * @param margin The margin between the first view and the second view |
| */ |
| static public void assertTopAligned(View first, View second, int margin) { |
| int[] xy = new int[2]; |
| first.getLocationOnScreen(xy); |
| int firstTop = xy[1]; |
| |
| second.getLocationOnScreen(xy); |
| int secondTop = xy[1]; |
| |
| assertEquals("views are not top aligned", Math.abs(firstTop - secondTop), margin); |
| } |
| |
| /** |
| * Assert that the <code>test</code> view is horizontally center aligned |
| * with respect to the <code>reference</code> view. |
| * |
| * @param reference The reference view |
| * @param test The view that should be center aligned with the reference view |
| */ |
| static public void assertHorizontalCenterAligned(View reference, View test) { |
| int[] xy = new int[2]; |
| reference.getLocationOnScreen(xy); |
| int referenceLeft = xy[0]; |
| |
| test.getLocationOnScreen(xy); |
| int testLeft = xy[0]; |
| |
| int center = (reference.getMeasuredWidth() - test.getMeasuredWidth()) / 2; |
| int delta = testLeft - referenceLeft; |
| |
| assertEquals("views are not horizontally center aligned", center, delta); |
| } |
| |
| /** |
| * Assert that the <code>test</code> view is vertically center aligned |
| * with respect to the <code>reference</code> view. |
| * |
| * @param reference The reference view |
| * @param test The view that should be center aligned with the reference view |
| */ |
| static public void assertVerticalCenterAligned(View reference, View test) { |
| int[] xy = new int[2]; |
| reference.getLocationOnScreen(xy); |
| int referenceTop = xy[1]; |
| |
| test.getLocationOnScreen(xy); |
| int testTop = xy[1]; |
| |
| int center = (reference.getMeasuredHeight() - test.getMeasuredHeight()) / 2; |
| int delta = testTop - referenceTop; |
| |
| assertEquals("views are not vertically center aligned", center, delta); |
| } |
| |
| /** |
| * Assert the specified group's integrity. The children count should be >= 0 and each |
| * child should be non-null. |
| * |
| * @param parent The group whose integrity to check |
| */ |
| static public void assertGroupIntegrity(ViewGroup parent) { |
| final int count = parent.getChildCount(); |
| assertTrue("child count should be >= 0", count >= 0); |
| |
| for (int i = 0; i < count; i++) { |
| assertNotNull("group should not contain null children", parent.getChildAt(i)); |
| assertSame(parent, parent.getChildAt(i).getParent()); |
| } |
| } |
| |
| /** |
| * Assert that the specified group contains a specific child once and only once. |
| * |
| * @param parent The group |
| * @param child The child that should belong to group |
| */ |
| static public void assertGroupContains(ViewGroup parent, View child) { |
| final int count = parent.getChildCount(); |
| assertTrue("Child count should be >= 0", count >= 0); |
| |
| boolean found = false; |
| for (int i = 0; i < count; i++) { |
| if (parent.getChildAt(i) == child) { |
| if (!found) { |
| found = true; |
| } else { |
| assertTrue("child " + child + " is duplicated in parent", false); |
| } |
| } |
| } |
| |
| assertTrue("group does not contain " + child, found); |
| } |
| |
| /** |
| * Assert that the specified group does not contain a specific child. |
| * |
| * @param parent The group |
| * @param child The child that should not belong to group |
| */ |
| static public void assertGroupNotContains(ViewGroup parent, View child) { |
| final int count = parent.getChildCount(); |
| assertTrue("Child count should be >= 0", count >= 0); |
| |
| for (int i = 0; i < count; i++) { |
| if (parent.getChildAt(i) == child) { |
| assertTrue("child " + child + " is found in parent", false); |
| } |
| } |
| } |
| } |