More tests for BaseInputConnection.

As a preparation work for Bug 6526420, where we are going to
introduce a new variant of IC#deleteSurroundingText(), this CL attempts
to improve the test coverage of
BaseInputConnection#deleteSurroundingText().

Bug: 6526420
Change-Id: Ibb8edb7b9764e52e71677ae8d8cdefdbf3321a28
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java b/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
index 69659a2..55b5c75 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
@@ -16,15 +16,13 @@
 
 package android.view.inputmethod.cts;
 
-import android.view.cts.R;
-
-
 import android.app.Instrumentation;
 import android.content.Context;
 import android.cts.util.PollingCheck;
 import android.os.Bundle;
 import android.test.ActivityInstrumentationTestCase2;
 import android.text.Editable;
+import android.text.Selection;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.TextUtils;
@@ -32,6 +30,7 @@
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.Window;
+import android.view.cts.R;
 import android.view.inputmethod.BaseInputConnection;
 import android.view.inputmethod.CompletionInfo;
 import android.view.inputmethod.ExtractedTextRequest;
@@ -163,7 +162,7 @@
         }.run();
         assertEquals(0, dummyConnection.getCursorCapsMode(TextUtils.CAP_MODE_WORDS));
 
-        // Test deleteSurroudingText
+        // Test deleteSurroundingText
         int end = text2.length();
         mConnection.setSelection(end, end);
         // Delete the ending space
@@ -256,4 +255,240 @@
         mConnection.reportFullscreenMode(true);
         assertTrue(imManager.isFullscreenMode());
     }
