/* * 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 com.android.inputmethod.latin; import android.test.suitebuilder.annotation.LargeTest; import com.android.inputmethod.event.Event; import com.android.inputmethod.latin.common.Constants; import java.util.ArrayList; @LargeTest public class InputLogicTestsDeadKeys extends InputTestsBase { // A helper class for readability static class EventList extends ArrayList { public EventList addCodePoint(final int codePoint, final boolean isDead) { final Event event; if (isDead) { event = Event.createDeadEvent(codePoint, Event.NOT_A_KEY_CODE, null /* next */); } else { event = Event.createSoftwareKeypressEvent(codePoint, Event.NOT_A_KEY_CODE, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, false /* isKeyRepeat */); } add(event); return this; } public EventList addKey(final int keyCode) { add(Event.createSoftwareKeypressEvent(Event.NOT_A_CODE_POINT, keyCode, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, false /* isKeyRepeat */)); return this; } } public void testDeadCircumflexSimple() { final int MODIFIER_LETTER_CIRCUMFLEX_ACCENT = 0x02C6; final String EXPECTED_RESULT = "aê"; final EventList events = new EventList() .addCodePoint('a', false) .addCodePoint(MODIFIER_LETTER_CIRCUMFLEX_ACCENT, true) .addCodePoint('e', false); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("simple dead circumflex", EXPECTED_RESULT, mEditText.getText().toString()); } public void testDeadCircumflexBackspace() { final int MODIFIER_LETTER_CIRCUMFLEX_ACCENT = 0x02C6; final String EXPECTED_RESULT = "ae"; final EventList events = new EventList() .addCodePoint('a', false) .addCodePoint(MODIFIER_LETTER_CIRCUMFLEX_ACCENT, true) .addKey(Constants.CODE_DELETE) .addCodePoint('e', false); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("dead circumflex backspace", EXPECTED_RESULT, mEditText.getText().toString()); } public void testDeadCircumflexFeedback() { final int MODIFIER_LETTER_CIRCUMFLEX_ACCENT = 0x02C6; final String EXPECTED_RESULT = "a\u02C6"; final EventList events = new EventList() .addCodePoint('a', false) .addCodePoint(MODIFIER_LETTER_CIRCUMFLEX_ACCENT, true); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("dead circumflex gives feedback", EXPECTED_RESULT, mEditText.getText().toString()); } public void testDeadDiaeresisSpace() { final int MODIFIER_LETTER_DIAERESIS = 0xA8; final String EXPECTED_RESULT = "a\u00A8e\u00A8i"; final EventList events = new EventList() .addCodePoint('a', false) .addCodePoint(MODIFIER_LETTER_DIAERESIS, true) .addCodePoint(Constants.CODE_SPACE, false) .addCodePoint('e', false) .addCodePoint(MODIFIER_LETTER_DIAERESIS, true) .addCodePoint(Constants.CODE_ENTER, false) .addCodePoint('i', false); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("dead diaeresis space commits the dead char", EXPECTED_RESULT, mEditText.getText().toString()); } public void testDeadAcuteLetterBackspace() { final int MODIFIER_LETTER_ACUTE = 0xB4; final String EXPECTED_RESULT1 = "aá"; final String EXPECTED_RESULT2 = "a"; final EventList events = new EventList() .addCodePoint('a', false) .addCodePoint(MODIFIER_LETTER_ACUTE, true) .addCodePoint('a', false); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("dead acute on a typed", EXPECTED_RESULT1, mEditText.getText().toString()); mLatinIME.onEvent(Event.createSoftwareKeypressEvent(Event.NOT_A_CODE_POINT, Constants.CODE_DELETE, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, false /* isKeyRepeat */)); assertEquals("a with acute deleted", EXPECTED_RESULT2, mEditText.getText().toString()); } public void testFinnishStroke() { final int MODIFIER_LETTER_STROKE = '-'; final String EXPECTED_RESULT = "x\u0110\u0127"; final EventList events = new EventList() .addCodePoint('x', false) .addCodePoint(MODIFIER_LETTER_STROKE, true) .addCodePoint('D', false) .addCodePoint(MODIFIER_LETTER_STROKE, true) .addCodePoint('h', false); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("Finnish dead stroke", EXPECTED_RESULT, mEditText.getText().toString()); } public void testDoubleDeadOgonek() { final int MODIFIER_LETTER_OGONEK = 0x02DB; final String EXPECTED_RESULT = "txǫs\u02DBfk"; final EventList events = new EventList() .addCodePoint('t', false) .addCodePoint('x', false) .addCodePoint(MODIFIER_LETTER_OGONEK, true) .addCodePoint('o', false) .addCodePoint('s', false) .addCodePoint(MODIFIER_LETTER_OGONEK, true) .addCodePoint(MODIFIER_LETTER_OGONEK, true) .addCodePoint('f', false) .addCodePoint(MODIFIER_LETTER_OGONEK, true) .addCodePoint(MODIFIER_LETTER_OGONEK, true) .addKey(Constants.CODE_DELETE) .addCodePoint('k', false); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("double dead ogonek, and backspace", EXPECTED_RESULT, mEditText.getText().toString()); } public void testDeadCircumflexDeadDiaeresis() { final int MODIFIER_LETTER_CIRCUMFLEX_ACCENT = 0x02C6; final int MODIFIER_LETTER_DIAERESIS = 0xA8; final String EXPECTED_RESULT = "r̂̈"; final EventList events = new EventList() .addCodePoint(MODIFIER_LETTER_CIRCUMFLEX_ACCENT, true) .addCodePoint(MODIFIER_LETTER_DIAERESIS, true) .addCodePoint('r', false); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("both circumflex and diaeresis on r", EXPECTED_RESULT, mEditText.getText().toString()); } public void testDeadCircumflexDeadDiaeresisBackspace() { final int MODIFIER_LETTER_CIRCUMFLEX_ACCENT = 0x02C6; final int MODIFIER_LETTER_DIAERESIS = 0xA8; final String EXPECTED_RESULT = "û"; final EventList events = new EventList() .addCodePoint(MODIFIER_LETTER_CIRCUMFLEX_ACCENT, true) .addCodePoint(MODIFIER_LETTER_DIAERESIS, true) .addKey(Constants.CODE_DELETE) .addCodePoint('u', false); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("dead circumflex, dead diaeresis, backspace, u", EXPECTED_RESULT, mEditText.getText().toString()); } public void testDeadCircumflexDoubleDeadDiaeresisBackspace() { final int MODIFIER_LETTER_CIRCUMFLEX_ACCENT = 0x02C6; final int MODIFIER_LETTER_DIAERESIS = 0xA8; final String EXPECTED_RESULT = "\u02C6u"; final EventList events = new EventList() .addCodePoint(MODIFIER_LETTER_CIRCUMFLEX_ACCENT, true) .addCodePoint(MODIFIER_LETTER_DIAERESIS, true) .addCodePoint(MODIFIER_LETTER_DIAERESIS, true) .addKey(Constants.CODE_DELETE) .addCodePoint('u', false); for (final Event event : events) { mLatinIME.onEvent(event); } assertEquals("dead circumflex, double dead diaeresis, backspace, u", EXPECTED_RESULT, mEditText.getText().toString()); } }