1c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa/*
2c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa * Copyright (C) 2014 The Android Open Source Project
3c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa *
4c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa * Licensed under the Apache License, Version 2.0 (the "License");
5c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa * you may not use this file except in compliance with the License.
6c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa * You may obtain a copy of the License at
7c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa *
8c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa *      http://www.apache.org/licenses/LICENSE-2.0
9c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa *
10c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa * Unless required by applicable law or agreed to in writing, software
11c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa * distributed under the License is distributed on an "AS IS" BASIS,
12c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa * See the License for the specific language governing permissions and
14c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa * limitations under the License.
15c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa */
16c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
17c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawapackage android.os;
18c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
19c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawaimport android.graphics.Matrix;
20c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawaimport android.graphics.RectF;
21c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawaimport android.test.InstrumentationTestCase;
22c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawaimport android.test.suitebuilder.annotation.SmallTest;
239a9c112737443e0a4ad0a5054408642ec7b7ee67Yohei Yukawaimport android.text.TextUtils;
24c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawaimport android.view.inputmethod.CursorAnchorInfo;
25c46b5f04aa2a9fd292c117d2824f70fcf06e86baYohei Yukawaimport android.view.inputmethod.CursorAnchorInfo.Builder;
26c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
27eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawaimport java.util.Objects;
28eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa
29a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawaimport static android.view.inputmethod.CursorAnchorInfo.FLAG_HAS_INVISIBLE_REGION;
30a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawaimport static android.view.inputmethod.CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION;
31a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawaimport static android.view.inputmethod.CursorAnchorInfo.FLAG_IS_RTL;
320b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa
33c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawapublic class CursorAnchorInfoTest extends InstrumentationTestCase {
34a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa    private static final RectF[] MANY_BOUNDS = new RectF[] {
350b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa            new RectF(101.0f, 201.0f, 301.0f, 401.0f),
36c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(102.0f, 202.0f, 302.0f, 402.0f),
37c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(103.0f, 203.0f, 303.0f, 403.0f),
38c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(104.0f, 204.0f, 304.0f, 404.0f),
39c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(105.0f, 205.0f, 305.0f, 405.0f),
40c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(106.0f, 206.0f, 306.0f, 406.0f),
410b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa            new RectF(107.0f, 207.0f, 307.0f, 407.0f),
42c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(108.0f, 208.0f, 308.0f, 408.0f),
43c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(109.0f, 209.0f, 309.0f, 409.0f),
44c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(110.0f, 210.0f, 310.0f, 410.0f),
45c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(111.0f, 211.0f, 311.0f, 411.0f),
46c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(112.0f, 212.0f, 312.0f, 412.0f),
47c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(113.0f, 213.0f, 313.0f, 413.0f),
48c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(114.0f, 214.0f, 314.0f, 414.0f),
49c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(115.0f, 215.0f, 315.0f, 415.0f),
50c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(116.0f, 216.0f, 316.0f, 416.0f),
51c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            new RectF(117.0f, 217.0f, 317.0f, 417.0f),
520b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa            new RectF(118.0f, 218.0f, 318.0f, 418.0f),
530b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa            new RectF(119.0f, 219.0f, 319.0f, 419.0f),
540b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa    };
550b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa    private static final int[] MANY_FLAGS_ARRAY = new int[] {
56a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_INVISIBLE_REGION,
57a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_INVISIBLE_REGION | FLAG_HAS_VISIBLE_REGION,
58a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION,
59a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION,
60a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION,
61a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION,
62a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION | FLAG_IS_RTL,
63a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_INVISIBLE_REGION | FLAG_HAS_VISIBLE_REGION | FLAG_IS_RTL,
64a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_INVISIBLE_REGION | FLAG_IS_RTL,
65a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION | FLAG_IS_RTL,
66a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION,
67a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION | FLAG_IS_RTL,
68a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION,
69a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION | FLAG_IS_RTL,
70a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION,
71a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION | FLAG_IS_RTL,
72a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_VISIBLE_REGION,
73a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_INVISIBLE_REGION,
74a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        FLAG_HAS_INVISIBLE_REGION | FLAG_IS_RTL,
75c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa    };
76c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
77c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa    @SmallTest
78c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa    public void testBuilder() throws Exception {
79c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final int SELECTION_START = 30;
80c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final int SELECTION_END = 40;
8181f4cb3f858f46a4d9b793c4d326b9bf6aca868dYohei Yukawa        final int COMPOSING_TEXT_START = 32;
8281f4cb3f858f46a4d9b793c4d326b9bf6aca868dYohei Yukawa        final String COMPOSING_TEXT = "test";
83a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        final int INSERTION_MARKER_FLAGS =
84a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                FLAG_HAS_VISIBLE_REGION | FLAG_HAS_INVISIBLE_REGION | FLAG_IS_RTL;
85c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final float INSERTION_MARKER_HORIZONTAL = 10.5f;
86c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final float INSERTION_MARKER_TOP = 100.1f;
87c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final float INSERTION_MARKER_BASELINE = 110.4f;
88c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final float INSERTION_MARKER_BOTOM = 111.0f;
89a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa
90c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        Matrix TRANSFORM_MATRIX = new Matrix(Matrix.IDENTITY_MATRIX);
91c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        TRANSFORM_MATRIX.setScale(10.0f, 20.0f);
92c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
93c46b5f04aa2a9fd292c117d2824f70fcf06e86baYohei Yukawa        final Builder builder = new Builder();
94c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        builder.setSelectionRange(SELECTION_START, SELECTION_END)
9581f4cb3f858f46a4d9b793c4d326b9bf6aca868dYohei Yukawa                .setComposingText(COMPOSING_TEXT_START, COMPOSING_TEXT)
96c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa                .setInsertionMarkerLocation(INSERTION_MARKER_HORIZONTAL, INSERTION_MARKER_TOP,
97a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_BASELINE, INSERTION_MARKER_BOTOM, INSERTION_MARKER_FLAGS)
98c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa                .setMatrix(TRANSFORM_MATRIX);
99a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        for (int i = 0; i < MANY_BOUNDS.length; i++) {
100a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa            final RectF bounds = MANY_BOUNDS[i];
1010b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa            final int flags = MANY_FLAGS_ARRAY[i];
102a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa            builder.addCharacterBounds(i, bounds.left, bounds.top, bounds.right, bounds.bottom,
103a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                    flags);
104c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        }
105c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
106c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final CursorAnchorInfo info = builder.build();
107c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(SELECTION_START, info.getSelectionStart());
108c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(SELECTION_END, info.getSelectionEnd());
10981f4cb3f858f46a4d9b793c4d326b9bf6aca868dYohei Yukawa        assertEquals(COMPOSING_TEXT_START, info.getComposingTextStart());
1109a9c112737443e0a4ad0a5054408642ec7b7ee67Yohei Yukawa        assertTrue(TextUtils.equals(COMPOSING_TEXT, info.getComposingText()));
111a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        assertEquals(INSERTION_MARKER_FLAGS, info.getInsertionMarkerFlags());
112c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_HORIZONTAL, info.getInsertionMarkerHorizontal());
113c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_TOP, info.getInsertionMarkerTop());
114c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_BASELINE, info.getInsertionMarkerBaseline());
115c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_BOTOM, info.getInsertionMarkerBottom());
116c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(TRANSFORM_MATRIX, info.getMatrix());
117a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        for (int i = 0; i < MANY_BOUNDS.length; i++) {
118a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa            final RectF expectedBounds = MANY_BOUNDS[i];
119699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa            assertEquals(expectedBounds, info.getCharacterBounds(i));
120c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        }
121699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertNull(info.getCharacterBounds(-1));
122699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertNull(info.getCharacterBounds(MANY_BOUNDS.length + 1));
1230b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa        for (int i = 0; i < MANY_FLAGS_ARRAY.length; i++) {
1240b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa            final int expectedFlags = MANY_FLAGS_ARRAY[i];
125699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa            assertEquals(expectedFlags, info.getCharacterBoundsFlags(i));
1260b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa        }
127699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertEquals(0, info.getCharacterBoundsFlags(-1));
128699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertEquals(0, info.getCharacterBoundsFlags(MANY_BOUNDS.length + 1));
129c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
130c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        // Make sure that the builder can reproduce the same object.
131c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final CursorAnchorInfo info2 = builder.build();
132c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(SELECTION_START, info2.getSelectionStart());
133c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(SELECTION_END, info2.getSelectionEnd());
13481f4cb3f858f46a4d9b793c4d326b9bf6aca868dYohei Yukawa        assertEquals(COMPOSING_TEXT_START, info2.getComposingTextStart());
1359a9c112737443e0a4ad0a5054408642ec7b7ee67Yohei Yukawa        assertTrue(TextUtils.equals(COMPOSING_TEXT, info2.getComposingText()));
136a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        assertEquals(INSERTION_MARKER_FLAGS, info2.getInsertionMarkerFlags());
137c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_HORIZONTAL, info2.getInsertionMarkerHorizontal());
138c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_TOP, info2.getInsertionMarkerTop());
139c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_BASELINE, info2.getInsertionMarkerBaseline());
140c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_BOTOM, info2.getInsertionMarkerBottom());
141c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(TRANSFORM_MATRIX, info2.getMatrix());
142a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        for (int i = 0; i < MANY_BOUNDS.length; i++) {
143a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa            final RectF expectedBounds = MANY_BOUNDS[i];
144699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa            assertEquals(expectedBounds, info2.getCharacterBounds(i));
145c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        }
146699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertNull(info2.getCharacterBounds(-1));
147699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertNull(info2.getCharacterBounds(MANY_BOUNDS.length + 1));
1480b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa        for (int i = 0; i < MANY_FLAGS_ARRAY.length; i++) {
1490b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa            final int expectedFlags = MANY_FLAGS_ARRAY[i];
150699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa            assertEquals(expectedFlags, info2.getCharacterBoundsFlags(i));
1510b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa        }
152699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertEquals(0, info2.getCharacterBoundsFlags(-1));
153699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertEquals(0, info2.getCharacterBoundsFlags(MANY_BOUNDS.length + 1));
154c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(info, info2);
155c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(info.hashCode(), info2.hashCode());
156c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
1579a9c112737443e0a4ad0a5054408642ec7b7ee67Yohei Yukawa        // Make sure that object can be marshaled via {@link Parsel}.
158c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final CursorAnchorInfo info3 = cloneViaParcel(info2);
159c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(SELECTION_START, info3.getSelectionStart());
160c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(SELECTION_END, info3.getSelectionEnd());
16181f4cb3f858f46a4d9b793c4d326b9bf6aca868dYohei Yukawa        assertEquals(COMPOSING_TEXT_START, info3.getComposingTextStart());
1629a9c112737443e0a4ad0a5054408642ec7b7ee67Yohei Yukawa        assertTrue(TextUtils.equals(COMPOSING_TEXT, info3.getComposingText()));
163a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        assertEquals(INSERTION_MARKER_FLAGS, info3.getInsertionMarkerFlags());
164c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_HORIZONTAL, info3.getInsertionMarkerHorizontal());
165c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_TOP, info3.getInsertionMarkerTop());
166c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_BASELINE, info3.getInsertionMarkerBaseline());
167c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(INSERTION_MARKER_BOTOM, info3.getInsertionMarkerBottom());
168c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(TRANSFORM_MATRIX, info3.getMatrix());
169a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        for (int i = 0; i < MANY_BOUNDS.length; i++) {
170a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa            final RectF expectedBounds = MANY_BOUNDS[i];
171699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa            assertEquals(expectedBounds, info3.getCharacterBounds(i));
172c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        }
173699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertNull(info3.getCharacterBounds(-1));
174699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertNull(info3.getCharacterBounds(MANY_BOUNDS.length + 1));
1750b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa        for (int i = 0; i < MANY_FLAGS_ARRAY.length; i++) {
1760b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa            final int expectedFlags = MANY_FLAGS_ARRAY[i];
177699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa            assertEquals(expectedFlags, info3.getCharacterBoundsFlags(i));
1780b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa        }
179699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertEquals(0, info3.getCharacterBoundsFlags(-1));
180699a49b9f1d1a7f44a37fa9df96f22f724fbeb1fYohei Yukawa        assertEquals(0, info3.getCharacterBoundsFlags(MANY_BOUNDS.length + 1));
181c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(info.hashCode(), info3.hashCode());
182c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
183c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        builder.reset();
184c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        final CursorAnchorInfo uninitializedInfo = builder.build();
185c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(-1, uninitializedInfo.getSelectionStart());
186c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(-1, uninitializedInfo.getSelectionEnd());
18781f4cb3f858f46a4d9b793c4d326b9bf6aca868dYohei Yukawa        assertEquals(-1, uninitializedInfo.getComposingTextStart());
18881f4cb3f858f46a4d9b793c4d326b9bf6aca868dYohei Yukawa        assertNull(uninitializedInfo.getComposingText());
189a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        assertEquals(0, uninitializedInfo.getInsertionMarkerFlags());
190c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(Float.NaN, uninitializedInfo.getInsertionMarkerHorizontal());
191c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(Float.NaN, uninitializedInfo.getInsertionMarkerTop());
192c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(Float.NaN, uninitializedInfo.getInsertionMarkerBaseline());
193c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        assertEquals(Float.NaN, uninitializedInfo.getInsertionMarkerBottom());
194b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        assertEquals(Matrix.IDENTITY_MATRIX, uninitializedInfo.getMatrix());
195c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa    }
196c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
197eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa    private static void assertNotEquals(final CursorAnchorInfo reference,
198eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa            final CursorAnchorInfo actual) {
199eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertFalse(Objects.equals(reference, actual));
200eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa    }
201eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa
202eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa    @SmallTest
203eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa    public void testEquality() throws Exception {
204eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final Matrix MATRIX1 = new Matrix();
205eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        MATRIX1.setTranslate(10.0f, 20.0f);
206eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final Matrix MATRIX2 = new Matrix();
207eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        MATRIX2.setTranslate(110.0f, 120.0f);
208eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final Matrix NAN_MATRIX = new Matrix();
209eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        NAN_MATRIX.setValues(new float[]{
210eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                Float.NaN, Float.NaN, Float.NaN,
211eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                Float.NaN, Float.NaN, Float.NaN,
212eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                Float.NaN, Float.NaN, Float.NaN});
213eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final int SELECTION_START1 = 2;
214eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final int SELECTION_END1 = 7;
215eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final String COMPOSING_TEXT1 = "0123456789";
216eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final int COMPOSING_TEXT_START1 = 0;
217a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        final int INSERTION_MARKER_FLAGS1 = FLAG_HAS_VISIBLE_REGION;
218eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final float INSERTION_MARKER_HORIZONTAL1 = 10.5f;
219eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final float INSERTION_MARKER_TOP1 = 100.1f;
220eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final float INSERTION_MARKER_BASELINE1 = 110.4f;
221eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final float INSERTION_MARKER_BOTOM1 = 111.0f;
222eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final int SELECTION_START2 = 4;
223eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final int SELECTION_END2 = 8;
224eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final String COMPOSING_TEXT2 = "9876543210";
225eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final int COMPOSING_TEXT_START2 = 3;
226a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        final int INSERTION_MARKER_FLAGS2 =
227a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                FLAG_HAS_VISIBLE_REGION | FLAG_HAS_INVISIBLE_REGION | FLAG_IS_RTL;
228eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final float INSERTION_MARKER_HORIZONTAL2 = 14.5f;
229eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final float INSERTION_MARKER_TOP2 = 200.1f;
230eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final float INSERTION_MARKER_BASELINE2 = 210.4f;
231eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        final float INSERTION_MARKER_BOTOM2 = 211.0f;
232eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa
233eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        // Default instance should be equal.
234eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertEquals(new Builder().build(), new Builder().build());
235eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa
236eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertEquals(
237eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setSelectionRange(SELECTION_START1, SELECTION_END1).build(),
238eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setSelectionRange(SELECTION_START1, SELECTION_END1).build());
239eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
240eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setSelectionRange(SELECTION_START1, SELECTION_END1).build(),
241eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setSelectionRange(SELECTION_START1, SELECTION_END2).build());
242eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
243eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setSelectionRange(SELECTION_START1, SELECTION_END1).build(),
244eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setSelectionRange(SELECTION_START2, SELECTION_END1).build());
245eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
246eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setSelectionRange(SELECTION_START1, SELECTION_END1).build(),
247eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setSelectionRange(SELECTION_START2, SELECTION_END2).build());
248eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertEquals(
249eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setComposingText(COMPOSING_TEXT_START1, COMPOSING_TEXT1).build(),
250eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setComposingText(COMPOSING_TEXT_START1, COMPOSING_TEXT1).build());
251eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
252eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setComposingText(COMPOSING_TEXT_START1, COMPOSING_TEXT1).build(),
253eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setComposingText(COMPOSING_TEXT_START2, COMPOSING_TEXT1).build());
254eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
255eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setComposingText(COMPOSING_TEXT_START1, COMPOSING_TEXT1).build(),
256eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setComposingText(COMPOSING_TEXT_START1, COMPOSING_TEXT2).build());
257eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
258eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setComposingText(COMPOSING_TEXT_START1, COMPOSING_TEXT1).build(),
259eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setComposingText(COMPOSING_TEXT_START2, COMPOSING_TEXT2).build());
260eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa
261eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        // For insertion marker locations, {@link Float#NaN} is treated as if it was a number.
262eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertEquals(
263eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
2640b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        Float.NaN, Float.NaN, Float.NaN, Float.NaN,
265a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build(),
266eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
2670b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        Float.NaN, Float.NaN, Float.NaN, Float.NaN,
268a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build());
269eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa
270eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        // Check Matrix.
271eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertEquals(
272eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).build(),
273eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).build());
274eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
275eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).build(),
276eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX2).build());
277eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
278eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).build(),
279eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(NAN_MATRIX).build());
280eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        // Unlike insertion marker locations, {@link Float#NaN} in the matrix is treated as just a
281eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        // NaN as usual (NaN == NaN -> false).
282eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
283eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(NAN_MATRIX).build(),
284eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(NAN_MATRIX).build());
285eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa
286eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertEquals(
287eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
288eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
2890b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
290a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build(),
291eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
292eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
2930b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
294a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build());
295eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
296eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
297eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        Float.NaN, INSERTION_MARKER_TOP1,
2980b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
299a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build(),
300eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
301eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3020b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
303a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build());
304eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
305eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
306eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3070b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
308a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build(),
309eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
310eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL2, INSERTION_MARKER_TOP1,
3110b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
312a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build());
313eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
314eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
315eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3160b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
317a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build(),
318eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
319eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP2,
3200b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
321a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build());
322eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
323eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
324eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3250b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
326a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build(),
327eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
328eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3290b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE2, INSERTION_MARKER_BOTOM1,
330a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build());
331eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
332eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
333eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3340b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
335a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build(),
336eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
337eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL2, INSERTION_MARKER_TOP1,
3380b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
339a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build());
3400b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa        assertNotEquals(
3410b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
3420b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3430b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
344a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build(),
3450b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
3460b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3470b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM2,
348a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build());
349eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa        assertNotEquals(
350eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
351eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3520b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
353a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS1).build(),
354eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                new Builder().setMatrix(MATRIX1).setInsertionMarkerLocation(
355eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa                        INSERTION_MARKER_HORIZONTAL1, INSERTION_MARKER_TOP1,
3560b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                        INSERTION_MARKER_BASELINE1, INSERTION_MARKER_BOTOM1,
357a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                        INSERTION_MARKER_FLAGS2).build());
358eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa    }
359eea0b8b051e916051d0d09da3f41f9ec4d508bffYohei Yukawa
360c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa    @SmallTest
361419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa    public void testMatrixIsCopied() throws Exception {
362419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        final Matrix MATRIX1 = new Matrix();
363419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        MATRIX1.setTranslate(10.0f, 20.0f);
364419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        final Matrix MATRIX2 = new Matrix();
365419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        MATRIX2.setTranslate(110.0f, 120.0f);
366419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        final Matrix MATRIX3 = new Matrix();
367419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        MATRIX3.setTranslate(210.0f, 220.0f);
368419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        final Matrix matrix = new Matrix();
369c46b5f04aa2a9fd292c117d2824f70fcf06e86baYohei Yukawa        final Builder builder = new Builder();
370419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa
371419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        matrix.set(MATRIX1);
372419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        builder.setMatrix(matrix);
373419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        matrix.postRotate(90.0f);
374419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa
375419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        final CursorAnchorInfo firstInstance = builder.build();
376419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        assertEquals(MATRIX1, firstInstance.getMatrix());
377419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        matrix.set(MATRIX2);
378419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        builder.setMatrix(matrix);
379419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        final CursorAnchorInfo secondInstance = builder.build();
380419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        assertEquals(MATRIX1, firstInstance.getMatrix());
381419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        assertEquals(MATRIX2, secondInstance.getMatrix());
382419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa
383419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        matrix.set(MATRIX3);
384419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        assertEquals(MATRIX1, firstInstance.getMatrix());
385419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa        assertEquals(MATRIX2, secondInstance.getMatrix());
386419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa    }
387419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa
388419b1b0498e33a556780be1702b444d54fcaa7ddYohei Yukawa    @SmallTest
389b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa    public void testMatrixIsRequired() throws Exception {
390b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        final int SELECTION_START = 30;
391b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        final int SELECTION_END = 40;
392b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        final int COMPOSING_TEXT_START = 32;
393b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        final String COMPOSING_TEXT = "test";
394a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa        final int INSERTION_MARKER_FLAGS = FLAG_HAS_VISIBLE_REGION;
395b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        final float INSERTION_MARKER_HORIZONTAL = 10.5f;
396b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        final float INSERTION_MARKER_TOP = 100.1f;
397b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        final float INSERTION_MARKER_BASELINE = 110.4f;
398b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        final float INSERTION_MARKER_BOTOM = 111.0f;
399b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        Matrix TRANSFORM_MATRIX = new Matrix(Matrix.IDENTITY_MATRIX);
400b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        TRANSFORM_MATRIX.setScale(10.0f, 20.0f);
401b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa
402b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        final Builder builder = new Builder();
403b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        // Check twice to make sure if Builder#reset() works as expected.
404b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        for (int repeatCount = 0; repeatCount < 2; ++repeatCount) {
405b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            builder.setSelectionRange(SELECTION_START, SELECTION_END)
406b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa                    .setComposingText(COMPOSING_TEXT_START, COMPOSING_TEXT);
407b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            try {
408b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa                // Should succeed as coordinate transformation matrix is not required if no
409b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa                // positional information is specified.
4100b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                builder.build();
411b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            } catch (IllegalArgumentException ex) {
412b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa                assertTrue(false);
413b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            }
414b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa
415b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            builder.setInsertionMarkerLocation(INSERTION_MARKER_HORIZONTAL, INSERTION_MARKER_TOP,
416a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa                    INSERTION_MARKER_BASELINE, INSERTION_MARKER_BOTOM, INSERTION_MARKER_FLAGS);
417b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            try {
418b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa                // Coordinate transformation matrix is required if no positional information is
419b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa                // specified.
4200b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                builder.build();
4210b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                assertTrue(false);
422b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            } catch (IllegalArgumentException ex) {
423b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            }
424b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa
425b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            builder.setMatrix(TRANSFORM_MATRIX);
426b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            try {
427b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa                // Should succeed as coordinate transformation matrix is required.
4280b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa                builder.build();
429b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            } catch (IllegalArgumentException ex) {
430b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa                assertTrue(false);
431b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            }
432b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa
433b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa            builder.reset();
434b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa        }
435b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa    }
436b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa
437b5268dcc17cd9ecb540b06ad59bd74188b57a069Yohei Yukawa    @SmallTest
438a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa    public void testBuilderAddCharacterBounds() throws Exception {
439c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        // A negative index should be rejected.
440c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        try {
441a41c4bcc3dcac9e808c9d524e24454d132790e9aYohei Yukawa            new Builder().addCharacterBounds(-1, 0.0f, 0.0f, 0.0f, 0.0f, FLAG_HAS_VISIBLE_REGION);
4420b01e7fc58cdde00d8350285a3386c4209b72d78Yohei Yukawa            assertTrue(false);
443c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        } catch (IllegalArgumentException ex) {
444c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        }
445c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa    }
446c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa
447c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa    private static CursorAnchorInfo cloneViaParcel(final CursorAnchorInfo src) {
448c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        Parcel parcel = null;
449c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        try {
450c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            parcel = Parcel.obtain();
451c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            src.writeToParcel(parcel, 0);
452c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            parcel.setDataPosition(0);
453c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            return new CursorAnchorInfo(parcel);
454c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        } finally {
455c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            if (parcel != null) {
456c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa                parcel.recycle();
457c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa            }
458c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa        }
459c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa    }
460c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa}
461