Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9afac331 authored by Jean Chalard's avatar Jean Chalard Committed by Android (Google) Code Review
Browse files

Merge "Add tests for type through recorrection"

parents a2b4bfb0 7e930bfb
Loading
Loading
Loading
Loading
+58 −31
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ public class InputLogicTests extends InputTestsBase {
        final String EXPECTED_RESULT = "thi";
        type(WORD_TO_TYPE);
        pickSuggestionManually(WORD_TO_TYPE);
        mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
        sendUpdateForCursorMoveTo(WORD_TO_TYPE.length());
        type(Constants.CODE_DELETE);
        assertEquals("press suggestion then backspace", EXPECTED_RESULT,
                mEditText.getText().toString());
@@ -51,7 +51,7 @@ public class InputLogicTests extends InputTestsBase {
        type(WORD_TO_TYPE);
        // Choose the auto-correction. For "tgis", the auto-correction should be "this".
        pickSuggestionManually(WORD_TO_PICK);
        mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
        sendUpdateForCursorMoveTo(WORD_TO_TYPE.length());
        assertEquals("pick typed word over auto-correction then backspace", WORD_TO_PICK,
                mEditText.getText().toString());
        type(Constants.CODE_DELETE);
@@ -65,7 +65,7 @@ public class InputLogicTests extends InputTestsBase {
        type(WORD_TO_TYPE);
        // Choose the typed word.
        pickSuggestionManually(WORD_TO_TYPE);
        mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
        sendUpdateForCursorMoveTo(WORD_TO_TYPE.length());
        assertEquals("pick typed word over auto-correction then backspace", WORD_TO_TYPE,
                mEditText.getText().toString());
        type(Constants.CODE_DELETE);
@@ -80,7 +80,7 @@ public class InputLogicTests extends InputTestsBase {
        type(WORD_TO_TYPE);
        // Choose the second suggestion, which should be "thus" when "tgis" is typed.
        pickSuggestionManually(WORD_TO_PICK);
        mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
        sendUpdateForCursorMoveTo(WORD_TO_TYPE.length());
        assertEquals("pick different suggestion then backspace", WORD_TO_PICK,
                mEditText.getText().toString());
        type(Constants.CODE_DELETE);
@@ -95,7 +95,8 @@ public class InputLogicTests extends InputTestsBase {
        final int SELECTION_END = 19;
        final String EXPECTED_RESULT = "some text  some text";
        type(STRING_TO_TYPE);
        // There is no IMF to call onUpdateSelection for us so we must do it by hand.
        // Don't use the sendUpdateForCursorMove* family of methods here because they
        // don't handle selections.
        // Send once to simulate the cursor actually responding to the move caused by typing.
        // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor
        // move with a move triggered by LatinIME inputting stuff.
@@ -115,7 +116,8 @@ public class InputLogicTests extends InputTestsBase {
        final int SELECTION_END = 19;
        final String EXPECTED_RESULT = "some text some text";
        type(STRING_TO_TYPE);
        // There is no IMF to call onUpdateSelection for us so we must do it by hand.
        // Don't use the sendUpdateForCursorMove* family of methods here because they
        // don't handle selections.
        // Send once to simulate the cursor actually responding to the move caused by typing.
        // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor
        // move with a move triggered by LatinIME inputting stuff.
@@ -154,7 +156,7 @@ public class InputLogicTests extends InputTestsBase {
        final String STRING_TO_TYPE = "tgis.";
        final String EXPECTED_RESULT = "tgis.";
        type(STRING_TO_TYPE);
        mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
        sendUpdateForCursorMoveTo(STRING_TO_TYPE.length());
        type(Constants.CODE_DELETE);
        assertEquals("auto-correct with period then revert", EXPECTED_RESULT,
                mEditText.getText().toString());
@@ -167,7 +169,7 @@ public class InputLogicTests extends InputTestsBase {
        final String STRING_TO_TYPE = "tgis ";
        final String EXPECTED_RESULT = "tgis";
        type(STRING_TO_TYPE);
        mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
        sendUpdateForCursorMoveTo(STRING_TO_TYPE.length());
        type(Constants.CODE_DELETE);
        assertEquals("auto-correct with space then revert", EXPECTED_RESULT,
                mEditText.getText().toString());
@@ -178,15 +180,12 @@ public class InputLogicTests extends InputTestsBase {
        final String STRING_TO_TYPE_SECOND = "a";
        final String EXPECTED_RESULT = "tgis a";
        type(STRING_TO_TYPE_FIRST);
        mLatinIME.onUpdateSelection(0, 0,
                STRING_TO_TYPE_FIRST.length(), STRING_TO_TYPE_FIRST.length(), -1, -1);
        sendUpdateForCursorMoveTo(STRING_TO_TYPE_FIRST.length());
        type(Constants.CODE_DELETE);

        type(STRING_TO_TYPE_SECOND);
        mLatinIME.onUpdateSelection(STRING_TO_TYPE_FIRST.length(), STRING_TO_TYPE_FIRST.length(),
                STRING_TO_TYPE_FIRST.length() - 1 + STRING_TO_TYPE_SECOND.length(),
                STRING_TO_TYPE_FIRST.length() - 1 + STRING_TO_TYPE_SECOND.length(),
                -1, -1);
        sendUpdateForCursorMoveTo(STRING_TO_TYPE_FIRST.length() - 1
                + STRING_TO_TYPE_SECOND.length());
        assertEquals("auto-correct with space then revert then type more", EXPECTED_RESULT,
                mEditText.getText().toString());
    }
@@ -195,7 +194,7 @@ public class InputLogicTests extends InputTestsBase {
        final String STRING_TO_TYPE = "this ";
        final String EXPECTED_RESULT = "this";
        type(STRING_TO_TYPE);
        mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
        sendUpdateForCursorMoveTo(STRING_TO_TYPE.length());
        type(Constants.CODE_DELETE);
        assertEquals("auto-correct with space does not revert", EXPECTED_RESULT,
                mEditText.getText().toString());
@@ -299,10 +298,9 @@ public class InputLogicTests extends InputTestsBase {
        final String EXPECTED_RESULT = "this ";
        final int NEW_CURSOR_POSITION = 0;
        type(STRING_TO_TYPE);
        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
        sendUpdateForCursorMoveTo(typedLength);
        mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION);
        mLatinIME.onUpdateSelection(typedLength, typedLength,
                NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1);
        sendUpdateForCursorMoveTo(NEW_CURSOR_POSITION);
        type(Constants.CODE_DELETE);
        assertEquals("auto correct then move cursor to start of line then backspace",
                EXPECTED_RESULT, mEditText.getText().toString());
@@ -314,10 +312,9 @@ public class InputLogicTests extends InputTestsBase {
        final String EXPECTED_RESULT = "andthis ";
        final int NEW_CURSOR_POSITION = STRING_TO_TYPE.indexOf('t');
        type(STRING_TO_TYPE);
        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
        sendUpdateForCursorMoveTo(typedLength);
        mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION);
        mLatinIME.onUpdateSelection(typedLength, typedLength,
                NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1);
        sendUpdateForCursorMoveTo(NEW_CURSOR_POSITION);
        type(Constants.CODE_DELETE);
        assertEquals("auto correct then move cursor then backspace",
                EXPECTED_RESULT, mEditText.getText().toString());
@@ -417,7 +414,7 @@ public class InputLogicTests extends InputTestsBase {
                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
        assertEquals("resume suggestion on backspace", -1,
                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
        sendUpdateForCursorMoveTo(typedLength);
        type(Constants.CODE_DELETE);
        assertEquals("resume suggestion on backspace", 4,
                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
@@ -558,26 +555,22 @@ public class InputLogicTests extends InputTestsBase {
        final int endOfSuggestion = endOfPrefix + FIRST_NON_TYPED_SUGGESTION.length();
        final int indexForManualCursor = endOfPrefix + 3; // +3 because it's after "Bar" in "Barack"
        type(PREFIX);
        mLatinIME.onUpdateSelection(0, 0, endOfPrefix, endOfPrefix, -1, -1);
        sendUpdateForCursorMoveTo(endOfPrefix);
        type(WORD_TO_TYPE);
        pickSuggestionManually(FIRST_NON_TYPED_SUGGESTION);
        mLatinIME.onUpdateSelection(endOfPrefix, endOfPrefix, endOfSuggestion, endOfSuggestion,
                -1, -1);
        sendUpdateForCursorMoveTo(endOfSuggestion);
        runMessages();
        type(" ");
        mLatinIME.onUpdateSelection(endOfSuggestion, endOfSuggestion,
                endOfSuggestion + 1, endOfSuggestion + 1, -1, -1);
        sendUpdateForCursorMoveBy(1);
        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
        runMessages();
        // Simulate a manual cursor move
        mInputConnection.setSelection(indexForManualCursor, indexForManualCursor);
        mLatinIME.onUpdateSelection(endOfSuggestion + 1, endOfSuggestion + 1,
                indexForManualCursor, indexForManualCursor, -1, -1);
        sendUpdateForCursorMoveTo(indexForManualCursor);
        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
        runMessages();
        pickSuggestionManually(WORD_TO_TYPE);
        mLatinIME.onUpdateSelection(indexForManualCursor, indexForManualCursor,
                endOfWord, endOfWord, -1, -1);
        sendUpdateForCursorMoveTo(endOfWord);
        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
        runMessages();
        // Test the first prediction is displayed
@@ -680,4 +673,38 @@ public class InputLogicTests extends InputTestsBase {
        MoreAsserts.assertNotEqual("gesture twice the same thing", "this",
                mEditText.getText().toString());
    }

    private void typeWordAndPutCursorInside(final String word, final int startPos) {
        final int END_OF_WORD = startPos + word.length();
        final int NEW_CURSOR_POSITION = startPos + word.length() / 2;
        type(word);
        sendUpdateForCursorMoveTo(END_OF_WORD);
        runMessages();
        sendUpdateForCursorMoveTo(NEW_CURSOR_POSITION);
        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
        runMessages();
        ensureComposingSpanPos("move cursor inside word leaves composing span in the right place",
                startPos, END_OF_WORD);
    }

    private void ensureComposingSpanPos(final String message, final int from, final int to) {
        assertEquals(message, from, BaseInputConnection.getComposingSpanStart(mEditText.getText()));
        assertEquals(message, to, BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
    }

    public void testTypeWithinComposing() {
        final String WORD_TO_TYPE = "something";
        final String EXPECTED_RESULT = "some thing";
        typeWordAndPutCursorInside(WORD_TO_TYPE, 0 /* startPos */);
        type(" ");
        ensureComposingSpanPos("space while in the middle of a word cancels composition", -1, -1);
        assertEquals("space in the middle of a composing word", EXPECTED_RESULT,
                mEditText.getText().toString());
        int cursorPos = sendUpdateForCursorMoveToEndOfLine();
        runMessages();
        type(" ");
        typeWordAndPutCursorInside(WORD_TO_TYPE, cursorPos + 1 /* startPos */);
        type(Constants.CODE_DELETE);
        ensureComposingSpanPos("space while in the middle of a word cancels composition", -1, -1);
    }
}
+37 −0
Original line number Diff line number Diff line
@@ -193,6 +193,7 @@ public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> {
                | InputType.TYPE_TEXT_FLAG_MULTI_LINE;
        mEditText.setInputType(inputType);
        mEditText.setEnabled(true);
        mLastCursorPos = 0;
        if (null == Looper.myLooper()) {
            Looper.prepare();
        }
@@ -414,4 +415,40 @@ public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> {
            Thread.sleep(milliseconds);
        } catch (InterruptedException e) {}
    }

    // Some helper methods to manage the mock cursor position
    // DO NOT CALL LatinIME#onUpdateSelection IF YOU WANT TO USE THOSE
    int mLastCursorPos = 0;
    /**
     * Move the cached cursor position to the passed position and send onUpdateSelection to LatinIME
     */
    protected int sendUpdateForCursorMoveTo(final int position) {
        mInputConnection.setSelection(position, position);
        mLatinIME.onUpdateSelection(mLastCursorPos, mLastCursorPos, position, position, -1, -1);
        mLastCursorPos = position;
        return position;
    }

    /**
     * Move the cached cursor position by the passed amount and send onUpdateSelection to LatinIME
     */
    protected int sendUpdateForCursorMoveBy(final int offset) {
        final int lastPos = mEditText.getText().length();
        final int requestedPosition = mLastCursorPos + offset;
        if (requestedPosition < 0) {
            return sendUpdateForCursorMoveTo(0);
        } else if (requestedPosition > lastPos) {
            return sendUpdateForCursorMoveTo(lastPos);
        } else {
            return sendUpdateForCursorMoveTo(requestedPosition);
        }
    }

    /**
     * Move the cached cursor position to the end of the line and send onUpdateSelection to LatinIME
     */
    protected int sendUpdateForCursorMoveToEndOfLine() {
        final int lastPos = mEditText.getText().length();
        return sendUpdateForCursorMoveTo(lastPos);
    }
}