summaryrefslogtreecommitdiffstats
path: root/core/tests
diff options
context:
space:
mode:
authorYohei Yukawa <yukawa@google.com>2014-05-06 21:22:49 +0900
committerYohei Yukawa <yukawa@google.com>2014-05-09 19:17:15 +0900
commitc2ddd6023688db5ecf6c586e05f55e262b4a802e (patch)
tree9b2346a046d3195dca8caadf57e9f88aaffeacac /core/tests
parent86e80290792b3a259dc6db7958a2f7ace7f9c6e4 (diff)
downloadframeworks_base-c2ddd6023688db5ecf6c586e05f55e262b4a802e.zip
frameworks_base-c2ddd6023688db5ecf6c586e05f55e262b4a802e.tar.gz
frameworks_base-c2ddd6023688db5ecf6c586e05f55e262b4a802e.tar.bz2
Introduce new API for floating window support
This CL introduces a new API IMM#updateCursorAnchorInfo for floating window support. BUG: 14579622 Change-Id: I61dec2f8fa671ba891da1d4af08975750e3acb04
Diffstat (limited to 'core/tests')
-rwxr-xr-xcore/tests/inputmethodtests/run_core_inputmethod_test.sh2
-rw-r--r--core/tests/inputmethodtests/src/android/os/CursorAnchorInfoTest.java164
-rw-r--r--core/tests/inputmethodtests/src/android/os/SparseRectFArrayTest.java233
3 files changed, 398 insertions, 1 deletions
diff --git a/core/tests/inputmethodtests/run_core_inputmethod_test.sh b/core/tests/inputmethodtests/run_core_inputmethod_test.sh
index 9029ba5..e0f4f6d 100755
--- a/core/tests/inputmethodtests/run_core_inputmethod_test.sh
+++ b/core/tests/inputmethodtests/run_core_inputmethod_test.sh
@@ -21,4 +21,4 @@ if [[ $rebuild == true ]]; then
$COMMAND
fi
-adb shell am instrument -w -e class android.os.InputMethodTest,android.os.InputMethodSubtypeArrayTest,android.os.InputMethodSubtypeSwitchingControllerTest com.android.frameworks.coretests.inputmethod/android.test.InstrumentationTestRunner
+adb shell am instrument -w -e class android.os.InputMethodTest,android.os.InputMethodSubtypeArrayTest,android.os.InputMethodSubtypeSwitchingControllerTest,android.os.CursorAnchorInfoTest,android.os.SparseRectFArrayTest com.android.frameworks.coretests.inputmethod/android.test.InstrumentationTestRunner
diff --git a/core/tests/inputmethodtests/src/android/os/CursorAnchorInfoTest.java b/core/tests/inputmethodtests/src/android/os/CursorAnchorInfoTest.java
new file mode 100644
index 0000000..59a6314
--- /dev/null
+++ b/core/tests/inputmethodtests/src/android/os/CursorAnchorInfoTest.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2014 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.os;
+
+import android.graphics.Matrix;
+import android.graphics.RectF;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.CursorAnchorInfo.CursorAnchorInfoBuilder;
+
+public class CursorAnchorInfoTest extends InstrumentationTestCase {
+ // null represents a character that is invisible, for example because it's overlapped by some
+ // other UI elements.
+ private static final RectF[] MANY_RECTS = new RectF[] {
+ null,
+ new RectF(102.0f, 202.0f, 302.0f, 402.0f),
+ new RectF(103.0f, 203.0f, 303.0f, 403.0f),
+ new RectF(104.0f, 204.0f, 304.0f, 404.0f),
+ new RectF(105.0f, 205.0f, 305.0f, 405.0f),
+ new RectF(106.0f, 206.0f, 306.0f, 406.0f),
+ null,
+ new RectF(108.0f, 208.0f, 308.0f, 408.0f),
+ new RectF(109.0f, 209.0f, 309.0f, 409.0f),
+ new RectF(110.0f, 210.0f, 310.0f, 410.0f),
+ new RectF(111.0f, 211.0f, 311.0f, 411.0f),
+ new RectF(112.0f, 212.0f, 312.0f, 412.0f),
+ new RectF(113.0f, 213.0f, 313.0f, 413.0f),
+ new RectF(114.0f, 214.0f, 314.0f, 414.0f),
+ new RectF(115.0f, 215.0f, 315.0f, 415.0f),
+ new RectF(116.0f, 216.0f, 316.0f, 416.0f),
+ new RectF(117.0f, 217.0f, 317.0f, 417.0f),
+ null,
+ null,
+ };
+
+ @SmallTest
+ public void testBuilder() throws Exception {
+ final int SELECTION_START = 30;
+ final int SELECTION_END = 40;
+ final int CANDIDATES_START = 32;
+ final int CANDIDATES_END = 33;
+ final float INSERTION_MARKER_HORIZONTAL = 10.5f;
+ final float INSERTION_MARKER_TOP = 100.1f;
+ final float INSERTION_MARKER_BASELINE = 110.4f;
+ final float INSERTION_MARKER_BOTOM = 111.0f;
+ Matrix TRANSFORM_MATRIX = new Matrix(Matrix.IDENTITY_MATRIX);
+ TRANSFORM_MATRIX.setScale(10.0f, 20.0f);
+
+ final CursorAnchorInfoBuilder builder = new CursorAnchorInfoBuilder();
+ builder.setSelectionRange(SELECTION_START, SELECTION_END)
+ .setCandidateRange(CANDIDATES_START, CANDIDATES_END)
+ .setInsertionMarkerLocation(INSERTION_MARKER_HORIZONTAL, INSERTION_MARKER_TOP,
+ INSERTION_MARKER_BASELINE, INSERTION_MARKER_BOTOM)
+ .setMatrix(TRANSFORM_MATRIX);
+ for (int i = 0; i < MANY_RECTS.length; i++) {
+ final RectF rect = MANY_RECTS[i];
+ if (rect != null) {
+ builder.addCharacterRect(i, rect.left, rect.top, rect.right, rect.bottom);
+ }
+ }
+
+ final CursorAnchorInfo info = builder.build();
+ assertEquals(SELECTION_START, info.getSelectionStart());
+ assertEquals(SELECTION_END, info.getSelectionEnd());
+ assertEquals(CANDIDATES_START, info.getCandidatesStart());
+ assertEquals(CANDIDATES_END, info.getCandidatesEnd());
+ assertEquals(INSERTION_MARKER_HORIZONTAL, info.getInsertionMarkerHorizontal());
+ assertEquals(INSERTION_MARKER_TOP, info.getInsertionMarkerTop());
+ assertEquals(INSERTION_MARKER_BASELINE, info.getInsertionMarkerBaseline());
+ assertEquals(INSERTION_MARKER_BOTOM, info.getInsertionMarkerBottom());
+ assertEquals(TRANSFORM_MATRIX, info.getMatrix());
+ for (int i = 0; i < MANY_RECTS.length; i++) {
+ final RectF rect = MANY_RECTS[i];
+ assertEquals(rect, info.getCharacterRect(i));
+ }
+
+ // Make sure that the builder can reproduce the same object.
+ final CursorAnchorInfo info2 = builder.build();
+ assertEquals(SELECTION_START, info2.getSelectionStart());
+ assertEquals(SELECTION_END, info2.getSelectionEnd());
+ assertEquals(CANDIDATES_START, info2.getCandidatesStart());
+ assertEquals(CANDIDATES_END, info2.getCandidatesEnd());
+ assertEquals(INSERTION_MARKER_HORIZONTAL, info2.getInsertionMarkerHorizontal());
+ assertEquals(INSERTION_MARKER_TOP, info2.getInsertionMarkerTop());
+ assertEquals(INSERTION_MARKER_BASELINE, info2.getInsertionMarkerBaseline());
+ assertEquals(INSERTION_MARKER_BOTOM, info2.getInsertionMarkerBottom());
+ assertEquals(TRANSFORM_MATRIX, info2.getMatrix());
+ for (int i = 0; i < MANY_RECTS.length; i++) {
+ final RectF rect = MANY_RECTS[i];
+ assertEquals(rect, info2.getCharacterRect(i));
+ }
+ assertEquals(info, info2);
+ assertEquals(info.hashCode(), info2.hashCode());
+
+ // Make sure that object can be marshalled via {@link Parsel}.
+ final CursorAnchorInfo info3 = cloneViaParcel(info2);
+ assertEquals(SELECTION_START, info3.getSelectionStart());
+ assertEquals(SELECTION_END, info3.getSelectionEnd());
+ assertEquals(CANDIDATES_START, info3.getCandidatesStart());
+ assertEquals(CANDIDATES_END, info3.getCandidatesEnd());
+ assertEquals(INSERTION_MARKER_HORIZONTAL, info3.getInsertionMarkerHorizontal());
+ assertEquals(INSERTION_MARKER_TOP, info3.getInsertionMarkerTop());
+ assertEquals(INSERTION_MARKER_BASELINE, info3.getInsertionMarkerBaseline());
+ assertEquals(INSERTION_MARKER_BOTOM, info3.getInsertionMarkerBottom());
+ assertEquals(TRANSFORM_MATRIX, info3.getMatrix());
+ for (int i = 0; i < MANY_RECTS.length; i++) {
+ final RectF rect = MANY_RECTS[i];
+ assertEquals(rect, info3.getCharacterRect(i));
+ }
+ assertEquals(info.hashCode(), info3.hashCode());
+
+ builder.reset();
+ final CursorAnchorInfo uninitializedInfo = builder.build();
+ assertEquals(-1, uninitializedInfo.getSelectionStart());
+ assertEquals(-1, uninitializedInfo.getSelectionEnd());
+ assertEquals(-1, uninitializedInfo.getCandidatesStart());
+ assertEquals(-1, uninitializedInfo.getCandidatesEnd());
+ assertEquals(Float.NaN, uninitializedInfo.getInsertionMarkerHorizontal());
+ assertEquals(Float.NaN, uninitializedInfo.getInsertionMarkerTop());
+ assertEquals(Float.NaN, uninitializedInfo.getInsertionMarkerBaseline());
+ assertEquals(Float.NaN, uninitializedInfo.getInsertionMarkerBottom());
+ assertEquals(Matrix.IDENTITY_MATRIX, uninitializedInfo.getMatrix());
+ }
+
+ @SmallTest
+ public void testBuilderAdd() throws Exception {
+ // A negative index should be rejected.
+ try {
+ new CursorAnchorInfoBuilder().addCharacterRect(-1, 0.0f, 0.0f, 0.0f, 0.0f);
+ } catch (IllegalArgumentException ex) {
+ assertTrue(true);
+ }
+ }
+
+ private static CursorAnchorInfo cloneViaParcel(final CursorAnchorInfo src) {
+ Parcel parcel = null;
+ try {
+ parcel = Parcel.obtain();
+ src.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+ return new CursorAnchorInfo(parcel);
+ } finally {
+ if (parcel != null) {
+ parcel.recycle();
+ }
+ }
+ }
+}
+
diff --git a/core/tests/inputmethodtests/src/android/os/SparseRectFArrayTest.java b/core/tests/inputmethodtests/src/android/os/SparseRectFArrayTest.java
new file mode 100644
index 0000000..fae7230
--- /dev/null
+++ b/core/tests/inputmethodtests/src/android/os/SparseRectFArrayTest.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2014 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.os;
+
+import android.graphics.RectF;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.inputmethod.SparseRectFArray;
+import android.view.inputmethod.SparseRectFArray.SparseRectFArrayBuilder;
+
+import java.util.Objects;
+
+public class SparseRectFArrayTest extends InstrumentationTestCase {
+ // A test data for {@link SparseRectFArray}. null represents the gap of indices.
+ private static final RectF[] MANY_RECTS = new RectF[] {
+ null,
+ new RectF(102.0f, 202.0f, 302.0f, 402.0f),
+ new RectF(103.0f, 203.0f, 303.0f, 403.0f),
+ new RectF(104.0f, 204.0f, 304.0f, 404.0f),
+ new RectF(105.0f, 205.0f, 305.0f, 405.0f),
+ new RectF(106.0f, 206.0f, 306.0f, 406.0f),
+ null,
+ new RectF(108.0f, 208.0f, 308.0f, 408.0f),
+ new RectF(109.0f, 209.0f, 309.0f, 409.0f),
+ new RectF(110.0f, 210.0f, 310.0f, 410.0f),
+ new RectF(111.0f, 211.0f, 311.0f, 411.0f),
+ new RectF(112.0f, 212.0f, 312.0f, 412.0f),
+ new RectF(113.0f, 213.0f, 313.0f, 413.0f),
+ new RectF(114.0f, 214.0f, 314.0f, 414.0f),
+ new RectF(115.0f, 215.0f, 315.0f, 415.0f),
+ new RectF(116.0f, 216.0f, 316.0f, 416.0f),
+ new RectF(117.0f, 217.0f, 317.0f, 417.0f),
+ null,
+ null,
+ new RectF(118.0f, 218.0f, 318.0f, 418.0f),
+ };
+
+ @SmallTest
+ public void testBuilder() throws Exception {
+ final RectF TEMP_RECT = new RectF(10.0f, 20.0f, 30.0f, 40.0f);
+
+ final SparseRectFArrayBuilder builder = new SparseRectFArrayBuilder();
+ builder.append(100, TEMP_RECT.left, TEMP_RECT.top, TEMP_RECT.right, TEMP_RECT.bottom);
+ assertNull(builder.build().get(-1));
+ assertNull(builder.build().get(0));
+ assertNull(builder.build().get(99));
+ assertEquals(TEMP_RECT, builder.build().get(100));
+ assertNull(builder.build().get(101));
+
+ // Test if {@link SparseRectFArrayBuilder#reset} resets its internal state.
+ builder.reset();
+ assertNull(builder.build().get(100));
+
+ builder.reset();
+ for (int i = 0; i < MANY_RECTS.length; i++) {
+ final RectF rect = MANY_RECTS[i];
+ if (rect != null) {
+ builder.append(i, rect.left, rect.top, rect.right, rect.bottom);
+ }
+ }
+ final SparseRectFArray array = builder.build();
+ for (int i = 0; i < MANY_RECTS.length; i++) {
+ final RectF rect = MANY_RECTS[i];
+ assertEquals(rect, array.get(i));
+ }
+
+ // Make sure the builder reproduces an equivalent object.
+ final SparseRectFArray array2 = builder.build();
+ for (int i = 0; i < MANY_RECTS.length; i++) {
+ final RectF rect = MANY_RECTS[i];
+ assertEquals(rect, array2.get(i));
+ }
+ assertEqualRects(array, array2);
+
+ // Make sure the instance can be marshaled via {@link Parcel}.
+ final SparseRectFArray array3 = cloneViaParcel(array);
+ for (int i = 0; i < MANY_RECTS.length; i++) {
+ final RectF rect = MANY_RECTS[i];
+ assertEquals(rect, array3.get(i));
+ }
+ assertEqualRects(array, array3);
+
+ // Make sure the builder can be reset.
+ builder.reset();
+ assertNull(builder.build().get(0));
+ }
+
+ @SmallTest
+ public void testEquality() throws Exception {
+ // Empty array should be equal.
+ assertEqualRects(new SparseRectFArrayBuilder().build(),
+ new SparseRectFArrayBuilder().build());
+
+ assertEqualRects(
+ new SparseRectFArrayBuilder().append(100, 1.0f, 2.0f, 3.0f, 4.0f).build(),
+ new SparseRectFArrayBuilder().append(100, 1.0f, 2.0f, 3.0f, 4.0f).build());
+ assertNotEqualRects(
+ new SparseRectFArrayBuilder().append(100, 1.0f, 2.0f, 3.0f, 4.0f).build(),
+ new SparseRectFArrayBuilder().append(100, 2.0f, 2.0f, 3.0f, 4.0f).build());
+ assertNotEqualRects(
+ new SparseRectFArrayBuilder().append(100, 1.0f, 2.0f, 3.0f, 4.0f).build(),
+ new SparseRectFArrayBuilder().append(101, 1.0f, 2.0f, 3.0f, 4.0f).build());
+
+ assertEqualRects(
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(101, 0.0f, 0.0f, 0.0f, 0.0f).build(),
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(101, 0.0f, 0.0f, 0.0f, 0.0f).build());
+ assertNotEqualRects(
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f).build(),
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(101, 0.0f, 0.0f, 0.0f, 0.0f).build());
+ assertNotEqualRects(
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(101, 0.0f, 0.0f, 0.0f, 0.0f).build(),
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f).build());
+ assertNotEqualRects(
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(101, 0.0f, 0.0f, 0.0f, 0.0f).build(),
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(101, 1.0f, 0.0f, 0.0f, 0.0f).build());
+ assertNotEqualRects(
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(101, 1.0f, 0.0f, 0.0f, 0.0f).build(),
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(101, 0.0f, 0.0f, 0.0f, 0.0f).build());
+ assertNotEqualRects(
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(101, 0.0f, 0.0f, 0.0f, 0.0f).build(),
+ new SparseRectFArrayBuilder()
+ .append(100, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(102, 0.0f, 0.0f, 0.0f, 0.0f).build());
+
+ assertEqualRects(
+ new SparseRectFArrayBuilder()
+ .append(1, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(1000, 0.0f, 0.0f, 0.0f, 0.0f)
+ .append(100000000, 0.0f, 0.0f, 0.0f, 0.0f)
+ .build(),
+ new SparseRectFArrayBuilder()
+ .append(1, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(1000, 0.0f, 0.0f, 0.0f, 0.0f)
+ .append(100000000, 0.0f, 0.0f, 0.0f, 0.0f)
+ .build());
+
+ assertNotEqualRects(
+ new SparseRectFArrayBuilder()
+ .append(1, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(1000, 0.0f, 0.0f, 0.0f, 0.0f)
+ .append(100000000, 0.0f, 0.0f, 0.0f, 0.0f)
+ .build(),
+ new SparseRectFArrayBuilder()
+ .append(1, 1.0f, 2.0f, 3.0f, 4.0f)
+ .build());
+ assertNotEqualRects(
+ new SparseRectFArrayBuilder()
+ .append(1, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(1000, 0.0f, 0.0f, 0.0f, 0.0f)
+ .append(100000000, 0.0f, 0.0f, 0.0f, 0.0f)
+ .build(),
+ new SparseRectFArrayBuilder()
+ .append(1, 1.0f, 2.0f, 3.0f, 4.0f)
+ .append(1000, 1.0f, 0.0f, 0.0f, 0.0f)
+ .append(100000000, 0.0f, 0.0f, 0.0f, 0.0f)
+ .build());
+ }
+
+ @SmallTest
+ public void testBuilderAppend() throws Exception {
+ // Key should be appended in ascending order.
+ try {
+ new SparseRectFArrayBuilder().append(10, 0, 0, 0, 0).append(0, 1, 2, 3, 4);
+ } catch (IllegalArgumentException ex) {
+ assertTrue(true);
+ }
+
+ try {
+ new SparseRectFArrayBuilder().append(10, 0, 0, 0, 0).append(10, 1, 2, 3, 4);
+ } catch (IllegalArgumentException ex) {
+ assertTrue(true);
+ }
+ }
+
+ private static void assertEqualRects(SparseRectFArray a, SparseRectFArray b) {
+ assertEquals(a, b);
+ if (a != null && b != null) {
+ assertEquals(a.hashCode(), b.hashCode());
+ }
+ }
+
+ private static void assertNotEqualRects(SparseRectFArray a, SparseRectFArray b) {
+ assertFalse(Objects.equals(a, b));
+ }
+
+ private static SparseRectFArray cloneViaParcel(final SparseRectFArray src) {
+ Parcel parcel = null;
+ try {
+ parcel = Parcel.obtain();
+ src.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+ return new SparseRectFArray(parcel);
+ } finally {
+ if (parcel != null) {
+ parcel.recycle();
+ }
+ }
+ }
+}