+
+    /**
+     * An utility method to create an instance of {@link BaseInputConnection} in dummy mode with
+     * an initial text and selection range.
+     * @param view the {@link View} to be associated with the {@link BaseInputConnection}.
+     * @param source the initial text.
+     * @param selectionStart the initial selection start index.
+     * @param selectionEnd the initial selection end index.
+     * @return {@link BaseInputConnection} instantiated in dummy mode with {@code source} and
+     * selection range from {@code selectionStart} to {@code selectionEnd}
+     */
+    private static BaseInputConnection createDummyConnectionWithSelection(
+            final View view, final CharSequence source, final int selectionStart,
+            final int selectionEnd) {
+        final Editable editable = Editable.Factory.getInstance().newEditable(source);
+        Selection.setSelection(editable, selectionStart, selectionEnd);
+        return new BaseInputConnection(view, false) {
+            @Override
+            public Editable getEditable() {
+                return editable;
+            }
+        };
+    }
+
+    /**
+     * Tests {@link BaseInputConnection#deleteSurroundingText(int, int)} comprehensively.
+     */
+    public void testDeleteSurroundingText() throws Throwable {
+        // For text "012[]3456789", calling deleteSurroundingText(0, 0) must produce "012[]3456789",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 3);
+
+            dummyConnection.deleteSurroundingText(0, 0);
+            assertEquals("012", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertTrue(TextUtils.isEmpty(dummyConnection.getSelectedText(0)));  // null is allowed.
+            assertEquals("3456789", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0123456789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "012[]3456789", calling deleteSurroundingText(-1, -1) must produce
+        // "012[]3456789", where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 3);
+
+            dummyConnection.deleteSurroundingText(-1, -1);
+            assertEquals("012", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertTrue(TextUtils.isEmpty(dummyConnection.getSelectedText(0)));  // null is allowed.
+            assertEquals("3456789", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0123456789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "012[]3456789", calling deleteSurroundingText(1, 2) must produce
+        // "01[]56789", where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 3);
+
+            dummyConnection.deleteSurroundingText(1, 2);
+            assertEquals("01", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertTrue(TextUtils.isEmpty(dummyConnection.getSelectedText(0)));  // null is allowed.
+            assertEquals("56789", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0156789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "012[]3456789", calling deleteSurroundingText(10, 1) must produce "[]456789",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 3);
+
+            assertTrue(dummyConnection.deleteSurroundingText(10, 1));
+            assertEquals("", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertTrue(TextUtils.isEmpty(dummyConnection.getSelectedText(0)));  // null is allowed.
+            assertEquals("456789", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("456789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "012[]3456789", calling deleteSurroundingText(1, 10) must produce "01[]",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 3);
+
+            assertTrue(dummyConnection.deleteSurroundingText(1, 10));
+            assertEquals("01", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertTrue(TextUtils.isEmpty(dummyConnection.getSelectedText(0)));  // null is allowed.
+            assertEquals("", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("01", dummyConnection.getEditable().toString());
+        }
+
+        // For text "[]0123456789", calling deleteSurroundingText(3, 3) must produce "[]3456789",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 0, 0);
+
+            assertTrue(dummyConnection.deleteSurroundingText(3, 3));
+            assertEquals("", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertTrue(TextUtils.isEmpty(dummyConnection.getSelectedText(0)));  // null is allowed.
+            assertEquals("3456789", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("3456789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "0123456789[]", calling deleteSurroundingText(3, 3) must produce "0123456[]",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 10, 10);
+
+            assertTrue(dummyConnection.deleteSurroundingText(3, 3));
+            assertEquals("0123456", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertTrue(TextUtils.isEmpty(dummyConnection.getSelectedText(0)));  // null is allowed.
+            assertEquals("", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0123456", dummyConnection.getEditable().toString());
+        }
+
+        // For text "012[345]6789", calling deleteSurroundingText(0, 0) must produce "012[345]6789",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 6);
+
+            dummyConnection.deleteSurroundingText(0, 0);
+            assertEquals("012", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertEquals("345", dummyConnection.getSelectedText(0).toString());
+            assertEquals("6789", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0123456789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "012[345]6789", calling deleteSurroundingText(-1, -1) must produce
+        // "012[345]6789", where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 6);
+
+            dummyConnection.deleteSurroundingText(-1, -1);
+            assertEquals("012", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertEquals("345", dummyConnection.getSelectedText(0).toString());
+            assertEquals("6789", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0123456789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "012[345]6789", calling deleteSurroundingText(1, 2) must produce
+        // "01[345]89", where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 6);
+
+            dummyConnection.deleteSurroundingText(1, 2);
+            assertEquals("01", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertEquals("345", dummyConnection.getSelectedText(0).toString());
+            assertEquals("89", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0134589", dummyConnection.getEditable().toString());
+        }
+
+        // For text "012[345]6789", calling deleteSurroundingText(10, 1) must produce
+        // "[345]789", where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 6);
+
+            dummyConnection.deleteSurroundingText(10, 1);
+            assertEquals("", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertEquals("345", dummyConnection.getSelectedText(0).toString());
+            assertEquals("789", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("345789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "012[345]6789", calling deleteSurroundingText(1, 10) must produce
+        // "[345]789", where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 3, 6);
+
+            dummyConnection.deleteSurroundingText(1, 10);
+            assertEquals("01", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertEquals("345", dummyConnection.getSelectedText(0).toString());
+            assertEquals("", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("01345", dummyConnection.getEditable().toString());
+        }
+
+        // For text "[012]3456789", calling deleteSurroundingText(3, 3) must produce "[012]6789",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 0, 3);
+
+            assertTrue(dummyConnection.deleteSurroundingText(3, 3));
+            assertEquals("", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertEquals("012", dummyConnection.getSelectedText(0).toString());
+            assertEquals("6789", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0126789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "0123456[789]", calling deleteSurroundingText(3, 3) must produce "0123[789]",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 7, 10);
+
+            assertTrue(dummyConnection.deleteSurroundingText(3, 3));
+            assertEquals("0123", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertEquals("789", dummyConnection.getSelectedText(0).toString());
+            assertEquals("", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0123789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "[0123456789]", calling deleteSurroundingText(0, 0) must produce "[0123456789]",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 0, 10);
+
+            assertTrue(dummyConnection.deleteSurroundingText(0, 0));
+            assertEquals("", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertEquals("0123456789", dummyConnection.getSelectedText(0).toString());
+            assertEquals("", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0123456789", dummyConnection.getEditable().toString());
+        }
+
+        // For text "[0123456789]", calling deleteSurroundingText(1, 1) must produce "[0123456789]",
+        // where '[' and ']' indicate the text selection range.
+        {
+            final BaseInputConnection dummyConnection = createDummyConnectionWithSelection(
+                    mView, "0123456789", 0, 10);
+
+            assertTrue(dummyConnection.deleteSurroundingText(1, 1));
+            assertEquals("", dummyConnection.getTextBeforeCursor(10, 0).toString());
+            assertEquals("0123456789", dummyConnection.getSelectedText(0).toString());
+            assertEquals("", dummyConnection.getTextAfterCursor(10, 0).toString());
+            assertEquals("0123456789", dummyConnection.getEditable().toString());
+        }
+    }
 }