summaryrefslogtreecommitdiffstats
path: root/tests/src/com/android/gallery3d/ui/GLViewTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/com/android/gallery3d/ui/GLViewTest.java')
-rw-r--r--tests/src/com/android/gallery3d/ui/GLViewTest.java398
1 files changed, 398 insertions, 0 deletions
diff --git a/tests/src/com/android/gallery3d/ui/GLViewTest.java b/tests/src/com/android/gallery3d/ui/GLViewTest.java
new file mode 100644
index 000000000..b17b25440
--- /dev/null
+++ b/tests/src/com/android/gallery3d/ui/GLViewTest.java
@@ -0,0 +1,398 @@
+/*
+ * Copyright (C) 2010 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 com.android.gallery3d.ui;
+
+import android.graphics.Rect;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.MotionEvent;
+
+import junit.framework.TestCase;
+
+@SmallTest
+public class GLViewTest extends TestCase {
+ @SuppressWarnings("unused")
+ private static final String TAG = "GLViewTest";
+
+ @SmallTest
+ public void testVisibility() {
+ GLViewMock a = new GLViewMock();
+ assertEquals(GLView.VISIBLE, a.getVisibility());
+ assertEquals(0, a.mOnVisibilityChangedCalled);
+ a.setVisibility(GLView.INVISIBLE);
+ assertEquals(GLView.INVISIBLE, a.getVisibility());
+ assertEquals(1, a.mOnVisibilityChangedCalled);
+ a.setVisibility(GLView.VISIBLE);
+ assertEquals(GLView.VISIBLE, a.getVisibility());
+ assertEquals(2, a.mOnVisibilityChangedCalled);
+ }
+
+ @SmallTest
+ public void testComponents() {
+ GLView view = new GLView();
+ assertEquals(0, view.getComponentCount());
+ try {
+ view.getComponent(0);
+ fail();
+ } catch (IndexOutOfBoundsException ex) {
+ // expected
+ }
+
+ GLView x = new GLView();
+ GLView y = new GLView();
+ view.addComponent(x);
+ view.addComponent(y);
+ assertEquals(2, view.getComponentCount());
+ assertSame(x, view.getComponent(0));
+ assertSame(y, view.getComponent(1));
+ view.removeComponent(x);
+ assertSame(y, view.getComponent(0));
+ try {
+ view.getComponent(1);
+ fail();
+ } catch (IndexOutOfBoundsException ex) {
+ // expected
+ }
+ try {
+ view.addComponent(y);
+ fail();
+ } catch (IllegalStateException ex) {
+ // expected
+ }
+ view.addComponent(x);
+ view.removeAllComponents();
+ assertEquals(0, view.getComponentCount());
+ }
+
+ @SmallTest
+ public void testBounds() {
+ GLView view = new GLView();
+
+ assertEquals(0, view.getWidth());
+ assertEquals(0, view.getHeight());
+
+ Rect b = view.bounds();
+ assertEquals(0, b.left);
+ assertEquals(0, b.top);
+ assertEquals(0, b.right);
+ assertEquals(0, b.bottom);
+
+ view.layout(10, 20, 30, 100);
+ assertEquals(20, view.getWidth());
+ assertEquals(80, view.getHeight());
+
+ b = view.bounds();
+ assertEquals(10, b.left);
+ assertEquals(20, b.top);
+ assertEquals(30, b.right);
+ assertEquals(100, b.bottom);
+ }
+
+ @SmallTest
+ public void testParent() {
+ GLView a = new GLView();
+ GLView b = new GLView();
+ assertNull(b.mParent);
+ a.addComponent(b);
+ assertSame(a, b.mParent);
+ a.removeComponent(b);
+ assertNull(b.mParent);
+ }
+
+ @SmallTest
+ public void testRoot() {
+ GLViewMock a = new GLViewMock();
+ GLViewMock b = new GLViewMock();
+ GLRoot r = new GLRootStub();
+ GLRoot r2 = new GLRootStub();
+ a.addComponent(b);
+
+ // Attach to root r
+ assertEquals(0, a.mOnAttachCalled);
+ assertEquals(0, b.mOnAttachCalled);
+ a.attachToRoot(r);
+ assertEquals(1, a.mOnAttachCalled);
+ assertEquals(1, b.mOnAttachCalled);
+ assertSame(r, a.getGLRoot());
+ assertSame(r, b.getGLRoot());
+
+ // Detach from r
+ assertEquals(0, a.mOnDetachCalled);
+ assertEquals(0, b.mOnDetachCalled);
+ a.detachFromRoot();
+ assertEquals(1, a.mOnDetachCalled);
+ assertEquals(1, b.mOnDetachCalled);
+
+ // Attach to another root r2
+ assertEquals(1, a.mOnAttachCalled);
+ assertEquals(1, b.mOnAttachCalled);
+ a.attachToRoot(r2);
+ assertEquals(2, a.mOnAttachCalled);
+ assertEquals(2, b.mOnAttachCalled);
+ assertSame(r2, a.getGLRoot());
+ assertSame(r2, b.getGLRoot());
+
+ // Detach from r2
+ assertEquals(1, a.mOnDetachCalled);
+ assertEquals(1, b.mOnDetachCalled);
+ a.detachFromRoot();
+ assertEquals(2, a.mOnDetachCalled);
+ assertEquals(2, b.mOnDetachCalled);
+ }
+
+ @SmallTest
+ public void testRoot2() {
+ GLView a = new GLViewMock();
+ GLViewMock b = new GLViewMock();
+ GLRoot r = new GLRootStub();
+
+ a.attachToRoot(r);
+
+ assertEquals(0, b.mOnAttachCalled);
+ a.addComponent(b);
+ assertEquals(1, b.mOnAttachCalled);
+
+ assertEquals(0, b.mOnDetachCalled);
+ a.removeComponent(b);
+ assertEquals(1, b.mOnDetachCalled);
+ }
+
+ @SmallTest
+ public void testInvalidate() {
+ GLView a = new GLView();
+ GLRootMock r = new GLRootMock();
+ a.attachToRoot(r);
+ assertEquals(0, r.mRequestRenderCalled);
+ a.invalidate();
+ assertEquals(1, r.mRequestRenderCalled);
+ }
+
+ @SmallTest
+ public void testRequestLayout() {
+ GLView a = new GLView();
+ GLView b = new GLView();
+ GLRootMock r = new GLRootMock();
+ a.attachToRoot(r);
+ a.addComponent(b);
+ assertEquals(0, r.mRequestLayoutContentPaneCalled);
+ b.requestLayout();
+ assertEquals(1, r.mRequestLayoutContentPaneCalled);
+ }
+
+ @SmallTest
+ public void testLayout() {
+ GLViewMock a = new GLViewMock();
+ GLViewMock b = new GLViewMock();
+ GLViewMock c = new GLViewMock();
+ GLRootMock r = new GLRootMock();
+
+ a.attachToRoot(r);
+ a.addComponent(b);
+ a.addComponent(c);
+
+ assertEquals(0, a.mOnLayoutCalled);
+ a.layout(10, 20, 60, 100);
+ assertEquals(1, a.mOnLayoutCalled);
+ assertEquals(1, b.mOnLayoutCalled);
+ assertEquals(1, c.mOnLayoutCalled);
+ assertTrue(a.mOnLayoutChangeSize);
+ assertTrue(b.mOnLayoutChangeSize);
+ assertTrue(c.mOnLayoutChangeSize);
+
+ // same size should not trigger onLayout
+ a.layout(10, 20, 60, 100);
+ assertEquals(1, a.mOnLayoutCalled);
+
+ // unless someone requested it, but only those on the path
+ // to the requester.
+ assertEquals(0, r.mRequestLayoutContentPaneCalled);
+ b.requestLayout();
+ a.layout(10, 20, 60, 100);
+ assertEquals(1, r.mRequestLayoutContentPaneCalled);
+ assertEquals(2, a.mOnLayoutCalled);
+ assertEquals(2, b.mOnLayoutCalled);
+ assertEquals(1, c.mOnLayoutCalled);
+ }
+
+ @SmallTest
+ public void testRender() {
+ GLViewMock a = new GLViewMock();
+ GLViewMock b = new GLViewMock();
+
+ a.addComponent(b);
+ GLCanvasStub canvas = new GLCanvasStub();
+ assertEquals(0, a.mRenderBackgroundCalled);
+ assertEquals(0, b.mRenderBackgroundCalled);
+ a.render(canvas);
+ assertEquals(1, a.mRenderBackgroundCalled);
+ assertEquals(1, b.mRenderBackgroundCalled);
+ }
+
+ @SmallTest
+ public void testMeasure() {
+ GLViewMock a = new GLViewMock();
+ GLViewMock b = new GLViewMock();
+ GLViewMock c = new GLViewMock();
+ GLRootMock r = new GLRootMock();
+
+ a.addComponent(b);
+ a.addComponent(c);
+ a.attachToRoot(r);
+
+ assertEquals(0, a.mOnMeasureCalled);
+ a.measure(100, 200);
+ assertEquals(1, a.mOnMeasureCalled);
+ assertEquals(1, b.mOnMeasureCalled);
+ assertEquals(100, a.mOnMeasureWidthSpec);
+ assertEquals(200, a.mOnMeasureHeightSpec);
+ assertEquals(100, b.mOnMeasureWidthSpec);
+ assertEquals(200, b.mOnMeasureHeightSpec);
+ assertEquals(100, a.getMeasuredWidth());
+ assertEquals(200, b.getMeasuredHeight());
+
+ // same spec should not trigger onMeasure
+ a.measure(100, 200);
+ assertEquals(1, a.mOnMeasureCalled);
+
+ // unless someone requested it, but only those on the path
+ // to the requester.
+ b.requestLayout();
+ a.measure(100, 200);
+ assertEquals(2, a.mOnMeasureCalled);
+ assertEquals(2, b.mOnMeasureCalled);
+ assertEquals(1, c.mOnMeasureCalled);
+ }
+
+ class MyGLView extends GLView {
+ private int mWidth;
+ int mOnTouchCalled;
+ int mOnTouchX;
+ int mOnTouchY;
+ int mOnTouchAction;
+
+ public MyGLView(int width) {
+ mWidth = width;
+ }
+
+ @Override
+ protected void onLayout(boolean changeSize, int left, int top,
+ int right, int bottom) {
+ // layout children from left to right
+ // call children's layout.
+ int x = 0;
+ for (int i = 0, n = getComponentCount(); i < n; ++i) {
+ GLView item = getComponent(i);
+ item.measure(0, 0);
+ int w = item.getMeasuredWidth();
+ int h = item.getMeasuredHeight();
+ item.layout(x, 0, x + w, h);
+ x += w;
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthSpec, int heightSpec) {
+ setMeasuredSize(mWidth, 100);
+ }
+
+ @Override
+ protected boolean onTouch(MotionEvent event) {
+ mOnTouchCalled++;
+ mOnTouchX = (int) event.getX();
+ mOnTouchY = (int) event.getY();
+ mOnTouchAction = event.getAction();
+ return true;
+ }
+ }
+
+ private MotionEvent NewMotionEvent(int action, int x, int y) {
+ return MotionEvent.obtain(0, 0, action, x, y, 0);
+ }
+
+ @SmallTest
+ public void testTouchEvent() {
+ // We construct a tree with four nodes. Only the x coordinate is used:
+ // A = [0..............................300)
+ // B = [0......100)
+ // C = [100......200)
+ // D = [100..150)
+
+ MyGLView a = new MyGLView(300);
+ MyGLView b = new MyGLView(100);
+ MyGLView c = new MyGLView(100);
+ MyGLView d = new MyGLView(50);
+ GLRoot r = new GLRootStub();
+
+ a.addComponent(b);
+ a.addComponent(c);
+ c.addComponent(d);
+ a.attachToRoot(r);
+ a.layout(0, 0, 300, 100);
+
+ int DOWN = MotionEvent.ACTION_DOWN;
+ int UP = MotionEvent.ACTION_UP;
+ int MOVE = MotionEvent.ACTION_MOVE;
+ int CANCEL = MotionEvent.ACTION_CANCEL;
+
+ // simple case
+ assertEquals(0, a.mOnTouchCalled);
+ a.dispatchTouchEvent(NewMotionEvent(DOWN, 250, 0));
+ assertEquals(DOWN, a.mOnTouchAction);
+ a.dispatchTouchEvent(NewMotionEvent(UP, 250, 0));
+ assertEquals(UP, a.mOnTouchAction);
+ assertEquals(2, a.mOnTouchCalled);
+
+ // pass to a child, check the location is offseted.
+ assertEquals(0, c.mOnTouchCalled);
+ a.dispatchTouchEvent(NewMotionEvent(DOWN, 175, 0));
+ a.dispatchTouchEvent(NewMotionEvent(UP, 175, 0));
+ assertEquals(75, c.mOnTouchX);
+ assertEquals(0, c.mOnTouchY);
+ assertEquals(2, c.mOnTouchCalled);
+ assertEquals(2, a.mOnTouchCalled);
+
+ // motion target cancel event
+ assertEquals(0, d.mOnTouchCalled);
+ a.dispatchTouchEvent(NewMotionEvent(DOWN, 125, 0));
+ assertEquals(1, d.mOnTouchCalled);
+ a.dispatchTouchEvent(NewMotionEvent(MOVE, 250, 0));
+ assertEquals(2, d.mOnTouchCalled);
+ a.dispatchTouchEvent(NewMotionEvent(MOVE, 50, 0));
+ assertEquals(3, d.mOnTouchCalled);
+ a.dispatchTouchEvent(NewMotionEvent(DOWN, 175, 0));
+ assertEquals(4, d.mOnTouchCalled);
+ assertEquals(CANCEL, d.mOnTouchAction);
+ assertEquals(3, c.mOnTouchCalled);
+ assertEquals(DOWN, c.mOnTouchAction);
+ a.dispatchTouchEvent(NewMotionEvent(UP, 175, 0));
+
+ // motion target is removed
+ assertEquals(4, d.mOnTouchCalled);
+ a.dispatchTouchEvent(NewMotionEvent(DOWN, 125, 0));
+ assertEquals(5, d.mOnTouchCalled);
+ a.removeComponent(c);
+ assertEquals(6, d.mOnTouchCalled);
+ assertEquals(CANCEL, d.mOnTouchAction);
+
+ // invisible component should not get events
+ assertEquals(2, a.mOnTouchCalled);
+ assertEquals(0, b.mOnTouchCalled);
+ b.setVisibility(GLView.INVISIBLE);
+ a.dispatchTouchEvent(NewMotionEvent(DOWN, 50, 0));
+ assertEquals(3, a.mOnTouchCalled);
+ assertEquals(0, b.mOnTouchCalled);
+ }
+}