aboutsummaryrefslogtreecommitdiffstats
/*
 * 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 org.kelar.inputmethod.latin;

import androidx.test.filters.LargeTest;

import org.kelar.inputmethod.event.Event;
import org.kelar.inputmethod.latin.common.Constants;

import java.util.ArrayList;

@LargeTest
public class InputLogicTestsDeadKeys extends InputTestsBase {
    // A helper class for readability
    static class EventList extends ArrayList<Event> {
        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());
    }
}