aboutsummaryrefslogtreecommitdiffstats
path: root/tests/src
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src')
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java (renamed from tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelTests.java)38
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelLxxTests.java97
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java7
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java33
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java337
-rw-r--r--tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java3
-rw-r--r--tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java4
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Arabic.java11
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java12
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Dvorak.java5
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Farsi.java18
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/HindiCompact.java21
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Khmer.java2
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Lao.java2
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java25
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Marathi.java179
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Myanmar.java14
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/NepaliRomanized.java2
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Symbols.java2
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java3
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Thai.java2
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractKeyboardBuilder.java15
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java6
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/expected/ActualKeyboardBuilder.java15
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKey.java6
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKeyboardBuilder.java15
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishCustomizer.java16
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/tests/LayoutTestsBase.java10
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java4
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java37
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java4
-rw-r--r--tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java206
-rw-r--r--tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java666
-rw-r--r--tests/src/com/android/inputmethod/latin/DistracterFilterTest.java151
-rw-r--r--tests/src/com/android/inputmethod/latin/InputLogicTests.java45
-rw-r--r--tests/src/com/android/inputmethod/latin/InputLogicTestsLanguageWithoutSpaces.java2
-rw-r--r--tests/src/com/android/inputmethod/latin/InputLogicTestsNonEnglish.java15
-rw-r--r--tests/src/com/android/inputmethod/latin/InputLogicTestsReorderingMyanmar.java234
-rw-r--r--tests/src/com/android/inputmethod/latin/InputTestsBase.java19
-rw-r--r--tests/src/com/android/inputmethod/latin/LatinImeStressTests.java7
-rw-r--r--tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java62
-rw-r--r--tests/src/com/android/inputmethod/latin/ShiftModeTests.java53
-rw-r--r--tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java14
-rw-r--r--tests/src/com/android/inputmethod/latin/WordComposerTests.java49
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java54
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java3
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java2
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java2
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/FusionDictionary.java11
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoder.java9
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoderTests.java2
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java5
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java44
-rw-r--r--tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java117
-rw-r--r--tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java33
-rw-r--r--tests/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerServiceTest.java19
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/AsyncResultHolderTests.java8
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/BinaryDictionaryUtilsTests.java2
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/ExecutorUtilsTests.java57
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutorTests.java105
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/RecapitalizeStatusTests.java26
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java10
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/SpacebarLanguagetUtilsTests.java2
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/StringAndJsonUtilsTests.java24
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtilsTests.java2
-rw-r--r--tests/src/com/android/inputmethod/research/MotionEventReaderTests.java171
66 files changed, 2347 insertions, 829 deletions
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java
index 06139b808..96f925554 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java
@@ -29,9 +29,14 @@ import com.android.inputmethod.latin.utils.RunInLocale;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
@MediumTest
-public final class KeyboardLayoutSetActionLabelTests extends KeyboardLayoutSetTestsBase {
+public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetTestsBase {
+ @Override
+ protected int getKeyboardThemeForTests() {
+ return KeyboardTheme.THEME_ID_KLP;
+ }
+
private static void doTestActionKey(final String tag, final KeyboardLayoutSet layoutSet,
- final int elementId, final String label, final int iconId) {
+ final int elementId, final CharSequence label, final int iconId) {
final Keyboard keyboard = layoutSet.getKeyboard(elementId);
final Key enterKey = keyboard.getKey(Constants.CODE_ENTER);
assertNotNull(tag + " enter key on " + keyboard.mId, enterKey);
@@ -39,7 +44,7 @@ public final class KeyboardLayoutSetActionLabelTests extends KeyboardLayoutSetTe
assertEquals(tag + " enter icon " + enterKey, iconId, enterKey.getIconId());
}
- private void doTestActionLabel(final String tag, final InputMethodSubtype subtype,
+ protected void doTestActionLabel(final String tag, final InputMethodSubtype subtype,
final int actionId, final int labelResId) {
final EditorInfo editorInfo = new EditorInfo();
editorInfo.imeOptions = actionId;
@@ -57,6 +62,11 @@ public final class KeyboardLayoutSetActionLabelTests extends KeyboardLayoutSetTe
} else {
label = job.runInLocale(res, SubtypeLocaleUtils.getSubtypeLocale(subtype));
}
+ doTestActionLabel(tag, subtype, editorInfo, label);
+ }
+
+ protected void doTestActionLabel(final String tag, final InputMethodSubtype subtype,
+ final EditorInfo editorInfo, final CharSequence label) {
// Test text layouts.
editorInfo.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
final KeyboardLayoutSet layoutSet = createKeyboardLayoutSet(subtype, editorInfo);
@@ -82,7 +92,7 @@ public final class KeyboardLayoutSetActionLabelTests extends KeyboardLayoutSetTe
label, KeyboardIconsSet.ICON_UNDEFINED);
}
- private void doTestActionKeyIcon(final String tag, final InputMethodSubtype subtype,
+ protected void doTestActionKeyIcon(final String tag, final InputMethodSubtype subtype,
final int actionId, final String iconName) {
final int iconId = KeyboardIconsSet.getIconId(iconName);
final EditorInfo editorInfo = new EditorInfo();
@@ -111,14 +121,16 @@ public final class KeyboardLayoutSetActionLabelTests extends KeyboardLayoutSetTe
for (final InputMethodSubtype subtype : getAllSubtypesList()) {
final String tag = "unspecifiled "
+ SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_UNSPECIFIED, "enter_key");
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_UNSPECIFIED,
+ KeyboardIconsSet.NAME_ENTER_KEY);
}
}
public void testActionNone() {
for (final InputMethodSubtype subtype : getAllSubtypesList()) {
final String tag = "none " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_NONE, "enter_key");
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_NONE,
+ KeyboardIconsSet.NAME_ENTER_KEY);
}
}
@@ -132,7 +144,8 @@ public final class KeyboardLayoutSetActionLabelTests extends KeyboardLayoutSetTe
public void testActionSearch() {
for (final InputMethodSubtype subtype : getAllSubtypesList()) {
final String tag = "search " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_SEARCH, "search_key");
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_SEARCH,
+ KeyboardIconsSet.NAME_SEARCH_KEY);
}
}
@@ -164,4 +177,15 @@ public final class KeyboardLayoutSetActionLabelTests extends KeyboardLayoutSetTe
tag, subtype, EditorInfo.IME_ACTION_PREVIOUS, R.string.label_previous_key);
}
}
+
+ public void testActionCustom() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "custom " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ final CharSequence customLabel = "customLabel";
+ final EditorInfo editorInfo = new EditorInfo();
+ editorInfo.imeOptions = EditorInfo.IME_ACTION_UNSPECIFIED;
+ editorInfo.actionLabel = customLabel;
+ doTestActionLabel(tag, subtype, editorInfo, customLabel);
+ }
+ }
}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelLxxTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelLxxTests.java
new file mode 100644
index 000000000..7747ac5f9
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelLxxTests.java
@@ -0,0 +1,97 @@
+/*
+ * 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.keyboard;
+
+import android.test.suitebuilder.annotation.MediumTest;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
+import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
+
+@MediumTest
+public class KeyboardLayoutSetActionLabelLxxTests extends KeyboardLayoutSetActionLabelKlpTests {
+ @Override
+ protected int getKeyboardThemeForTests() {
+ return KeyboardTheme.THEME_ID_LXX_DARK;
+ }
+
+ @Override
+ public void testActionUnspecified() {
+ super.testActionUnspecified();
+ }
+
+ @Override
+ public void testActionNone() {
+ super.testActionNone();
+ }
+
+ @Override
+ public void testActionGo() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "go " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_GO,
+ KeyboardIconsSet.NAME_GO_KEY);
+ }
+ }
+
+ @Override
+ public void testActionSearch() {
+ super.testActionSearch();
+ }
+
+ @Override
+ public void testActionSend() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "send " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_SEND,
+ KeyboardIconsSet.NAME_SEND_KEY);
+ }
+ }
+
+ @Override
+ public void testActionNext() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "next " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_NEXT,
+ KeyboardIconsSet.NAME_NEXT_KEY);
+ }
+ }
+
+ @Override
+ public void testActionDone() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "done " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_DONE,
+ KeyboardIconsSet.NAME_DONE_KEY);
+ }
+ }
+
+ @Override
+ public void testActionPrevious() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "previous " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_PREVIOUS,
+ KeyboardIconsSet.NAME_PREVIOUS_KEY);
+ }
+ }
+
+ @Override
+ public void testActionCustom() {
+ super.testActionCustom();
+ }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
index e4aaf0317..bf19a8b46 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
@@ -25,10 +25,15 @@ import java.util.ArrayList;
@SmallTest
public class KeyboardLayoutSetSubtypesCountTests extends KeyboardLayoutSetTestsBase {
- private static final int NUMBER_OF_SUBTYPES = 70;
+ private static final int NUMBER_OF_SUBTYPES = 68;
private static final int NUMBER_OF_ASCII_CAPABLE_SUBTYPES = 45;
private static final int NUMBER_OF_PREDEFINED_ADDITIONAL_SUBTYPES = 2;
+ @Override
+ protected int getKeyboardThemeForTests() {
+ return KeyboardTheme.THEME_ID_KLP;
+ }
+
private static String toString(final ArrayList<InputMethodSubtype> subtypeList) {
final StringBuilder sb = new StringBuilder();
for (int index = 0; index < subtypeList.size(); index++) {
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java
index 0fb6ff2b4..ab7d1b28d 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard;
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
import android.view.ContextThemeWrapper;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodInfo;
@@ -31,34 +30,31 @@ import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.RichInputMethodManager;
import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils;
-import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.ResourceUtils;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import java.util.ArrayList;
import java.util.Locale;
-@SmallTest
-public class KeyboardLayoutSetTestsBase extends AndroidTestCase {
- private static final KeyboardTheme DEFAULT_KEYBOARD_THEME =
- KeyboardTheme.getDefaultKeyboardTheme();
-
+public abstract class KeyboardLayoutSetTestsBase extends AndroidTestCase {
// All input method subtypes of LatinIME.
- private final ArrayList<InputMethodSubtype> mAllSubtypesList = CollectionUtils.newArrayList();
- private final ArrayList<InputMethodSubtype> mAsciiCapableSubtypesList =
- CollectionUtils.newArrayList();
- private final ArrayList<InputMethodSubtype> mAdditionalSubtypesList =
- CollectionUtils.newArrayList();
+ private final ArrayList<InputMethodSubtype> mAllSubtypesList = new ArrayList<>();
+ private final ArrayList<InputMethodSubtype> mAsciiCapableSubtypesList = new ArrayList<>();
+ private final ArrayList<InputMethodSubtype> mAdditionalSubtypesList = new ArrayList<>();
private Context mThemeContext;
private int mScreenMetrics;
+ protected abstract int getKeyboardThemeForTests();
+
@Override
protected void setUp() throws Exception {
super.setUp();
mScreenMetrics = mContext.getResources().getInteger(R.integer.config_screen_metrics);
- mThemeContext = new ContextThemeWrapper(mContext, DEFAULT_KEYBOARD_THEME.mStyleId);
+ final KeyboardTheme keyboardTheme = KeyboardTheme.searchKeyboardThemeById(
+ getKeyboardThemeForTests());
+ mThemeContext = new ContextThemeWrapper(mContext, keyboardTheme.mStyleId);
RichInputMethodManager.init(mThemeContext);
final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
@@ -118,13 +114,13 @@ public class KeyboardLayoutSetTestsBase extends AndroidTestCase {
protected final KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype,
final EditorInfo editorInfo) {
- return createKeyboardLayoutSet(subtype, editorInfo, false /* isShortcutImeEnabled */,
- false /* showsVoiceInputKey */, false /* isLanguageSwitchKeyEnabled */);
+ return createKeyboardLayoutSet(subtype, editorInfo, false /* voiceInputKeyEnabled */,
+ false /* languageSwitchKeyEnabled */);
}
protected final KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype,
- final EditorInfo editorInfo, final boolean isShortcutImeEnabled,
- final boolean showsVoiceInputKey, final boolean isLanguageSwitchKeyEnabled) {
+ final EditorInfo editorInfo, final boolean voiceInputKeyEnabled,
+ final boolean languageSwitchKeyEnabled) {
final Context context = mThemeContext;
final Resources res = context.getResources();
final int keyboardWidth = ResourceUtils.getDefaultKeyboardWidth(res);
@@ -132,7 +128,8 @@ public class KeyboardLayoutSetTestsBase extends AndroidTestCase {
final Builder builder = new Builder(context, editorInfo);
builder.setKeyboardGeometry(keyboardWidth, keyboardHeight)
.setSubtype(subtype)
- .setOptions(isShortcutImeEnabled, showsVoiceInputKey, isLanguageSwitchKeyEnabled);
+ .setVoiceInputKeyEnabled(voiceInputKeyEnabled)
+ .setLanguageSwitchKeyEnabled(languageSwitchKeyEnabled);
return builder.build();
}
}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java
new file mode 100644
index 000000000..f9d98afa2
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java
@@ -0,0 +1,337 @@
+/*
+ * 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.keyboard;
+
+import android.content.SharedPreferences;
+import android.os.Build.VERSION_CODES;
+import android.preference.PreferenceManager;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+@SmallTest
+public class KeyboardThemeTests extends AndroidTestCase {
+ private SharedPreferences mPrefs;
+
+ // TODO: Remove this constant once the *next* version becomes available.
+ private static final int VERSION_CODES_LXX = VERSION_CODES.CUR_DEVELOPMENT;
+
+ private static final int THEME_ID_NULL = -1;
+ private static final int THEME_ID_UNKNOWN = -2;
+ private static final int THEME_ID_ILLEGAL = -3;
+ private static final String ILLEGAL_THEME_ID_STRING = "ThisCausesNumberFormatExecption";
+ private static final int THEME_ID_ICS = KeyboardTheme.THEME_ID_ICS;
+ private static final int THEME_ID_KLP = KeyboardTheme.THEME_ID_KLP;
+ private static final int THEME_ID_LXX_DARK = KeyboardTheme.THEME_ID_LXX_DARK;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(getContext());
+ }
+
+ /*
+ * Helper functions.
+ */
+
+ private static boolean isValidKeyboardThemeId(final int themeId) {
+ switch (themeId) {
+ case THEME_ID_ICS:
+ case THEME_ID_KLP:
+ case THEME_ID_LXX_DARK:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ private void setKeyboardThemePreference(final String prefKey, final int themeId) {
+ final String themeIdString = Integer.toString(themeId);
+ if (isValidKeyboardThemeId(themeId) || themeId == THEME_ID_UNKNOWN) {
+ // Set valid theme id to preference.
+ mPrefs.edit().putString(prefKey, themeIdString).apply();
+ return;
+ }
+ if (themeId == THEME_ID_NULL) {
+ // Simulate undefined preference.
+ mPrefs.edit().remove(prefKey).apply();
+ return;
+ }
+ // themeId == THEME_ID_ILLEGAL
+ // Simulate illegal format theme id in preference.
+ mPrefs.edit().putString(prefKey, ILLEGAL_THEME_ID_STRING).apply();
+ }
+
+ private void assertKeyboardTheme(final int sdkVersion, final int expectedThemeId) {
+ assertEquals(expectedThemeId, KeyboardTheme.getKeyboardTheme(mPrefs, sdkVersion).mThemeId);
+ }
+
+ /*
+ * Test keyboard theme preference on the same platform version and the same keyboard version.
+ */
+
+ private void assertKeyboardThemePreference(final int sdkVersion, final int previousThemeId,
+ final int expectedThemeId) {
+ // Clear preferences before testing.
+ setKeyboardThemePreference(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, THEME_ID_NULL);
+ setKeyboardThemePreference(KeyboardTheme.LXX_KEYBOARD_THEME_KEY, THEME_ID_NULL);
+ // Set the preference of the sdkVersion to previousThemeId.
+ final String prefKey = KeyboardTheme.getPreferenceKey(sdkVersion);
+ setKeyboardThemePreference(prefKey, previousThemeId);
+ assertKeyboardTheme(sdkVersion, expectedThemeId);
+ }
+
+ private void assertKeyboardThemePreferenceOnKlp(final int sdkVersion) {
+ final int defaultThemeId = THEME_ID_KLP;
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_NULL, defaultThemeId);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_LXX_DARK, THEME_ID_LXX_DARK);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_UNKNOWN, defaultThemeId);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_ILLEGAL, defaultThemeId);
+ }
+
+ public void testKeyboardThemePreferenceOnKlp() {
+ assertKeyboardThemePreferenceOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH);
+ assertKeyboardThemePreferenceOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
+ assertKeyboardThemePreferenceOnKlp(VERSION_CODES.JELLY_BEAN);
+ assertKeyboardThemePreferenceOnKlp(VERSION_CODES.JELLY_BEAN_MR1);
+ assertKeyboardThemePreferenceOnKlp(VERSION_CODES.JELLY_BEAN_MR2);
+ assertKeyboardThemePreferenceOnKlp(VERSION_CODES.KITKAT);
+ }
+
+ private void assertKeyboardThemePreferenceOnLxx(final int sdkVersion) {
+ final int defaultThemeId = THEME_ID_LXX_DARK;
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_NULL, defaultThemeId);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_LXX_DARK, THEME_ID_LXX_DARK);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_UNKNOWN, defaultThemeId);
+ assertKeyboardThemePreference(sdkVersion, THEME_ID_ILLEGAL, defaultThemeId);
+ }
+
+ public void testKeyboardThemePreferenceOnLxx() {
+ assertKeyboardThemePreferenceOnLxx(VERSION_CODES_LXX);
+ }
+
+ /*
+ * Test default keyboard theme based on the platform version.
+ */
+
+ private void assertDefaultKeyboardTheme(final int sdkVersion, final int previousThemeId,
+ final int expectedThemeId) {
+ final String oldPrefKey = KeyboardTheme.KLP_KEYBOARD_THEME_KEY;
+ setKeyboardThemePreference(oldPrefKey, previousThemeId);
+
+ final KeyboardTheme defaultTheme =
+ KeyboardTheme.getDefaultKeyboardTheme(mPrefs, sdkVersion);
+
+ assertNotNull(defaultTheme);
+ assertEquals(expectedThemeId, defaultTheme.mThemeId);
+ if (sdkVersion <= VERSION_CODES.KITKAT) {
+ // Old preference must be retained if it is valid. Otherwise it must be pruned.
+ assertEquals(isValidKeyboardThemeId(previousThemeId), mPrefs.contains(oldPrefKey));
+ return;
+ }
+ // Old preference must be removed.
+ assertFalse(mPrefs.contains(oldPrefKey));
+ }
+
+ private void assertDefaultKeyboardThemeOnKlp(final int sdkVersion) {
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_NULL, THEME_ID_KLP);
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_KLP);
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_KLP);
+ }
+
+ public void testDefaultKeyboardThemeOnKlp() {
+ assertDefaultKeyboardThemeOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH);
+ assertDefaultKeyboardThemeOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
+ assertDefaultKeyboardThemeOnKlp(VERSION_CODES.JELLY_BEAN);
+ assertDefaultKeyboardThemeOnKlp(VERSION_CODES.JELLY_BEAN_MR1);
+ assertDefaultKeyboardThemeOnKlp(VERSION_CODES.JELLY_BEAN_MR2);
+ assertDefaultKeyboardThemeOnKlp(VERSION_CODES.KITKAT);
+ }
+
+ private void assertDefaultKeyboardThemeOnLxx(final int sdkVersion) {
+ // Forced to switch to LXX theme.
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_NULL, THEME_ID_LXX_DARK);
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ICS, THEME_ID_LXX_DARK);
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_KLP, THEME_ID_LXX_DARK);
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_DARK);
+ assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_DARK);
+ }
+
+ public void testDefaultKeyboardThemeOnLxx() {
+ assertDefaultKeyboardThemeOnLxx(VERSION_CODES_LXX);
+ }
+
+ /*
+ * Test keyboard theme preference while upgrading the keyboard that doesn't support LXX theme
+ * to the keyboard that supports LXX theme.
+ */
+
+ private void assertUpgradeKeyboardToLxxOn(final int sdkVersion, final int previousThemeId,
+ final int expectedThemeId) {
+ setKeyboardThemePreference(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, previousThemeId);
+ // Clean up new keyboard theme preference to simulate "upgrade to LXX keyboard".
+ setKeyboardThemePreference(KeyboardTheme.LXX_KEYBOARD_THEME_KEY, THEME_ID_NULL);
+
+ final KeyboardTheme theme = KeyboardTheme.getKeyboardTheme(mPrefs, sdkVersion);
+
+ assertNotNull(theme);
+ assertEquals(expectedThemeId, theme.mThemeId);
+ if (sdkVersion <= VERSION_CODES.KITKAT) {
+ // New preference must not exist.
+ assertFalse(mPrefs.contains(KeyboardTheme.LXX_KEYBOARD_THEME_KEY));
+ // Old preference must be retained if it is valid. Otherwise it must be pruned.
+ assertEquals(isValidKeyboardThemeId(previousThemeId),
+ mPrefs.contains(KeyboardTheme.KLP_KEYBOARD_THEME_KEY));
+ if (isValidKeyboardThemeId(previousThemeId)) {
+ // Old preference must have an expected value.
+ assertEquals(mPrefs.getString(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, null),
+ Integer.toString(expectedThemeId));
+ }
+ return;
+ }
+ // Old preference must be removed.
+ assertFalse(mPrefs.contains(KeyboardTheme.KLP_KEYBOARD_THEME_KEY));
+ // New preference must not exist.
+ assertFalse(mPrefs.contains(KeyboardTheme.LXX_KEYBOARD_THEME_KEY));
+ }
+
+ private void assertUpgradeKeyboardToLxxOnKlp(final int sdkVersion) {
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_NULL, THEME_ID_KLP);
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_KLP);
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_KLP);
+ }
+
+ // Upgrading keyboard on I,J and K.
+ public void testUpgradeKeyboardToLxxOnKlp() {
+ assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH);
+ assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
+ assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.JELLY_BEAN);
+ assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.JELLY_BEAN_MR1);
+ assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.JELLY_BEAN_MR2);
+ assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.KITKAT);
+ }
+
+ private void assertUpgradeKeyboardToLxxOnLxx(final int sdkVersion) {
+ // Forced to switch to LXX theme.
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_NULL, THEME_ID_LXX_DARK);
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ICS, THEME_ID_LXX_DARK);
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_KLP, THEME_ID_LXX_DARK);
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_DARK);
+ assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_DARK);
+ }
+
+ // Upgrading keyboard on L.
+ public void testUpgradeKeyboardToLxxOnLxx() {
+ assertUpgradeKeyboardToLxxOnLxx(VERSION_CODES_LXX);
+ }
+
+ /*
+ * Test keyboard theme preference while upgrading platform version.
+ */
+
+ private void assertUpgradePlatformFromTo(final int oldSdkVersion, final int newSdkVersion,
+ final int previousThemeId, final int expectedThemeId) {
+ if (newSdkVersion < oldSdkVersion) {
+ // No need to test.
+ return;
+ }
+ // Clean up preferences.
+ setKeyboardThemePreference(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, THEME_ID_NULL);
+ setKeyboardThemePreference(KeyboardTheme.LXX_KEYBOARD_THEME_KEY, THEME_ID_NULL);
+
+ final String oldPrefKey = KeyboardTheme.getPreferenceKey(oldSdkVersion);
+ setKeyboardThemePreference(oldPrefKey, previousThemeId);
+
+ assertKeyboardTheme(newSdkVersion, expectedThemeId);
+ }
+
+ private void assertUpgradePlatformFromKlpToKlp(final int oldSdkVersion,
+ final int newSdkVersion) {
+ assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_KLP);
+ assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_ICS, THEME_ID_ICS);
+ assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_KLP, THEME_ID_KLP);
+ assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_KLP);
+ assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_KLP);
+ }
+
+ private void assertUpgradePlatformToKlpFrom(final int oldSdkVersion) {
+ assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.ICE_CREAM_SANDWICH);
+ assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
+ assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.JELLY_BEAN);
+ assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.JELLY_BEAN_MR1);
+ assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.JELLY_BEAN_MR2);
+ assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.KITKAT);
+ }
+
+ // Update platform from I,J, and K to I,J, and K
+ public void testUpgradePlatformToKlpFromKlp() {
+ assertUpgradePlatformToKlpFrom(VERSION_CODES.ICE_CREAM_SANDWICH);
+ assertUpgradePlatformToKlpFrom(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
+ assertUpgradePlatformToKlpFrom(VERSION_CODES.JELLY_BEAN);
+ assertUpgradePlatformToKlpFrom(VERSION_CODES.JELLY_BEAN_MR1);
+ assertUpgradePlatformToKlpFrom(VERSION_CODES.JELLY_BEAN_MR2);
+ assertUpgradePlatformToKlpFrom(VERSION_CODES.KITKAT);
+ }
+
+ private void assertUpgradePlatformToLxxFrom(final int oldSdkVersion) {
+ // Forced to switch to LXX theme.
+ final int newSdkVersion = VERSION_CODES_LXX;
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_LXX_DARK);
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_ICS, THEME_ID_LXX_DARK);
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_KLP, THEME_ID_LXX_DARK);
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_DARK);
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_DARK);
+ }
+
+ // Update platform from I,J, and K to L
+ public void testUpgradePlatformToLxx() {
+ assertUpgradePlatformToLxxFrom(VERSION_CODES.ICE_CREAM_SANDWICH);
+ assertUpgradePlatformToLxxFrom(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
+ assertUpgradePlatformToLxxFrom(VERSION_CODES.JELLY_BEAN);
+ assertUpgradePlatformToLxxFrom(VERSION_CODES.JELLY_BEAN_MR1);
+ assertUpgradePlatformToLxxFrom(VERSION_CODES.JELLY_BEAN_MR2);
+ assertUpgradePlatformToLxxFrom(VERSION_CODES.KITKAT);
+ }
+
+ // Update platform from L to L.
+ public void testUpgradePlatformToLxxFromLxx() {
+ final int oldSdkVersion = VERSION_CODES_LXX;
+ final int newSdkVersion = VERSION_CODES_LXX;
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_LXX_DARK);
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_ICS, THEME_ID_ICS);
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_KLP, THEME_ID_KLP);
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_DARK);
+ assertUpgradePlatformFromTo(
+ oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_DARK);
+ }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java
index eb906cd9f..72211015f 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java
@@ -23,7 +23,6 @@ import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.latin.RichInputMethodManager;
-import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import java.util.ArrayList;
@@ -42,7 +41,7 @@ public final class KeyboardTextsSetTests extends AndroidTestCase {
RichInputMethodManager.init(getContext());
final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
- final ArrayList<InputMethodSubtype> allSubtypesList = CollectionUtils.newArrayList();
+ final ArrayList<InputMethodSubtype> allSubtypesList = new ArrayList<>();
final InputMethodInfo imi = richImm.getInputMethodInfoOfThisIme();
final int subtypeCount = imi.getSubtypeCount();
for (int index = 0; index < subtypeCount; index++) {
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
index 514ad1cf0..29b169d80 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
@@ -22,8 +22,6 @@ import android.content.res.Resources;
import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.MediumTest;
-import com.android.inputmethod.latin.utils.CollectionUtils;
-
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
@@ -53,7 +51,7 @@ public class MoreKeySpecSplitTests extends InstrumentationTestCase {
}
private static String[] getAllResourceIdNames(final Class<?> resourceIdClass) {
- final ArrayList<String> names = CollectionUtils.newArrayList();
+ final ArrayList<String> names = new ArrayList<>();
for (final Field field : resourceIdClass.getFields()) {
if (field.getType() == Integer.TYPE) {
names.add(field.getName());
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java b/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
index b0493d3f1..fa818654e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
@@ -74,7 +74,12 @@ public final class Arabic extends LayoutBase {
// U+060C: "،" ARABIC COMMA
return joinKeys(key("\u060C", SETTINGS_KEY));
}
- return super.getKeysLeftToSpacebar(isPhone);
+ // U+060C: "،" ARABIC COMMA
+ // U+061F: "؟" ARABIC QUESTION MARK
+ // U+061B: "؛" ARABIC SEMICOLON
+ return joinKeys(key("\u060C", joinMoreKeys(
+ ":", "!", "\u061F", "\u061B", "-", "\"", "'", SETTINGS_KEY)),
+ "_");
}
@Override
@@ -85,9 +90,7 @@ public final class Arabic extends LayoutBase {
// U+060C: "،" ARABIC COMMA
// U+061F: "؟" ARABIC QUESTION MARK
// U+061B: "؛" ARABIC SEMICOLON
- return joinKeys(
- key("\u060C", joinMoreKeys(":", "!", "\u061F", "\u061B", "-", "/", "\"", "'")),
- key(".", getPunctuationMoreKeys(isPhone)));
+ return joinKeys("/", key(".", getPunctuationMoreKeys(isPhone)));
}
@Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java b/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
index 204bb01f7..eb64b832b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
@@ -56,11 +56,19 @@ public final class ArmenianPhonetic extends LayoutBase {
}
@Override
+ public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
+ // U+002C: "," COMMA
+ // U+055D: "՝" ARMENIAN COMMA
+ return isPhone ? joinKeys(key("\u002C", SETTINGS_KEY))
+ : joinKeys(key("\u055D", SETTINGS_KEY), "_");
+ }
+
+ @Override
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
// U+0589: "։" ARMENIAN FULL STOP
// U+055D: "՝" ARMENIAN COMMA
final ExpectedKey fullStopKey = key("\u0589", getPunctuationMoreKeys(isPhone));
- return isPhone ? joinKeys(fullStopKey) : joinKeys("\u055D", fullStopKey);
+ return isPhone ? joinKeys(fullStopKey) : joinKeys("/", fullStopKey);
}
@Override
@@ -121,7 +129,7 @@ public final class ArmenianPhonetic extends LayoutBase {
} else {
builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
.addKeysOnTheRightOfRow(3, ENTER_KEY)
- .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey(), SETTINGS_KEY)
+ .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(5, EMOJI_KEY);
}
builder.addKeysOnTheLeftOfRow(4, (Object[])customizer.getLeftShiftKeys(isPhone))
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Dvorak.java b/tests/src/com/android/inputmethod/keyboard/layout/Dvorak.java
index 99cf6e50e..e75cfd0ff 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Dvorak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Dvorak.java
@@ -51,7 +51,8 @@ public final class Dvorak extends LayoutBase {
@Override
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
- return isPhone ? joinKeys(key("q", SHORTCUT_KEY, SETTINGS_KEY)) : joinKeys(key("/"));
+ return isPhone ? joinKeys(key("q", SETTINGS_KEY)) :
+ joinKeys(SETTINGS_KEY, key("_", moreKey("-")));
}
@Override
@@ -60,7 +61,7 @@ public final class Dvorak extends LayoutBase {
convertToAdditionalMoreKeys(getPunctuationMoreKeys(isPhone));
return isPhone
? joinKeys(key("z", punctuationMoreKeys))
- : joinKeys(key("?", moreKey("!")), key("-", moreKey("_")));
+ : joinKeys("/", key("?", moreKey("!")));
}
private static ExpectedAdditionalMoreKey[] convertToAdditionalMoreKeys(
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java b/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java
index a0070891a..a513740e7 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java
@@ -72,7 +72,13 @@ public final class Farsi extends LayoutBase {
// U+060C: "،" ARABIC COMMA
return joinKeys(key("\u060C", SETTINGS_KEY));
}
- return super.getKeysLeftToSpacebar(isPhone);
+ // U+060C: "،" ARABIC COMMA
+ // U+061F: "؟" ARABIC QUESTION MARK
+ // U+061B: "؛" ARABIC SEMICOLON
+ return joinKeys(key("\u060C", joinMoreKeys(
+ ":", "!", "\u061F", "\u061B", "-", RtlSymbols.DOUBLE_ANGLE_QUOTES_LR_RTL,
+ SETTINGS_KEY)),
+ "_");
}
@Override
@@ -80,18 +86,12 @@ public final class Farsi extends LayoutBase {
if (isPhone) {
return super.getKeysRightToSpacebar(isPhone);
}
- // U+060C: "،" ARABIC COMMA
- // U+061F: "؟" ARABIC QUESTION MARK
- // U+061B: "؛" ARABIC SEMICOLON
- return joinKeys(
- key("\u060C", joinMoreKeys(":", "!", "\u061F", "\u061B", "-", "/",
- RtlSymbols.DOUBLE_ANGLE_QUOTES_LR_RTL)),
- key(".", getPunctuationMoreKeys(isPhone)));
+ return joinKeys("/", key(".", getPunctuationMoreKeys(isPhone)));
}
@Override
public ExpectedKey[] getSpaceKeys(final boolean isPhone) {
- return joinKeys(SPACE_KEY, key(ZWNJ_KEY, ZWJ_KEY));
+ return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY, key(ZWNJ_KEY, ZWJ_KEY));
}
@Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/HindiCompact.java b/tests/src/com/android/inputmethod/keyboard/layout/HindiCompact.java
index afd26e428..a7f682340 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/HindiCompact.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/HindiCompact.java
@@ -16,29 +16,12 @@
package com.android.inputmethod.keyboard.layout;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.SIGN_ANUSVARA;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.SIGN_CANDRABINDU;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.SIGN_NUKTA;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.SIGN_VIRAMA;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.SIGN_VISARGA;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_AA;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_AI;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_AU;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_CANDRA_E;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_CANDRA_O;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_E;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_I;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_II;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_O;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_U;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_UU;
-import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.VOWEL_SIGN_VOCALIC_R;
+import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.*;
import com.android.inputmethod.keyboard.layout.Hindi.HindiCustomizer;
import com.android.inputmethod.keyboard.layout.Hindi.HindiSymbols;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
-import com.android.inputmethod.latin.Constants;
import java.util.Locale;
@@ -67,7 +50,7 @@ public final class HindiCompact extends LayoutBase {
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
// U+0964: "।" DEVANAGARI DANDA
final ExpectedKey periodKey = key("\u0964", getPunctuationMoreKeys(isPhone));
- return isPhone ? joinKeys(periodKey) : joinKeys(",", periodKey);
+ return isPhone ? joinKeys(periodKey) : joinKeys("/", periodKey);
}
@Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java b/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java
index e7f6a6552..143ccf6eb 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java
@@ -94,7 +94,7 @@ public final class Khmer extends LayoutBase {
} else {
builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
.addKeysOnTheRightOfRow(3, ENTER_KEY)
- .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey(), SETTINGS_KEY)
+ .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(5, EMOJI_KEY);
}
builder.addKeysOnTheLeftOfRow(4, (Object[])customizer.getLeftShiftKeys(isPhone))
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Lao.java b/tests/src/com/android/inputmethod/keyboard/layout/Lao.java
index 6f2ef216f..e7be9982a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Lao.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Lao.java
@@ -98,7 +98,7 @@ public final class Lao extends LayoutBase {
} else {
builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
.addKeysOnTheRightOfRow(3, ENTER_KEY)
- .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey(), SETTINGS_KEY)
+ .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(5, EMOJI_KEY);
}
builder.addKeysOnTheLeftOfRow(4, (Object[])customizer.getLeftShiftKeys(isPhone))
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java b/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
index 4123a22ef..c5223720c 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
@@ -29,7 +29,6 @@ import java.util.Locale;
* The base class of keyboard layout.
*/
public abstract class LayoutBase extends AbstractLayoutBase {
-
/**
* This class is used to customize common keyboard layout to language specific layout.
*/
@@ -152,7 +151,7 @@ public abstract class LayoutBase extends AbstractLayoutBase {
* keyboard.
*/
public ExpectedKey[] getSpaceKeys(final boolean isPhone) {
- return joinKeys(SPACE_KEY);
+ return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY);
}
/**
@@ -161,7 +160,9 @@ public abstract class LayoutBase extends AbstractLayoutBase {
* @return the array of {@link ExpectedKey} that should be placed at left of the spacebar.
*/
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
- return isPhone ? joinKeys(key(",", SETTINGS_KEY)) : joinKeys("/");
+ // U+002C: "," COMMA
+ return isPhone ? joinKeys(key("\u002C", SETTINGS_KEY))
+ : joinKeys(key("\u002C", SETTINGS_KEY), "_");
}
/**
@@ -171,7 +172,7 @@ public abstract class LayoutBase extends AbstractLayoutBase {
*/
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
final ExpectedKey periodKey = key(".", getPunctuationMoreKeys(isPhone));
- return isPhone ? joinKeys(periodKey) : joinKeys(",", periodKey);
+ return isPhone ? joinKeys(periodKey) : joinKeys("/", periodKey);
}
/**
@@ -296,7 +297,7 @@ public abstract class LayoutBase extends AbstractLayoutBase {
} else {
builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
.addKeysOnTheRightOfRow(2, ENTER_KEY)
- .addKeysOnTheLeftOfRow(4, customizer.getSymbolsKey(), SETTINGS_KEY)
+ .addKeysOnTheLeftOfRow(4, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(4, EMOJI_KEY);
}
builder.addKeysOnTheLeftOfRow(3, (Object[])customizer.getLeftShiftKeys(isPhone))
@@ -306,6 +307,10 @@ public abstract class LayoutBase extends AbstractLayoutBase {
/**
* Get common alphabet layout. This layout doesn't contain any special keys.
+ *
+ * A keyboard layout is an array of rows, and a row consists of an array of
+ * {@link ExpectedKey}s. Each row may have different number of {@link ExpectedKey}s.
+ *
* @param isPhone true if requesting phone's layout.
* @return the common alphabet keyboard layout.
*/
@@ -313,6 +318,10 @@ public abstract class LayoutBase extends AbstractLayoutBase {
/**
* Get common alphabet shifted layout. This layout doesn't contain any special keys.
+ *
+ * A keyboard layout is an array of rows, and a row consists of an array of
+ * {@link ExpectedKey}s. Each row may have different number of {@link ExpectedKey}s.
+ *
* @param isPhone true if requesting phone's layout.
* @param elementId the element id of the requesting shifted mode.
* @return the common alphabet shifted keyboard layout.
@@ -327,9 +336,13 @@ public abstract class LayoutBase extends AbstractLayoutBase {
/**
* Get the complete expected keyboard layout.
+ *
+ * A keyboard layout is an array of rows, and a row consists of an array of
+ * {@link ExpectedKey}s. Each row may have different number of {@link ExpectedKey}s.
+ *
* @param isPhone true if requesting phone's layout.
* @param elementId the element id of the requesting keyboard mode.
- * @return
+ * @return the keyboard layout of the <code>elementId</code>.
*/
public ExpectedKey[][] getLayout(final boolean isPhone, final int elementId) {
if (elementId == KeyboardId.ELEMENT_SYMBOLS) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Marathi.java b/tests/src/com/android/inputmethod/keyboard/layout/Marathi.java
new file mode 100644
index 000000000..00cf838f9
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Marathi.java
@@ -0,0 +1,179 @@
+/*
+ * 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.keyboard.layout;
+
+import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.*;
+
+import com.android.inputmethod.keyboard.layout.Hindi.HindiCustomizer;
+import com.android.inputmethod.keyboard.layout.Hindi.HindiSymbols;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * The Marathi keyboard.
+ */
+public final class Marathi extends LayoutBase {
+ private static final String LAYOUT_NAME = "marathi";
+
+ public Marathi(final LayoutCustomizer customizer) {
+ super(customizer, HindiSymbols.class, SymbolsShifted.class);
+ }
+
+ @Override
+ public String getName() { return LAYOUT_NAME; }
+
+ public static class MarathiCustomizer extends HindiCustomizer {
+ public MarathiCustomizer(final Locale locale) { super(locale); }
+
+ @Override
+ public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
+ return EMPTY_KEYS;
+ }
+ }
+
+ @Override
+ ExpectedKey[][] getCommonAlphabetLayout(boolean isPhone) { return ALPHABET_COMMON; }
+
+ @Override
+ ExpectedKey[][] getCommonAlphabetShiftLayout(final boolean isPhone, final int elementId) {
+ return null;
+ }
+
+ private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+ .setKeysOfRow(1,
+ // U+094C: "ौ" DEVANAGARI VOWEL SIGN AU
+ // U+0914: "औ" DEVANAGARI LETTER AU
+ // U+0967: "१" DEVANAGARI DIGIT ONE
+ key(VOWEL_SIGN_AU, "\u094C", joinMoreKeys("\u0914", "\u0967", "1")),
+ // U+0948: "ै" DEVANAGARI VOWEL SIGN AI
+ // U+0910: "ऐ" DEVANAGARI LETTER AI
+ // U+0968: "२" DEVANAGARI DIGIT TWO
+ key(VOWEL_SIGN_AI, "\u0948", joinMoreKeys("\u0910", "\u0968", "2")),
+ // U+093E: "ा" DEVANAGARI VOWEL SIGN AA
+ // U+0906: "आ" DEVANAGARI LETTER AA
+ // U+0969: "३" DEVANAGARI DIGIT THREE
+ key(VOWEL_SIGN_AA, "\u093E", joinMoreKeys("\u0906", "\u0969", "3")),
+ // U+0940: "ी" DEVANAGARI VOWEL SIGN II
+ // U+0908: "ई" DEVANAGARI LETTER II
+ // U+096A: "४" DEVANAGARI DIGIT FOUR
+ key(VOWEL_SIGN_II, "\u0940", joinMoreKeys("\u0908", "\u096A", "4")),
+ // U+0942: "ू" DEVANAGARI VOWEL SIGN UU
+ // U+090A: "ऊ" DEVANAGARI LETTER UU
+ // U+096B: "५" DEVANAGARI DIGIT FIVE
+ key(VOWEL_SIGN_UU, "\u0942", joinMoreKeys("\u090A", "\u096B", "5")),
+ // U+092C: "ब" DEVANAGARI LETTER BA
+ // U+092D: "भ" DEVANAGARI LETTER BHA
+ // U+096C: "६" DEVANAGARI DIGIT SIX
+ key("\u092C", joinMoreKeys("\u092D", "\u096C", "6")),
+ // U+0939: "ह" DEVANAGARI LETTER HA
+ // U+096D: "७" DEVANAGARI DIGIT SEVEN
+ key("\u0939", joinMoreKeys("\u096D", "7")),
+ // U+0917: "ग" DEVANAGARI LETTER GA
+ // U+0918: "घ" DEVANAGARI LETTER GHA
+ // U+096E: "८" DEVANAGARI DIGIT EIGHT
+ key("\u0917", joinMoreKeys("\u0918", "\u096E", "8")),
+ // U+0926: "द" DEVANAGARI LETTER DA
+ // U+0927: "ध" DEVANAGARI LETTER DHA
+ // U+096F: "९" DEVANAGARI DIGIT NINE
+ key("\u0926", joinMoreKeys("\u0927", "\u096F", "9")),
+ // U+091C: "ज" DEVANAGARI LETTER JA
+ // U+091D: "झ" DEVANAGARI LETTER JHA
+ // U+091C/U+094D/U+091E:
+ // "ज्ञ" DEVANAGARI LETTER JA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER NYA
+ // U+0966: "०" DEVANAGARI DIGIT ZERO
+ key("\u091C", joinMoreKeys("\u091D", "\u091C\u094D\u091E", "\u0966", "0")),
+ // U+0921: "ड" DEVANAGARI LETTER DDA
+ // U+0922: "ढ" DEVANAGARI LETTER DDHA
+ key("\u0921", moreKey("\u0922")))
+ .setKeysOfRow(2,
+ // U+094B: "ो" DEVANAGARI VOWEL SIGN O
+ // U+0913: "ओ" DEVANAGARI LETTER O
+ key(VOWEL_SIGN_O, "\u094B", moreKey("\u0913")),
+ // U+0947: "े" DEVANAGARI VOWEL SIGN E
+ // U+090F: "ए" DEVANAGARI LETTER SHORT E
+ key(VOWEL_SIGN_E, "\u0947", moreKey("\u090F")),
+ // U+094D: "्" DEVANAGARI SIGN VIRAMA
+ // U+0905: "अ" DEVANAGARI LETTER A
+ key(SIGN_VIRAMA, "\u094D", moreKey("\u0905")),
+ // U+093F: "ि" DEVANAGARI VOWEL SIGN I
+ // U+0907: "इ" DEVANAGARI LETTER I
+ key(VOWEL_SIGN_I, "\u093F", moreKey("\u0907")),
+ // U+0941: "ु" DEVANAGARI VOWEL SIGN U
+ // U+0909: "उ" DEVANAGARI LETTER U
+ key(VOWEL_SIGN_U, "\u0941", moreKey("\u0909")),
+ // U+092A: "प" DEVANAGARI LETTER PA
+ // U+092B: "फ" DEVANAGARI LETTER PHA
+ key("\u092A", moreKey("\u092B")),
+ // U+0930: "र" DEVANAGARI LETTER RA
+ // U+0931: "ऱ" DEVANAGARI LETTER RRA
+ // U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R
+ // U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R
+ key("\u0930", joinMoreKeys(
+ "\u0931", "\u090B", moreKey(VOWEL_SIGN_VOCALIC_R, "\u0943"))),
+ // U+0915: "क" DEVANAGARI LETTER KA
+ // U+0916: "ख" DEVANAGARI LETTER KHA
+ key("\u0915", moreKey("\u0916")),
+ // U+0924: "त" DEVANAGARI LETTER TA
+ // U+0925: "थ" DEVANAGARI LETTER THA
+ // U+0924/U+094D/U+0930:
+ // "त्र" DEVANAGARI LETTER TA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA
+ key("\u0924", joinMoreKeys("\u0925", "\u0924\u094D\u0930")),
+ // U+091A: "च" DEVANAGARI LETTER CA
+ // U+091B: "छ" DEVANAGARI LETTER CHA
+ key("\u091A", moreKey("\u091B")),
+ // U+091F: "ट" DEVANAGARI LETTER TTA
+ // U+0920: "ठ" DEVANAGARI LETTER TTHA
+ key("\u091F", moreKey("\u0920")))
+ .setKeysOfRow(3,
+ // U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O
+ // U+0911: "ऑ" DEVANAGARI LETTER CANDRA O
+ key(VOWEL_SIGN_CANDRA_O, "\u0949", moreKey("\u0911")),
+ // U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E
+ // U+090D: "ऍ" DEVANAGARI LETTER CANDRA E
+ key(VOWEL_SIGN_CANDRA_E, "\u0945", moreKey("\u090D")),
+ // U+0902: "ं" DEVANAGARI SIGN ANUSVARA
+ // U+0903: "ः‍" DEVANAGARI SIGN VISARGA
+ // U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU
+ key(SIGN_ANUSVARA, "\u0902", joinMoreKeys(
+ moreKey(SIGN_VISARGA, "\u0903"), moreKey(SIGN_CANDRABINDU, "\u0901"))),
+ // U+092E: "म" DEVANAGARI LETTER MA
+ "\u092E",
+ // U+0928: "न" DEVANAGARI LETTER NA
+ // U+0923: "ण" DEVANAGARI LETTER NNA
+ // U+091E: "ञ" DEVANAGARI LETTER NYA
+ // U+0919: "ङ" DEVANAGARI LETTER NGA
+ key("\u0928", joinMoreKeys("\u0923", "\u091E", "\u0919")),
+ // U+0935: "व" DEVANAGARI LETTER VA
+ "\u0935",
+ // U+0932: "ल" DEVANAGARI LETTER LA
+ // U+0933: "ळ" DEVANAGARI LETTER LLA
+ key("\u0932", moreKey("\u0933")),
+ // U+0938: "स" DEVANAGARI LETTER SA
+ // U+0936: "श" DEVANAGARI LETTER SHA
+ // U+0937: "ष" DEVANAGARI LETTER SSA
+ // U+0936/U+094D/U+0930:
+ // "श्र" DEVANAGARI LETTER SHA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA
+ key("\u0938", joinMoreKeys("\u0936", "\u0937", "\u0936\u094D\u0930")),
+ // U+092F: "य" DEVANAGARI LETTER YA
+ "\u092F",
+ // U+0915/U+094D/U+0937:
+ // "क्ष" DEVANAGARI LETTER KA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER SSA
+ "\u0915\u094D\u0937")
+ .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Myanmar.java b/tests/src/com/android/inputmethod/keyboard/layout/Myanmar.java
index 2d1c901b9..1b571acc6 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Myanmar.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Myanmar.java
@@ -48,12 +48,18 @@ public final class Myanmar extends LayoutBase {
}
@Override
+ public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
+ // U+002C: "," COMMA
+ // U+104A: "၊" MYANMAR SIGN LITTLE SECTION
+ return isPhone ? joinKeys(key("\u002C", SETTINGS_KEY))
+ : joinKeys(key("\u104A", moreKey(","), SETTINGS_KEY), "_");
+ }
+
+ @Override
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
// U+104B: "။" MYANMAR SIGN SECTION
- // U+104A: "၊" MYANMAR SIGN LITTLE SECTION
final ExpectedKey periodKey = key("\u104B", getPunctuationMoreKeys(isPhone));
- final ExpectedKey commaKey = key("\u104A", moreKey(","));
- return isPhone ? joinKeys(periodKey) : joinKeys(commaKey, periodKey);
+ return isPhone ? joinKeys(periodKey) : joinKeys("/", periodKey);
}
@Override
@@ -106,7 +112,7 @@ public final class Myanmar extends LayoutBase {
} else {
builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
.addKeysOnTheRightOfRow(3, ENTER_KEY)
- .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey(), SETTINGS_KEY)
+ .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(5, EMOJI_KEY);
}
builder.addKeysOnTheLeftOfRow(4, (Object[])customizer.getLeftShiftKeys(isPhone))
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/NepaliRomanized.java b/tests/src/com/android/inputmethod/keyboard/layout/NepaliRomanized.java
index 7048dbb73..7933d078c 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/NepaliRomanized.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/NepaliRomanized.java
@@ -47,7 +47,7 @@ public final class NepaliRomanized extends LayoutBase {
@Override
public ExpectedKey[] getSpaceKeys(final boolean isPhone) {
- return joinKeys(SPACE_KEY, key(ZWNJ_KEY, ZWJ_KEY));
+ return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY, key(ZWNJ_KEY, ZWJ_KEY));
}
// U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java b/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
index 726fefc68..5f3e4b196 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
@@ -167,7 +167,7 @@ public class Symbols extends AbstractLayoutBase {
// U+00BF: "¿" INVERTED QUESTION MARK
key("?", moreKey("\u00BF")))
.setKeysOfRow(4,
- key("_"), key("/"), SPACE_KEY, key(","),
+ key(","), key("_"), SPACE_KEY, key("/"),
// U+2026: "…" HORIZONTAL ELLIPSIS
key(".", moreKey("\u2026")))
.build();
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java b/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
index f611310af..3265e10e1 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
@@ -117,15 +117,16 @@ public class SymbolsShifted extends AbstractLayoutBase {
// U+2105: "℅" CARE OF
"\\", "\u00A9", "\u00AE", "\u2122", "\u2105", "[", "]")
.setKeysOfRow(4,
+ ",",
// U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
// U+2264: "≤" LESS-THAN OR EQUAL TO
// U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
key("<", joinMoreKeys("\u2039", "\u2264", "\u00AB")),
+ SPACE_KEY,
// U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
// U+2265: "≥" GREATER-THAN EQUAL TO
// U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
key(">", joinMoreKeys("\u203A", "\u2265", "\u00BB")),
- SPACE_KEY, ",",
// U+2026: "…" HORIZONTAL ELLIPSIS
key(".", moreKey("\u2026")))
.build();
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Thai.java b/tests/src/com/android/inputmethod/keyboard/layout/Thai.java
index 253c93b83..af4abea93 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Thai.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Thai.java
@@ -111,7 +111,7 @@ public final class Thai extends LayoutBase {
} else {
builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
.addKeysOnTheRightOfRow(3, ENTER_KEY)
- .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey(), SETTINGS_KEY)
+ .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(5, EMOJI_KEY);
}
builder.addKeysOnTheLeftOfRow(4, (Object[])customizer.getLeftShiftKeys(isPhone))
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractKeyboardBuilder.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractKeyboardBuilder.java
index 3365b92ec..6e721047c 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractKeyboardBuilder.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractKeyboardBuilder.java
@@ -21,9 +21,9 @@ import java.util.Arrays;
/**
* This class builds a keyboard that is a two dimensional array of elements <code>E</code>.
*
- * A keyboard consists of array of rows, and a row consists of array of elements. Each row may have
- * different number of elements. A element of a keyboard can be specified by a row number and a
- * column number, both numbers starts from 1.
+ * A keyboard consists of an array of rows, and a row consists of an array of elements. Each row
+ * may have different number of elements. A element of a keyboard can be specified by a row number
+ * and a column number, both numbers starts from 1.
*
* @param <E> the type of a keyboard element. A keyboard element must be an immutable object.
*/
@@ -39,8 +39,7 @@ abstract class AbstractKeyboardBuilder<E> {
abstract E[][] newArrayOfArray(final int size);
/**
- * Construct a builder filled with the default element.
- * @param dimensions the integer array of each row's size.
+ * Construct an empty builder.
*/
AbstractKeyboardBuilder() {
mRows = newArrayOfArray(0);
@@ -80,7 +79,7 @@ abstract class AbstractKeyboardBuilder<E> {
* Get the current contents of the specified row.
* @param row the row number to get the contents.
* @return the array of elements at row number <code>row</code>.
- * @throws {@link RuntimeException} if <code>row</code> is illegal.
+ * @throws RuntimeException if <code>row</code> is illegal.
*/
E[] getRowAt(final int row) {
final int rowIndex = row - 1;
@@ -94,7 +93,7 @@ abstract class AbstractKeyboardBuilder<E> {
* Set an array of elements to the specified row.
* @param row the row number to set <code>elements</code>.
* @param elements the array of elements to set at row number <code>row</code>.
- * @throws {@link RuntimeException} if <code>row</code> is illegal.
+ * @throws RuntimeException if <code>row</code> is illegal.
*/
void setRowAt(final int row, final E[] elements) {
final int rowIndex = row - 1;
@@ -114,7 +113,7 @@ abstract class AbstractKeyboardBuilder<E> {
* @param element the element to set or insert at <code>row,column</code>.
* @param insert if true, the <code>element</code> is inserted at <code>row,column</code>.
* Otherwise the <code>element</code> replace the element at <code>row,column</code>.
- * @throws {@link RuntimeException} if <code>row</code> or <code>column</code> is illegal.
+ * @throws RuntimeException if <code>row</code> or <code>column</code> is illegal.
*/
void setElementAt(final int row, final int column, final E element, final boolean insert) {
final E[] elements = getRowAt(row);
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java
index 6176f6a3e..9e0039d84 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.expected;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey.ExpectedAdditionalMoreKey;
import com.android.inputmethod.latin.Constants;
-import com.android.inputmethod.latin.utils.StringUtils;
/**
* Base class to create an expected keyboard for unit test.
@@ -109,6 +108,8 @@ public abstract class AbstractLayoutBase {
// Icon ids.
private static final int ICON_DELETE = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_DELETE_KEY);
+ private static final int ICON_SPACE = KeyboardIconsSet.getIconId(
+ KeyboardIconsSet.NAME_SPACE_KEY);
private static final int ICON_TAB = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_TAB_KEY);
private static final int ICON_SHORTCUT = KeyboardIconsSet.getIconId(
@@ -131,6 +132,5 @@ public abstract class AbstractLayoutBase {
ICON_LANGUAGE_SWITCH, Constants.CODE_LANGUAGE_SWITCH);
public static final ExpectedKey ENTER_KEY = key(ICON_ENTER, Constants.CODE_ENTER);
public static final ExpectedKey EMOJI_KEY = key(ICON_EMOJI, Constants.CODE_EMOJI);
- public static final ExpectedKey SPACE_KEY = key(
- StringUtils.newSingleCodePointString(Constants.CODE_SPACE));
+ public static final ExpectedKey SPACE_KEY = key(ICON_SPACE, Constants.CODE_SPACE);
}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/ActualKeyboardBuilder.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/ActualKeyboardBuilder.java
index 26d2e2ad2..56149189f 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/ActualKeyboardBuilder.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/ActualKeyboardBuilder.java
@@ -20,7 +20,6 @@ import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
import com.android.inputmethod.keyboard.internal.MoreKeySpec;
import com.android.inputmethod.latin.Constants;
-import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.StringUtils;
import java.util.ArrayList;
@@ -28,10 +27,13 @@ import java.util.List;
/**
* This class builds an actual keyboard for unit test.
+ *
+ * An actual keyboard is an array of rows, and a row consists of an array of {@link Key}s.
+ * Each row may have different number of {@link Key}s.
*/
public final class ActualKeyboardBuilder extends AbstractKeyboardBuilder<Key> {
private static ArrayList<Key> filterOutSpacer(final List<Key> keys) {
- final ArrayList<Key> filteredKeys = CollectionUtils.newArrayList();
+ final ArrayList<Key> filteredKeys = new ArrayList<>();
for (final Key key : keys) {
if (key.isSpacer()) {
continue;
@@ -43,7 +45,8 @@ public final class ActualKeyboardBuilder extends AbstractKeyboardBuilder<Key> {
/**
* Create the keyboard that consists of the array of rows of the actual keyboard's keys.
- * @param sortedKeys the sorted list of keys of the actual keyboard.
+ * @param sortedKeys keys list of the actual keyboard that is sorted from top-left to
+ * bottom-right.
* @return the actual keyboard grouped with rows.
*/
public static Key[][] buildKeyboard(final List<Key> sortedKeys) {
@@ -51,15 +54,15 @@ public final class ActualKeyboardBuilder extends AbstractKeyboardBuilder<Key> {
final ArrayList<Key> filteredSortedKeys = filterOutSpacer(sortedKeys);
// Grouping keys into rows.
- final ArrayList<ArrayList<Key>> rows = CollectionUtils.newArrayList();
- ArrayList<Key> elements = CollectionUtils.newArrayList();
+ final ArrayList<ArrayList<Key>> rows = new ArrayList<>();
+ ArrayList<Key> elements = new ArrayList<>();
int lastY = filteredSortedKeys.get(0).getY();
for (final Key key : filteredSortedKeys) {
if (lastY != key.getY()) {
// A new row is starting.
lastY = key.getY();
rows.add(elements);
- elements = CollectionUtils.newArrayList();
+ elements = new ArrayList<>();
}
elements.add(key);
}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKey.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKey.java
index ad08ba5a6..0e1c71cd1 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKey.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKey.java
@@ -18,7 +18,6 @@ package com.android.inputmethod.keyboard.layout.expected;
import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.internal.MoreKeySpec;
-import com.android.inputmethod.latin.utils.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -73,9 +72,8 @@ public class ExpectedKey {
// The additional more keys can be defined independently from other more keys.
// The position of the additional more keys in the long press popup keyboard can be
// controlled by specifying special marker "%" in the usual more keys definitions.
- final ArrayList<ExpectedKey> moreKeysList = CollectionUtils.newArrayList();
- final ArrayList<ExpectedAdditionalMoreKey> additionalMoreKeys =
- CollectionUtils.newArrayList();
+ final ArrayList<ExpectedKey> moreKeysList = new ArrayList<>();
+ final ArrayList<ExpectedAdditionalMoreKey> additionalMoreKeys = new ArrayList<>();
int firstAdditionalMoreKeyIndex = -1;
for (int index = 0; index < moreKeys.length; index++) {
final ExpectedKey moreKey = moreKeys[index];
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKeyboardBuilder.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKeyboardBuilder.java
index f068ad11d..9b7de88ea 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKeyboardBuilder.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKeyboardBuilder.java
@@ -16,14 +16,17 @@
package com.android.inputmethod.keyboard.layout.expected;
-import com.android.inputmethod.latin.utils.CollectionUtils;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
/**
* This class builds an expected keyboard for unit test.
+ *
+ * An expected keyboard is an array of rows, and a row consists of an array of {@link ExpectedKey}s.
+ * Each row may have different number of {@link ExpectedKey}s. While building an expected keyboard,
+ * an {@link ExpectedKey} can be specified by a row number and a column number, both numbers starts
+ * from 1.
*/
public final class ExpectedKeyboardBuilder extends AbstractKeyboardBuilder<ExpectedKey> {
public ExpectedKeyboardBuilder() {
@@ -111,7 +114,7 @@ public final class ExpectedKeyboardBuilder extends AbstractKeyboardBuilder<Expec
// Helper method to create {@link ExpectedKey} array by joining {@link ExpectedKey},
// {@link ExpectedKey} array, and {@link String}.
static ExpectedKey[] joinKeys(final Object ... keys) {
- final ArrayList<ExpectedKey> list = CollectionUtils.newArrayList();
+ final ArrayList<ExpectedKey> list = new ArrayList<>();
for (final Object key : keys) {
if (key instanceof ExpectedKey) {
list.add((ExpectedKey)key);
@@ -212,7 +215,7 @@ public final class ExpectedKeyboardBuilder extends AbstractKeyboardBuilder<Expec
* @param keys the array of keys to insert at <code>row,column</code>. Each key can be
* {@link ExpectedKey}, {@link ExpectedKey} array, and {@link String}.
* @return this builder.
- * @throws {@link RuntimeException} if <code>row</code> or <code>column</code> is illegal.
+ * @throws RuntimeException if <code>row</code> or <code>column</code> is illegal.
*/
public ExpectedKeyboardBuilder insertKeysAtRow(final int row, final int column,
final Object ... keys) {
@@ -229,7 +232,7 @@ public final class ExpectedKeyboardBuilder extends AbstractKeyboardBuilder<Expec
* @param keys the array of keys to add on the left most of the row. Each key can be
* {@link ExpectedKey}, {@link ExpectedKey} array, and {@link String}.
* @return this builder.
- * @throws {@link RuntimeException} if <code>row</code> is illegal.
+ * @throws RuntimeException if <code>row</code> is illegal.
*/
public ExpectedKeyboardBuilder addKeysOnTheLeftOfRow(final int row,
final Object ... keys) {
@@ -247,7 +250,7 @@ public final class ExpectedKeyboardBuilder extends AbstractKeyboardBuilder<Expec
* @param keys the array of keys to add on the right most of the row. Each key can be
* {@link ExpectedKey}, {@link ExpectedKey} array, and {@link String}.
* @return this builder.
- * @throws {@link RuntimeException} if <code>row</code> is illegal.
+ * @throws RuntimeException if <code>row</code> is illegal.
*/
public ExpectedKeyboardBuilder addKeysOnTheRightOfRow(final int row,
final Object ... keys) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishCustomizer.java
index 29264ff3b..3e82f65bf 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishCustomizer.java
@@ -27,34 +27,34 @@ class EnglishCustomizer extends LayoutCustomizer {
@Override
public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
return builder
- // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
// U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+ // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
// U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
// U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
// U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
- .setMoreKeysOf("e", "\u00E8", "\u00E9", "\u00EA", "\u00EB", "\u0113")
+ .setMoreKeysOf("e", "\u00E9", "\u00E8", "\u00EA", "\u00EB", "\u0113")
+ // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
// U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
// U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
// U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
- // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
// U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
- .setMoreKeysOf("u", "\u00FB", "\u00FC", "\u00F9", "\u00FA", "\u016B")
+ .setMoreKeysOf("u", "\u00FA", "\u00FB", "\u00FC", "\u00F9", "\u016B")
+ // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
// U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
// U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
- // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
// U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
// U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
- .setMoreKeysOf("i", "\u00EE", "\u00EF", "\u00ED", "\u012B", "\u00EC")
+ .setMoreKeysOf("i", "\u00ED", "\u00EE", "\u00EF", "\u012B", "\u00EC")
+ // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
// U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
// U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
// U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
- // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
// U+0153: "œ" LATIN SMALL LIGATURE OE
// U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
// U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
// U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
.setMoreKeysOf("o",
- "\u00F4", "\u00F6", "\u00F2", "\u00F3", "\u0153", "\u00F8", "\u014D",
+ "\u00F3", "\u00F4", "\u00F6", "\u00F2", "\u0153", "\u00F8", "\u014D",
"\u00F5")
// U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
// U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/LayoutTestsBase.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/LayoutTestsBase.java
index 4002c49c2..a22ed60ac 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/LayoutTestsBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/LayoutTestsBase.java
@@ -24,6 +24,7 @@ import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardId;
import com.android.inputmethod.keyboard.KeyboardLayoutSet;
import com.android.inputmethod.keyboard.KeyboardLayoutSetTestsBase;
+import com.android.inputmethod.keyboard.KeyboardTheme;
import com.android.inputmethod.keyboard.layout.LayoutBase;
import com.android.inputmethod.keyboard.layout.expected.AbstractLayoutBase;
import com.android.inputmethod.keyboard.layout.expected.ActualKeyboardBuilder;
@@ -51,7 +52,14 @@ abstract class LayoutTestsBase extends KeyboardLayoutSetTestsBase {
mSubtype = getSubtype(mLayout.getLocale(), mLayout.getName());
mLogTag = SubtypeLocaleUtils.getSubtypeNameForLogging(mSubtype) + "/"
+ (isPhone() ? "phone" : "tablet");
- mKeyboardLayoutSet = createKeyboardLayoutSet(mSubtype, null /* editorInfo */);
+ // TODO: Test with language switch key enabled and disabled.
+ mKeyboardLayoutSet = createKeyboardLayoutSet(mSubtype, null /* editorInfo */,
+ true /* voiceInputKeyEnabled */, true /* languageSwitchKeyEnabled */);
+ }
+
+ @Override
+ protected int getKeyboardThemeForTests() {
+ return KeyboardTheme.THEME_ID_KLP;
}
// Those helper methods have a lower case name to be readable when defining expected keyboard
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java
index 2e676df26..6380da524 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java
@@ -16,7 +16,7 @@
package com.android.inputmethod.keyboard.layout.tests;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.test.suitebuilder.annotation.Suppress;
import com.android.inputmethod.keyboard.layout.HindiCompact;
import com.android.inputmethod.keyboard.layout.HindiCompact.HindiCompactCustomizer;
@@ -27,7 +27,7 @@ import java.util.Locale;
/**
* hi: Hindi/hindi_compact
*/
-@SmallTest
+@Suppress
public final class TestsHindiCompact extends LayoutTestsBase {
private static final Locale LOCALE = new Locale("hi");
private static final LayoutBase LAYOUT = new HindiCompact(new HindiCompactCustomizer(LOCALE));
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java
new file mode 100644
index 000000000..d45d99d10
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java
@@ -0,0 +1,37 @@
+/*
+ * 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.keyboard.layout.tests;
+
+import android.test.suitebuilder.annotation.Suppress;
+
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.Marathi;
+import com.android.inputmethod.keyboard.layout.Marathi.MarathiCustomizer;
+
+import java.util.Locale;
+
+/**
+ * mr_IN: Marathi (India)/marathi
+ */
+@Suppress
+public final class TestsMarathiIN extends LayoutTestsBase {
+ private static final Locale LOCALE = new Locale("mr", "IN");
+ private static final LayoutBase LAYOUT = new Marathi(new MarathiCustomizer(LOCALE));
+
+ @Override
+ LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java
index e6d3b3b92..a0bd50c9a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java
@@ -16,7 +16,7 @@
package com.android.inputmethod.keyboard.layout.tests;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.test.suitebuilder.annotation.Suppress;
import com.android.inputmethod.keyboard.layout.LayoutBase;
import com.android.inputmethod.keyboard.layout.Myanmar;
@@ -27,7 +27,7 @@ import java.util.Locale;
/**
* my_MM: Myanmar (Myanmar)/myanmar
*/
-@SmallTest
+@Suppress
public final class TestsMyanmarMM extends LayoutTestsBase {
private static final Locale LOCALE = new Locale("my", "MM");
private static final LayoutBase LAYOUT = new Myanmar(new MyanmarCustomizer(LOCALE));
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
index ae2205b36..28cce834c 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
@@ -46,6 +46,8 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
private static final String TEST_DICT_FILE_EXTENSION = ".testDict";
private static final String TEST_LOCALE = "test";
private static final int DUMMY_PROBABILITY = 0;
+ private static final int[] DICT_FORMAT_VERSIONS =
+ new int[] { FormatSpec.VERSION4, FormatSpec.VERSION4_DEV };
private int mCurrentTime = 0;
@@ -61,20 +63,29 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
super.tearDown();
}
+ private static boolean supportsBeginningOfSentence(final int formatVersion) {
+ return formatVersion > FormatSpec.VERSION401;
+ }
+
private void addUnigramWord(final BinaryDictionary binaryDictionary, final String word,
final int probability) {
- binaryDictionary.addUnigramWord(word, probability, "" /* shortcutTarget */,
+ binaryDictionary.addUnigramEntry(word, probability, "" /* shortcutTarget */,
BinaryDictionary.NOT_A_PROBABILITY /* shortcutProbability */,
- false /* isNotAWord */, false /* isBlacklisted */,
- mCurrentTime /* timestamp */);
+ false /* isBeginningOfSentence */, false /* isNotAWord */,
+ false /* isBlacklisted */, mCurrentTime /* timestamp */);
}
private void addBigramWords(final BinaryDictionary binaryDictionary, final String word0,
final String word1, final int probability) {
- binaryDictionary.addBigramWords(word0, word1, probability,
+ binaryDictionary.addNgramEntry(new PrevWordsInfo(word0), word1, probability,
mCurrentTime /* timestamp */);
}
+ private static boolean isValidBigram(final BinaryDictionary binaryDictionary,
+ final String word0, final String word1) {
+ return binaryDictionary.isValidNgram(new PrevWordsInfo(word0), word1);
+ }
+
private void forcePassingShortTime(final BinaryDictionary binaryDictionary) {
// 30 days.
final int timeToElapse = (int)TimeUnit.SECONDS.convert(30, TimeUnit.DAYS);
@@ -93,19 +104,22 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
private File createEmptyDictionaryAndGetFile(final String dictId,
final int formatVersion) throws IOException {
- if (formatVersion == FormatSpec.VERSION4) {
- return createEmptyVer4DictionaryAndGetFile(dictId);
+ if (formatVersion == FormatSpec.VERSION4
+ || formatVersion == FormatSpec.VERSION4_ONLY_FOR_TESTING
+ || formatVersion == FormatSpec.VERSION4_DEV) {
+ return createEmptyVer4DictionaryAndGetFile(dictId, formatVersion);
} else {
throw new IOException("Dictionary format version " + formatVersion
+ " is not supported.");
}
}
- private File createEmptyVer4DictionaryAndGetFile(final String dictId) throws IOException {
+ private File createEmptyVer4DictionaryAndGetFile(final String dictId, final int formatVersion)
+ throws IOException {
final File file = File.createTempFile(dictId, TEST_DICT_FILE_EXTENSION,
getContext().getCacheDir());
FileUtils.deleteRecursively(file);
- Map<String, String> attributeMap = new HashMap<String, String>();
+ Map<String, String> attributeMap = new HashMap<>();
attributeMap.put(DictionaryHeader.DICTIONARY_ID_KEY, dictId);
attributeMap.put(DictionaryHeader.DICTIONARY_VERSION_KEY,
String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())));
@@ -113,12 +127,12 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
DictionaryHeader.ATTRIBUTE_VALUE_TRUE);
attributeMap.put(DictionaryHeader.HAS_HISTORICAL_INFO_KEY,
DictionaryHeader.ATTRIBUTE_VALUE_TRUE);
- if (BinaryDictionaryUtils.createEmptyDictFile(file.getAbsolutePath(), FormatSpec.VERSION4,
+ if (BinaryDictionaryUtils.createEmptyDictFile(file.getAbsolutePath(), formatVersion,
LocaleUtils.constructLocaleFromString(TEST_LOCALE), attributeMap)) {
return file;
} else {
throw new IOException("Empty dictionary " + file.getAbsolutePath()
- + " cannot be created.");
+ + " cannot be created. Foramt version: " + formatVersion);
}
}
@@ -131,7 +145,9 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
}
public void testReadDictInJavaSide() {
- testReadDictInJavaSide(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testReadDictInJavaSide(formatVersion);
+ }
}
private void testReadDictInJavaSide(final int formatVersion) {
@@ -176,10 +192,6 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
}
public void testControlCurrentTime() {
- testControlCurrentTime(FormatSpec.VERSION4);
- }
-
- private void testControlCurrentTime(final int formatVersion) {
final int TEST_COUNT = 1000;
final long seed = System.currentTimeMillis();
final Random random = new Random(seed);
@@ -195,7 +207,9 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
}
public void testAddValidAndInvalidWords() {
- testAddValidAndInvalidWords(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddValidAndInvalidWords(formatVersion);
+ }
}
private void testAddValidAndInvalidWords(final int formatVersion) {
@@ -219,26 +233,28 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
assertTrue(binaryDictionary.isValidWord("b"));
addBigramWords(binaryDictionary, "a", "b", Dictionary.NOT_A_PROBABILITY);
- assertFalse(binaryDictionary.isValidBigram("a", "b"));
+ assertFalse(isValidBigram(binaryDictionary, "a", "b"));
addBigramWords(binaryDictionary, "a", "b", Dictionary.NOT_A_PROBABILITY);
- assertTrue(binaryDictionary.isValidBigram("a", "b"));
+ assertTrue(isValidBigram(binaryDictionary, "a", "b"));
addUnigramWord(binaryDictionary, "c", DUMMY_PROBABILITY);
addBigramWords(binaryDictionary, "a", "c", DUMMY_PROBABILITY);
- assertTrue(binaryDictionary.isValidBigram("a", "c"));
+ assertTrue(isValidBigram(binaryDictionary, "a", "c"));
// Add bigrams of not valid unigrams.
addBigramWords(binaryDictionary, "x", "y", Dictionary.NOT_A_PROBABILITY);
- assertFalse(binaryDictionary.isValidBigram("x", "y"));
+ assertFalse(isValidBigram(binaryDictionary, "x", "y"));
addBigramWords(binaryDictionary, "x", "y", DUMMY_PROBABILITY);
- assertFalse(binaryDictionary.isValidBigram("x", "y"));
+ assertFalse(isValidBigram(binaryDictionary, "x", "y"));
binaryDictionary.close();
dictFile.delete();
}
public void testDecayingProbability() {
- testDecayingProbability(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testDecayingProbability(formatVersion);
+ }
}
private void testDecayingProbability(final int formatVersion) {
@@ -269,9 +285,9 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
addUnigramWord(binaryDictionary, "a", DUMMY_PROBABILITY);
addUnigramWord(binaryDictionary, "b", DUMMY_PROBABILITY);
addBigramWords(binaryDictionary, "a", "b", DUMMY_PROBABILITY);
- assertTrue(binaryDictionary.isValidBigram("a", "b"));
+ assertTrue(isValidBigram(binaryDictionary, "a", "b"));
forcePassingShortTime(binaryDictionary);
- assertFalse(binaryDictionary.isValidBigram("a", "b"));
+ assertFalse(isValidBigram(binaryDictionary, "a", "b"));
addUnigramWord(binaryDictionary, "a", DUMMY_PROBABILITY);
addUnigramWord(binaryDictionary, "b", DUMMY_PROBABILITY);
@@ -282,18 +298,20 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
addUnigramWord(binaryDictionary, "a", DUMMY_PROBABILITY);
addUnigramWord(binaryDictionary, "b", DUMMY_PROBABILITY);
addBigramWords(binaryDictionary, "a", "b", DUMMY_PROBABILITY);
- assertTrue(binaryDictionary.isValidBigram("a", "b"));
+ assertTrue(isValidBigram(binaryDictionary, "a", "b"));
forcePassingShortTime(binaryDictionary);
- assertTrue(binaryDictionary.isValidBigram("a", "b"));
+ assertTrue(isValidBigram(binaryDictionary, "a", "b"));
forcePassingLongTime(binaryDictionary);
- assertFalse(binaryDictionary.isValidBigram("a", "b"));
+ assertFalse(isValidBigram(binaryDictionary, "a", "b"));
binaryDictionary.close();
dictFile.delete();
}
public void testAddManyUnigramsToDecayingDict() {
- testAddManyUnigramsToDecayingDict(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddManyUnigramsToDecayingDict(formatVersion);
+ }
}
private void testAddManyUnigramsToDecayingDict(final int formatVersion) {
@@ -315,7 +333,7 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
setCurrentTimeForTestMode(mCurrentTime);
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
- final ArrayList<String> words = new ArrayList<String>();
+ final ArrayList<String> words = new ArrayList<>();
for (int i = 0; i < unigramCount; i++) {
final String word = CodePointUtils.generateWord(random, codePointSet);
@@ -352,7 +370,9 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
}
public void testOverflowUnigrams() {
- testOverflowUnigrams(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testOverflowUnigrams(formatVersion);
+ }
}
private void testOverflowUnigrams(final int formatVersion) {
@@ -411,7 +431,9 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
}
public void testAddManyBigramsToDecayingDict() {
- testAddManyBigramsToDecayingDict(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddManyBigramsToDecayingDict(formatVersion);
+ }
}
private void testAddManyBigramsToDecayingDict(final int formatVersion) {
@@ -434,8 +456,8 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
setCurrentTimeForTestMode(mCurrentTime);
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
- final ArrayList<String> words = new ArrayList<String>();
- final ArrayList<Pair<String, String>> bigrams = new ArrayList<Pair<String, String>>();
+ final ArrayList<String> words = new ArrayList<>();
+ final ArrayList<Pair<String, String>> bigrams = new ArrayList<>();
for (int i = 0; i < unigramCount; ++i) {
final String word = CodePointUtils.generateWord(random, codePointSet);
@@ -449,7 +471,7 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
}
final String word0 = words.get(word0Index);
final String word1 = words.get(word1Index);
- final Pair<String, String> bigram = new Pair<String, String>(word0, word1);
+ final Pair<String, String> bigram = new Pair<>(word0, word1);
bigrams.add(bigram);
}
@@ -485,7 +507,9 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
}
public void testOverflowBigrams() {
- testOverflowBigrams(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testOverflowBigrams(formatVersion);
+ }
}
private void testOverflowBigrams(final int formatVersion) {
@@ -511,7 +535,7 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
setCurrentTimeForTestMode(mCurrentTime);
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
- final ArrayList<String> words = new ArrayList<String>();
+ final ArrayList<String> words = new ArrayList<>();
for (int i = 0; i < unigramCount; i++) {
final String word = CodePointUtils.generateWord(random, codePointSet);
words.add(word);
@@ -534,8 +558,8 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
for (int j = 0; j < weakBigramTypedCount; j++) {
addBigramWords(binaryDictionary, weak, target, DUMMY_PROBABILITY);
}
- assertTrue(binaryDictionary.isValidBigram(strong, target));
- assertTrue(binaryDictionary.isValidBigram(weak, target));
+ assertTrue(isValidBigram(binaryDictionary, strong, target));
+ assertTrue(isValidBigram(binaryDictionary, weak, target));
for (int i = 0; i < bigramCount; i++) {
final int word0Index = random.nextInt(words.size());
@@ -556,10 +580,112 @@ public class BinaryDictionaryDecayingTests extends AndroidTestCase {
Integer.parseInt(binaryDictionary.getPropertyForTest(
BinaryDictionary.BIGRAM_COUNT_QUERY));
assertTrue(bigramCountBeforeGC > bigramCountAfterGC);
- assertTrue(binaryDictionary.isValidBigram(strong, target));
- assertFalse(binaryDictionary.isValidBigram(weak, target));
+ assertTrue(isValidBigram(binaryDictionary, strong, target));
+ assertFalse(isValidBigram(binaryDictionary, weak, target));
break;
}
}
}
+
+ public void testDictMigration() {
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testDictMigration(FormatSpec.VERSION4_ONLY_FOR_TESTING, formatVersion);
+ }
+ }
+
+ private void testDictMigration(final int fromFormatVersion, final int toFormatVersion) {
+ setCurrentTimeForTestMode(mCurrentTime);
+ File dictFile = null;
+ try {
+ dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary", fromFormatVersion);
+ } catch (IOException e) {
+ fail("IOException while writing an initial dictionary : " + e);
+ }
+ final BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
+ 0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
+ Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
+ addUnigramWord(binaryDictionary, "aaa", DUMMY_PROBABILITY);
+ assertTrue(binaryDictionary.isValidWord("aaa"));
+ addUnigramWord(binaryDictionary, "bbb", Dictionary.NOT_A_PROBABILITY);
+ assertFalse(binaryDictionary.isValidWord("bbb"));
+ addUnigramWord(binaryDictionary, "ccc", DUMMY_PROBABILITY);
+ addUnigramWord(binaryDictionary, "ccc", DUMMY_PROBABILITY);
+ addUnigramWord(binaryDictionary, "ccc", DUMMY_PROBABILITY);
+ addUnigramWord(binaryDictionary, "ccc", DUMMY_PROBABILITY);
+ addUnigramWord(binaryDictionary, "ccc", DUMMY_PROBABILITY);
+ addUnigramWord(binaryDictionary, "abc", DUMMY_PROBABILITY);
+ addBigramWords(binaryDictionary, "aaa", "abc", DUMMY_PROBABILITY);
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "abc"));
+ addBigramWords(binaryDictionary, "aaa", "bbb", Dictionary.NOT_A_PROBABILITY);
+ assertFalse(isValidBigram(binaryDictionary, "aaa", "bbb"));
+
+ assertEquals(fromFormatVersion, binaryDictionary.getFormatVersion());
+ assertTrue(binaryDictionary.migrateTo(toFormatVersion));
+ assertTrue(binaryDictionary.isValidDictionary());
+ assertEquals(toFormatVersion, binaryDictionary.getFormatVersion());
+ assertTrue(binaryDictionary.isValidWord("aaa"));
+ assertFalse(binaryDictionary.isValidWord("bbb"));
+ assertTrue(binaryDictionary.getFrequency("aaa") < binaryDictionary.getFrequency("ccc"));
+ addUnigramWord(binaryDictionary, "bbb", Dictionary.NOT_A_PROBABILITY);
+ assertTrue(binaryDictionary.isValidWord("bbb"));
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "abc"));
+ assertFalse(isValidBigram(binaryDictionary, "aaa", "bbb"));
+ addBigramWords(binaryDictionary, "aaa", "bbb", Dictionary.NOT_A_PROBABILITY);
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "bbb"));
+ binaryDictionary.close();
+ dictFile.delete();
+ }
+
+ public void testBeginningOfSentence() {
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ if (supportsBeginningOfSentence(formatVersion)) {
+ testBeginningOfSentence(formatVersion);
+ }
+ }
+ }
+
+ private void testBeginningOfSentence(final int formatVersion) {
+ setCurrentTimeForTestMode(mCurrentTime);
+ File dictFile = null;
+ try {
+ dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary", formatVersion);
+ } catch (IOException e) {
+ fail("IOException while writing an initial dictionary : " + e);
+ }
+ final BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
+ 0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
+ Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
+
+ binaryDictionary.addUnigramEntry("", DUMMY_PROBABILITY, "" /* shortcutTarget */,
+ BinaryDictionary.NOT_A_PROBABILITY /* shortcutProbability */,
+ true /* isBeginningOfSentence */, true /* isNotAWord */, false /* isBlacklisted */,
+ mCurrentTime);
+ final PrevWordsInfo prevWordsInfoStartOfSentence = PrevWordsInfo.BEGINNING_OF_SENTENCE;
+ addUnigramWord(binaryDictionary, "aaa", DUMMY_PROBABILITY);
+ binaryDictionary.addNgramEntry(prevWordsInfoStartOfSentence, "aaa", DUMMY_PROBABILITY,
+ mCurrentTime);
+ assertTrue(binaryDictionary.isValidNgram(prevWordsInfoStartOfSentence, "aaa"));
+ binaryDictionary.addNgramEntry(prevWordsInfoStartOfSentence, "aaa", DUMMY_PROBABILITY,
+ mCurrentTime);
+ addUnigramWord(binaryDictionary, "bbb", DUMMY_PROBABILITY);
+ binaryDictionary.addNgramEntry(prevWordsInfoStartOfSentence, "bbb", DUMMY_PROBABILITY,
+ mCurrentTime);
+ assertTrue(binaryDictionary.isValidNgram(prevWordsInfoStartOfSentence, "aaa"));
+ assertTrue(binaryDictionary.isValidNgram(prevWordsInfoStartOfSentence, "bbb"));
+
+ forcePassingLongTime(binaryDictionary);
+ assertFalse(binaryDictionary.isValidNgram(prevWordsInfoStartOfSentence, "aaa"));
+ assertFalse(binaryDictionary.isValidNgram(prevWordsInfoStartOfSentence, "bbb"));
+
+ addUnigramWord(binaryDictionary, "aaa", DUMMY_PROBABILITY);
+ binaryDictionary.addNgramEntry(prevWordsInfoStartOfSentence, "aaa", DUMMY_PROBABILITY,
+ mCurrentTime);
+ addUnigramWord(binaryDictionary, "bbb", DUMMY_PROBABILITY);
+ binaryDictionary.addNgramEntry(prevWordsInfoStartOfSentence, "bbb", DUMMY_PROBABILITY,
+ mCurrentTime);
+ assertTrue(binaryDictionary.isValidNgram(prevWordsInfoStartOfSentence, "aaa"));
+ assertTrue(binaryDictionary.isValidNgram(prevWordsInfoStartOfSentence, "bbb"));
+ binaryDictionary.close();
+ dictFile.delete();
+ }
}
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
index 0fb0fa587..160b08c4f 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
@@ -43,34 +43,49 @@ import java.util.Random;
public class BinaryDictionaryTests extends AndroidTestCase {
private static final String TEST_DICT_FILE_EXTENSION = ".testDict";
private static final String TEST_LOCALE = "test";
+ private static final int[] DICT_FORMAT_VERSIONS =
+ new int[] { FormatSpec.VERSION4, FormatSpec.VERSION4_DEV };
+
+ private static boolean canCheckBigramProbability(final int formatVersion) {
+ return formatVersion > FormatSpec.VERSION401;
+ }
+
+ private static boolean supportsBeginningOfSentence(final int formatVersion) {
+ return formatVersion > FormatSpec.VERSION401;
+ }
private File createEmptyDictionaryAndGetFile(final String dictId,
final int formatVersion) throws IOException {
- if (formatVersion == FormatSpec.VERSION4) {
- return createEmptyVer4DictionaryAndGetFile(dictId);
+ if (formatVersion == FormatSpec.VERSION4
+ || formatVersion == FormatSpec.VERSION4_ONLY_FOR_TESTING
+ || formatVersion == FormatSpec.VERSION4_DEV) {
+ return createEmptyVer4DictionaryAndGetFile(dictId, formatVersion);
} else {
throw new IOException("Dictionary format version " + formatVersion
+ " is not supported.");
}
}
- private File createEmptyVer4DictionaryAndGetFile(final String dictId) throws IOException {
+ private File createEmptyVer4DictionaryAndGetFile(final String dictId,
+ final int formatVersion) throws IOException {
final File file = File.createTempFile(dictId, TEST_DICT_FILE_EXTENSION,
getContext().getCacheDir());
file.delete();
file.mkdir();
- Map<String, String> attributeMap = new HashMap<String, String>();
- if (BinaryDictionaryUtils.createEmptyDictFile(file.getAbsolutePath(), FormatSpec.VERSION4,
+ Map<String, String> attributeMap = new HashMap<>();
+ if (BinaryDictionaryUtils.createEmptyDictFile(file.getAbsolutePath(), formatVersion,
Locale.ENGLISH, attributeMap)) {
return file;
} else {
throw new IOException("Empty dictionary " + file.getAbsolutePath()
- + " cannot be created.");
+ + " cannot be created. Format version: " + formatVersion);
}
}
public void testIsValidDictionary() {
- testIsValidDictionary(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testIsValidDictionary(formatVersion);
+ }
}
private void testIsValidDictionary(final int formatVersion) {
@@ -98,7 +113,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testConstructingDictionaryOnMemory() {
- testConstructingDictionaryOnMemory(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testConstructingDictionaryOnMemory(formatVersion);
+ }
}
private void testConstructingDictionaryOnMemory(final int formatVersion) {
@@ -129,7 +146,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testAddTooLongWord() {
- testAddTooLongWord(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddTooLongWord(formatVersion);
+ }
}
private void testAddTooLongWord(final int formatVersion) {
@@ -155,8 +174,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
addUnigramWord(binaryDictionary, validLongWord, probability);
addUnigramWord(binaryDictionary, invalidLongWord, probability);
// Too long short cut.
- binaryDictionary.addUnigramWord("a", probability, invalidLongWord,
- 10 /* shortcutProbability */, false /* isNotAWord */, false /* isBlacklisted */,
+ binaryDictionary.addUnigramEntry("a", probability, invalidLongWord,
+ 10 /* shortcutProbability */, false /* isBeginningOfSentence */,
+ false /* isNotAWord */, false /* isBlacklisted */,
BinaryDictionary.NOT_A_VALID_TIMESTAMP);
addUnigramWord(binaryDictionary, "abc", probability);
final int updatedProbability = 200;
@@ -173,22 +193,39 @@ public class BinaryDictionaryTests extends AndroidTestCase {
dictFile.delete();
}
- private void addUnigramWord(final BinaryDictionary binaryDictionary, final String word,
+ private static void addUnigramWord(final BinaryDictionary binaryDictionary, final String word,
final int probability) {
- binaryDictionary.addUnigramWord(word, probability, "" /* shortcutTarget */,
+ binaryDictionary.addUnigramEntry(word, probability, "" /* shortcutTarget */,
BinaryDictionary.NOT_A_PROBABILITY /* shortcutProbability */,
- false /* isNotAWord */, false /* isBlacklisted */,
- BinaryDictionary.NOT_A_VALID_TIMESTAMP /* timestamp */);
+ false /* isBeginningOfSentence */, false /* isNotAWord */,
+ false /* isBlacklisted */, BinaryDictionary.NOT_A_VALID_TIMESTAMP /* timestamp */);
}
- private void addBigramWords(final BinaryDictionary binaryDictionary, final String word0,
+ private static void addBigramWords(final BinaryDictionary binaryDictionary, final String word0,
final String word1, final int probability) {
- binaryDictionary.addBigramWords(word0, word1, probability,
+ binaryDictionary.addNgramEntry(new PrevWordsInfo(word0), word1, probability,
BinaryDictionary.NOT_A_VALID_TIMESTAMP /* timestamp */);
}
+ private static boolean isValidBigram(final BinaryDictionary binaryDictionary,
+ final String word0, final String word1) {
+ return binaryDictionary.isValidNgram(new PrevWordsInfo(word0), word1);
+ }
+
+ private static void removeBigramEntry(final BinaryDictionary binaryDictionary,
+ final String word0, final String word1) {
+ binaryDictionary.removeNgramEntry(new PrevWordsInfo(word0), word1);
+ }
+
+ private static int getBigramProbability(final BinaryDictionary binaryDictionary,
+ final String word0, final String word1) {
+ return binaryDictionary.getNgramProbability(new PrevWordsInfo(word0), word1);
+ }
+
public void testAddUnigramWord() {
- testAddUnigramWord(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddUnigramWord(formatVersion);
+ }
}
private void testAddUnigramWord(final int formatVersion) {
@@ -230,7 +267,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testRandomlyAddUnigramWord() {
- testRandomlyAddUnigramWord(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testRandomlyAddUnigramWord(formatVersion);
+ }
}
private void testRandomlyAddUnigramWord(final int formatVersion) {
@@ -248,7 +287,7 @@ public class BinaryDictionaryTests extends AndroidTestCase {
0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
- final HashMap<String, Integer> probabilityMap = new HashMap<String, Integer>();
+ final HashMap<String, Integer> probabilityMap = new HashMap<>();
// Test a word that isn't contained within the dictionary.
final Random random = new Random(seed);
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
@@ -266,7 +305,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testAddBigramWords() {
- testAddBigramWords(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddBigramWords(formatVersion);
+ }
}
private void testAddBigramWords(final int formatVersion) {
@@ -281,8 +322,8 @@ public class BinaryDictionaryTests extends AndroidTestCase {
Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
final int unigramProbability = 100;
- final int bigramProbability = 10;
- final int updatedBigramProbability = 15;
+ final int bigramProbability = 150;
+ final int updatedBigramProbability = 200;
addUnigramWord(binaryDictionary, "aaa", unigramProbability);
addUnigramWord(binaryDictionary, "abb", unigramProbability);
addUnigramWord(binaryDictionary, "bcc", unigramProbability);
@@ -291,31 +332,32 @@ public class BinaryDictionaryTests extends AndroidTestCase {
addBigramWords(binaryDictionary, "abb", "aaa", bigramProbability);
addBigramWords(binaryDictionary, "abb", "bcc", bigramProbability);
- final int probability = binaryDictionary.calculateProbability(unigramProbability,
- bigramProbability);
- assertEquals(true, binaryDictionary.isValidBigram("aaa", "abb"));
- assertEquals(true, binaryDictionary.isValidBigram("aaa", "bcc"));
- assertEquals(true, binaryDictionary.isValidBigram("abb", "aaa"));
- assertEquals(true, binaryDictionary.isValidBigram("abb", "bcc"));
- assertEquals(probability, binaryDictionary.getBigramProbability("aaa", "abb"));
- assertEquals(probability, binaryDictionary.getBigramProbability("aaa", "bcc"));
- assertEquals(probability, binaryDictionary.getBigramProbability("abb", "aaa"));
- assertEquals(probability, binaryDictionary.getBigramProbability("abb", "bcc"));
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "abb"));
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "bcc"));
+ assertTrue(isValidBigram(binaryDictionary, "abb", "aaa"));
+ assertTrue(isValidBigram(binaryDictionary, "abb", "bcc"));
+ if (canCheckBigramProbability(formatVersion)) {
+ assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "aaa", "abb"));
+ assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "aaa", "bcc"));
+ assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "abb", "aaa"));
+ assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "abb", "bcc"));
+ }
addBigramWords(binaryDictionary, "aaa", "abb", updatedBigramProbability);
- final int updatedProbability = binaryDictionary.calculateProbability(unigramProbability,
- updatedBigramProbability);
- assertEquals(updatedProbability, binaryDictionary.getBigramProbability("aaa", "abb"));
+ if (canCheckBigramProbability(formatVersion)) {
+ assertEquals(updatedBigramProbability,
+ getBigramProbability(binaryDictionary, "aaa", "abb"));
+ }
- assertEquals(false, binaryDictionary.isValidBigram("bcc", "aaa"));
- assertEquals(false, binaryDictionary.isValidBigram("bcc", "bbc"));
- assertEquals(false, binaryDictionary.isValidBigram("aaa", "aaa"));
+ assertFalse(isValidBigram(binaryDictionary, "bcc", "aaa"));
+ assertFalse(isValidBigram(binaryDictionary, "bcc", "bbc"));
+ assertFalse(isValidBigram(binaryDictionary, "aaa", "aaa"));
assertEquals(Dictionary.NOT_A_PROBABILITY,
- binaryDictionary.getBigramProbability("bcc", "aaa"));
+ getBigramProbability(binaryDictionary, "bcc", "aaa"));
assertEquals(Dictionary.NOT_A_PROBABILITY,
- binaryDictionary.getBigramProbability("bcc", "bbc"));
+ getBigramProbability(binaryDictionary, "bcc", "bbc"));
assertEquals(Dictionary.NOT_A_PROBABILITY,
- binaryDictionary.getBigramProbability("aaa", "aaa"));
+ getBigramProbability(binaryDictionary, "aaa", "aaa"));
// Testing bigram link.
addUnigramWord(binaryDictionary, "abcde", unigramProbability);
@@ -324,17 +366,26 @@ public class BinaryDictionaryTests extends AndroidTestCase {
addUnigramWord(binaryDictionary, "fgh", unigramProbability);
addUnigramWord(binaryDictionary, "abc", unigramProbability);
addUnigramWord(binaryDictionary, "f", unigramProbability);
- assertEquals(probability, binaryDictionary.getBigramProbability("abcde", "fghij"));
+
+ if (canCheckBigramProbability(formatVersion)) {
+ assertEquals(bigramProbability,
+ getBigramProbability(binaryDictionary, "abcde", "fghij"));
+ }
assertEquals(Dictionary.NOT_A_PROBABILITY,
- binaryDictionary.getBigramProbability("abcde", "fgh"));
+ getBigramProbability(binaryDictionary, "abcde", "fgh"));
addBigramWords(binaryDictionary, "abcde", "fghij", updatedBigramProbability);
- assertEquals(updatedProbability, binaryDictionary.getBigramProbability("abcde", "fghij"));
+ if (canCheckBigramProbability(formatVersion)) {
+ assertEquals(updatedBigramProbability,
+ getBigramProbability(binaryDictionary, "abcde", "fghij"));
+ }
dictFile.delete();
}
public void testRandomlyAddBigramWords() {
- testRandomlyAddBigramWords(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testRandomlyAddBigramWords(formatVersion);
+ }
}
private void testRandomlyAddBigramWords(final int formatVersion) {
@@ -354,12 +405,11 @@ public class BinaryDictionaryTests extends AndroidTestCase {
0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
- final ArrayList<String> words = new ArrayList<String>();
- final ArrayList<Pair<String, String>> bigramWords = new ArrayList<Pair<String,String>>();
+ final ArrayList<String> words = new ArrayList<>();
+ final ArrayList<Pair<String, String>> bigramWords = new ArrayList<>();
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
- final HashMap<String, Integer> unigramProbabilities = new HashMap<String, Integer>();
- final HashMap<Pair<String, String>, Integer> bigramProbabilities =
- new HashMap<Pair<String, String>, Integer>();
+ final HashMap<String, Integer> unigramProbabilities = new HashMap<>();
+ final HashMap<Pair<String, String>, Integer> bigramProbabilities = new HashMap<>();
for (int i = 0; i < wordCount; ++i) {
final String word = CodePointUtils.generateWord(random, codePointSet);
@@ -375,27 +425,32 @@ public class BinaryDictionaryTests extends AndroidTestCase {
if (TextUtils.equals(word0, word1)) {
continue;
}
- final Pair<String, String> bigram = new Pair<String, String>(word0, word1);
+ final Pair<String, String> bigram = new Pair<>(word0, word1);
bigramWords.add(bigram);
- final int bigramProbability = random.nextInt(0xF);
+ final int unigramProbability = unigramProbabilities.get(word1);
+ final int bigramProbability =
+ unigramProbability + random.nextInt(0xFF - unigramProbability);
bigramProbabilities.put(bigram, bigramProbability);
addBigramWords(binaryDictionary, word0, word1, bigramProbability);
}
for (final Pair<String, String> bigram : bigramWords) {
- final int unigramProbability = unigramProbabilities.get(bigram.second);
final int bigramProbability = bigramProbabilities.get(bigram);
- final int probability = binaryDictionary.calculateProbability(unigramProbability,
- bigramProbability);
- assertEquals(probability,
- binaryDictionary.getBigramProbability(bigram.first, bigram.second));
+ assertEquals(bigramProbability != Dictionary.NOT_A_PROBABILITY,
+ isValidBigram(binaryDictionary, bigram.first, bigram.second));
+ if (canCheckBigramProbability(formatVersion)) {
+ assertEquals(bigramProbability,
+ getBigramProbability(binaryDictionary, bigram.first, bigram.second));
+ }
}
dictFile.delete();
}
public void testRemoveBigramWords() {
- testRemoveBigramWords(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testRemoveBigramWords(formatVersion);
+ }
}
private void testRemoveBigramWords(final int formatVersion) {
@@ -409,7 +464,7 @@ public class BinaryDictionaryTests extends AndroidTestCase {
0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
final int unigramProbability = 100;
- final int bigramProbability = 10;
+ final int bigramProbability = 150;
addUnigramWord(binaryDictionary, "aaa", unigramProbability);
addUnigramWord(binaryDictionary, "abb", unigramProbability);
addUnigramWord(binaryDictionary, "bcc", unigramProbability);
@@ -418,34 +473,36 @@ public class BinaryDictionaryTests extends AndroidTestCase {
addBigramWords(binaryDictionary, "abb", "aaa", bigramProbability);
addBigramWords(binaryDictionary, "abb", "bcc", bigramProbability);
- assertEquals(true, binaryDictionary.isValidBigram("aaa", "abb"));
- assertEquals(true, binaryDictionary.isValidBigram("aaa", "bcc"));
- assertEquals(true, binaryDictionary.isValidBigram("abb", "aaa"));
- assertEquals(true, binaryDictionary.isValidBigram("abb", "bcc"));
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "abb"));
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "bcc"));
+ assertTrue(isValidBigram(binaryDictionary, "abb", "aaa"));
+ assertTrue(isValidBigram(binaryDictionary, "abb", "bcc"));
- binaryDictionary.removeBigramWords("aaa", "abb");
- assertEquals(false, binaryDictionary.isValidBigram("aaa", "abb"));
+ removeBigramEntry(binaryDictionary, "aaa", "abb");
+ assertFalse(isValidBigram(binaryDictionary, "aaa", "abb"));
addBigramWords(binaryDictionary, "aaa", "abb", bigramProbability);
- assertEquals(true, binaryDictionary.isValidBigram("aaa", "abb"));
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "abb"));
- binaryDictionary.removeBigramWords("aaa", "bcc");
- assertEquals(false, binaryDictionary.isValidBigram("aaa", "bcc"));
- binaryDictionary.removeBigramWords("abb", "aaa");
- assertEquals(false, binaryDictionary.isValidBigram("abb", "aaa"));
- binaryDictionary.removeBigramWords("abb", "bcc");
- assertEquals(false, binaryDictionary.isValidBigram("abb", "bcc"));
+ removeBigramEntry(binaryDictionary, "aaa", "bcc");
+ assertFalse(isValidBigram(binaryDictionary, "aaa", "bcc"));
+ removeBigramEntry(binaryDictionary, "abb", "aaa");
+ assertFalse(isValidBigram(binaryDictionary, "abb", "aaa"));
+ removeBigramEntry(binaryDictionary, "abb", "bcc");
+ assertFalse(isValidBigram(binaryDictionary, "abb", "bcc"));
- binaryDictionary.removeBigramWords("aaa", "abb");
+ removeBigramEntry(binaryDictionary, "aaa", "abb");
// Test remove non-existing bigram operation.
- binaryDictionary.removeBigramWords("aaa", "abb");
- binaryDictionary.removeBigramWords("bcc", "aaa");
+ removeBigramEntry(binaryDictionary, "aaa", "abb");
+ removeBigramEntry(binaryDictionary, "bcc", "aaa");
dictFile.delete();
}
public void testFlushDictionary() {
- testFlushDictionary(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testFlushDictionary(formatVersion);
+ }
}
private void testFlushDictionary(final int formatVersion) {
@@ -497,7 +554,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testFlushWithGCDictionary() {
- testFlushWithGCDictionary(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testFlushWithGCDictionary(formatVersion);
+ }
}
private void testFlushWithGCDictionary(final int formatVersion) {
@@ -512,7 +571,7 @@ public class BinaryDictionaryTests extends AndroidTestCase {
Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
final int unigramProbability = 100;
- final int bigramProbability = 10;
+ final int bigramProbability = 150;
addUnigramWord(binaryDictionary, "aaa", unigramProbability);
addUnigramWord(binaryDictionary, "abb", unigramProbability);
addUnigramWord(binaryDictionary, "bcc", unigramProbability);
@@ -526,18 +585,18 @@ public class BinaryDictionaryTests extends AndroidTestCase {
binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
- final int probability = binaryDictionary.calculateProbability(unigramProbability,
- bigramProbability);
assertEquals(unigramProbability, binaryDictionary.getFrequency("aaa"));
assertEquals(unigramProbability, binaryDictionary.getFrequency("abb"));
assertEquals(unigramProbability, binaryDictionary.getFrequency("bcc"));
- assertEquals(probability, binaryDictionary.getBigramProbability("aaa", "abb"));
- assertEquals(probability, binaryDictionary.getBigramProbability("aaa", "bcc"));
- assertEquals(probability, binaryDictionary.getBigramProbability("abb", "aaa"));
- assertEquals(probability, binaryDictionary.getBigramProbability("abb", "bcc"));
- assertEquals(false, binaryDictionary.isValidBigram("bcc", "aaa"));
- assertEquals(false, binaryDictionary.isValidBigram("bcc", "bbc"));
- assertEquals(false, binaryDictionary.isValidBigram("aaa", "aaa"));
+ if (canCheckBigramProbability(formatVersion)) {
+ assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "aaa", "abb"));
+ assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "aaa", "bcc"));
+ assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "abb", "aaa"));
+ assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "abb", "bcc"));
+ }
+ assertFalse(isValidBigram(binaryDictionary, "bcc", "aaa"));
+ assertFalse(isValidBigram(binaryDictionary, "bcc", "bbc"));
+ assertFalse(isValidBigram(binaryDictionary, "aaa", "aaa"));
binaryDictionary.flushWithGC();
binaryDictionary.close();
@@ -545,7 +604,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testAddBigramWordsAndFlashWithGC() {
- testAddBigramWordsAndFlashWithGC(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddBigramWordsAndFlashWithGC(formatVersion);
+ }
}
// TODO: Evaluate performance of GC
@@ -567,12 +628,11 @@ public class BinaryDictionaryTests extends AndroidTestCase {
0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
- final ArrayList<String> words = new ArrayList<String>();
- final ArrayList<Pair<String, String>> bigramWords = new ArrayList<Pair<String,String>>();
+ final ArrayList<String> words = new ArrayList<>();
+ final ArrayList<Pair<String, String>> bigramWords = new ArrayList<>();
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
- final HashMap<String, Integer> unigramProbabilities = new HashMap<String, Integer>();
- final HashMap<Pair<String, String>, Integer> bigramProbabilities =
- new HashMap<Pair<String, String>, Integer>();
+ final HashMap<String, Integer> unigramProbabilities = new HashMap<>();
+ final HashMap<Pair<String, String>, Integer> bigramProbabilities = new HashMap<>();
for (int i = 0; i < wordCount; ++i) {
final String word = CodePointUtils.generateWord(random, codePointSet);
@@ -588,9 +648,11 @@ public class BinaryDictionaryTests extends AndroidTestCase {
if (TextUtils.equals(word0, word1)) {
continue;
}
- final Pair<String, String> bigram = new Pair<String, String>(word0, word1);
+ final Pair<String, String> bigram = new Pair<>(word0, word1);
bigramWords.add(bigram);
- final int bigramProbability = random.nextInt(0xF);
+ final int unigramProbability = unigramProbabilities.get(word1);
+ final int bigramProbability =
+ unigramProbability + random.nextInt(0xFF - unigramProbability);
bigramProbabilities.put(bigram, bigramProbability);
addBigramWords(binaryDictionary, word0, word1, bigramProbability);
}
@@ -601,20 +663,24 @@ public class BinaryDictionaryTests extends AndroidTestCase {
0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
+
for (final Pair<String, String> bigram : bigramWords) {
- final int unigramProbability = unigramProbabilities.get(bigram.second);
final int bigramProbability = bigramProbabilities.get(bigram);
- final int probability = binaryDictionary.calculateProbability(unigramProbability,
- bigramProbability);
- assertEquals(probability,
- binaryDictionary.getBigramProbability(bigram.first, bigram.second));
+ assertEquals(bigramProbability != Dictionary.NOT_A_PROBABILITY,
+ isValidBigram(binaryDictionary, bigram.first, bigram.second));
+ if (canCheckBigramProbability(formatVersion)) {
+ assertEquals(bigramProbability,
+ getBigramProbability(binaryDictionary, bigram.first, bigram.second));
+ }
}
dictFile.delete();
}
public void testRandomOperationsAndFlashWithGC() {
- testRandomOperationsAndFlashWithGC(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testRandomOperationsAndFlashWithGC(formatVersion);
+ }
}
private void testRandomOperationsAndFlashWithGC(final int formatVersion) {
@@ -639,12 +705,11 @@ public class BinaryDictionaryTests extends AndroidTestCase {
BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
- final ArrayList<String> words = new ArrayList<String>();
- final ArrayList<Pair<String, String>> bigramWords = new ArrayList<Pair<String,String>>();
+ final ArrayList<String> words = new ArrayList<>();
+ final ArrayList<Pair<String, String>> bigramWords = new ArrayList<>();
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
- final HashMap<String, Integer> unigramProbabilities = new HashMap<String, Integer>();
- final HashMap<Pair<String, String>, Integer> bigramProbabilities =
- new HashMap<Pair<String, String>, Integer>();
+ final HashMap<String, Integer> unigramProbabilities = new HashMap<>();
+ final HashMap<Pair<String, String>, Integer> bigramProbabilities = new HashMap<>();
for (int i = 0; i < initialUnigramCount; ++i) {
final String word = CodePointUtils.generateWord(random, codePointSet);
words.add(word);
@@ -680,8 +745,10 @@ public class BinaryDictionaryTests extends AndroidTestCase {
if (TextUtils.equals(word0, word1)) {
continue;
}
- final int bigramProbability = random.nextInt(0xF);
- final Pair<String, String> bigram = new Pair<String, String>(word0, word1);
+ final int unigramProbability = unigramProbabilities.get(word1);
+ final int bigramProbability =
+ unigramProbability + random.nextInt(0xFF - unigramProbability);
+ final Pair<String, String> bigram = new Pair<>(word0, word1);
bigramWords.add(bigram);
bigramProbabilities.put(bigram, bigramProbability);
addBigramWords(binaryDictionary, word0, word1, bigramProbability);
@@ -692,7 +759,7 @@ public class BinaryDictionaryTests extends AndroidTestCase {
final Pair<String, String> bigram = bigramWords.get(bigramIndex);
bigramWords.remove(bigramIndex);
bigramProbabilities.remove(bigram);
- binaryDictionary.removeBigramWords(bigram.first, bigram.second);
+ removeBigramEntry(binaryDictionary, bigram.first, bigram.second);
}
}
@@ -705,17 +772,20 @@ public class BinaryDictionaryTests extends AndroidTestCase {
// Test whether the all bigram operations are collectlly handled.
for (int i = 0; i < bigramWords.size(); i++) {
final Pair<String, String> bigram = bigramWords.get(i);
- final int unigramProbability = unigramProbabilities.get(bigram.second);
final int probability;
if (bigramProbabilities.containsKey(bigram)) {
final int bigramProbability = bigramProbabilities.get(bigram);
- probability = binaryDictionary.calculateProbability(unigramProbability,
- bigramProbability);
+ probability = bigramProbability;
} else {
probability = Dictionary.NOT_A_PROBABILITY;
}
- assertEquals(probability,
- binaryDictionary.getBigramProbability(bigram.first, bigram.second));
+
+ if (canCheckBigramProbability(formatVersion)) {
+ assertEquals(probability,
+ getBigramProbability(binaryDictionary, bigram.first, bigram.second));
+ }
+ assertEquals(probability != Dictionary.NOT_A_PROBABILITY,
+ isValidBigram(binaryDictionary, bigram.first, bigram.second));
}
binaryDictionary.flushWithGC();
binaryDictionary.close();
@@ -725,7 +795,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testAddManyUnigramsAndFlushWithGC() {
- testAddManyUnigramsAndFlushWithGC(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddManyUnigramsAndFlushWithGC(formatVersion);
+ }
}
private void testAddManyUnigramsAndFlushWithGC(final int formatVersion) {
@@ -742,8 +814,8 @@ public class BinaryDictionaryTests extends AndroidTestCase {
fail("IOException while writing an initial dictionary : " + e);
}
- final ArrayList<String> words = new ArrayList<String>();
- final HashMap<String, Integer> unigramProbabilities = new HashMap<String, Integer>();
+ final ArrayList<String> words = new ArrayList<>();
+ final HashMap<String, Integer> unigramProbabilities = new HashMap<>();
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
BinaryDictionary binaryDictionary;
@@ -773,7 +845,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testUnigramAndBigramCount() {
- testUnigramAndBigramCount(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testUnigramAndBigramCount(formatVersion);
+ }
}
private void testUnigramAndBigramCount(final int formatVersion) {
@@ -791,8 +865,8 @@ public class BinaryDictionaryTests extends AndroidTestCase {
fail("IOException while writing an initial dictionary : " + e);
}
- final ArrayList<String> words = new ArrayList<String>();
- final HashSet<Pair<String, String>> bigrams = new HashSet<Pair<String, String>>();
+ final ArrayList<String> words = new ArrayList<>();
+ final HashSet<Pair<String, String>> bigrams = new HashSet<>();
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
BinaryDictionary binaryDictionary;
@@ -812,18 +886,18 @@ public class BinaryDictionaryTests extends AndroidTestCase {
if (TextUtils.equals(word0, word1)) {
continue;
}
- bigrams.add(new Pair<String, String>(word0, word1));
+ bigrams.add(new Pair<>(word0, word1));
final int bigramProbability = random.nextInt(0xF);
addBigramWords(binaryDictionary, word0, word1, bigramProbability);
}
- assertEquals(new HashSet<String>(words).size(), Integer.parseInt(
+ assertEquals(new HashSet<>(words).size(), Integer.parseInt(
binaryDictionary.getPropertyForTest(BinaryDictionary.UNIGRAM_COUNT_QUERY)));
- assertEquals(new HashSet<Pair<String, String>>(bigrams).size(), Integer.parseInt(
+ assertEquals(new HashSet<>(bigrams).size(), Integer.parseInt(
binaryDictionary.getPropertyForTest(BinaryDictionary.BIGRAM_COUNT_QUERY)));
binaryDictionary.flushWithGC();
- assertEquals(new HashSet<String>(words).size(), Integer.parseInt(
+ assertEquals(new HashSet<>(words).size(), Integer.parseInt(
binaryDictionary.getPropertyForTest(BinaryDictionary.UNIGRAM_COUNT_QUERY)));
- assertEquals(new HashSet<Pair<String, String>>(bigrams).size(), Integer.parseInt(
+ assertEquals(new HashSet<>(bigrams).size(), Integer.parseInt(
binaryDictionary.getPropertyForTest(BinaryDictionary.BIGRAM_COUNT_QUERY)));
binaryDictionary.close();
}
@@ -832,7 +906,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testAddMultipleDictionaryEntries() {
- testAddMultipleDictionaryEntries(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddMultipleDictionaryEntries(formatVersion);
+ }
}
private void testAddMultipleDictionaryEntries(final int formatVersion) {
@@ -850,16 +926,15 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
- final HashMap<String, Integer> unigramProbabilities = new HashMap<String, Integer>();
- final HashMap<Pair<String, String>, Integer> bigramProbabilities =
- new HashMap<Pair<String, String>, Integer>();
+ final HashMap<String, Integer> unigramProbabilities = new HashMap<>();
+ final HashMap<Pair<String, String>, Integer> bigramProbabilities = new HashMap<>();
final LanguageModelParam[] languageModelParams = new LanguageModelParam[lmParamCount];
String prevWord = null;
for (int i = 0; i < languageModelParams.length; i++) {
final String word = CodePointUtils.generateWord(random, codePointSet);
final int probability = random.nextInt(0xFF);
- final int bigramProbability = random.nextInt(0xF);
+ final int bigramProbability = probability + random.nextInt(0xFF - probability);
unigramProbabilities.put(word, probability);
if (prevWord == null) {
languageModelParams[i] = new LanguageModelParam(word, probability,
@@ -867,7 +942,7 @@ public class BinaryDictionaryTests extends AndroidTestCase {
} else {
languageModelParams[i] = new LanguageModelParam(prevWord, word, probability,
bigramProbability, BinaryDictionary.NOT_A_VALID_TIMESTAMP);
- bigramProbabilities.put(new Pair<String, String>(prevWord, word),
+ bigramProbabilities.put(new Pair<>(prevWord, word),
bigramProbability);
}
prevWord = (random.nextDouble() < bigramContinueRate) ? word : null;
@@ -885,16 +960,20 @@ public class BinaryDictionaryTests extends AndroidTestCase {
for (Map.Entry<Pair<String, String>, Integer> entry : bigramProbabilities.entrySet()) {
final String word0 = entry.getKey().first;
final String word1 = entry.getKey().second;
- final int unigramProbability = unigramProbabilities.get(word1);
final int bigramProbability = entry.getValue();
- final int probability = binaryDictionary.calculateProbability(
- unigramProbability, bigramProbability);
- assertEquals(probability, binaryDictionary.getBigramProbability(word0, word1));
+ assertEquals(bigramProbability != Dictionary.NOT_A_PROBABILITY,
+ isValidBigram(binaryDictionary, word0, word1));
+ if (canCheckBigramProbability(formatVersion)) {
+ assertEquals(bigramProbability,
+ getBigramProbability(binaryDictionary, word0, word1));
+ }
}
}
public void testGetWordProperties() {
- testGetWordProperties(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testGetWordProperties(formatVersion);
+ }
}
private void testGetWordProperties(final int formatVersion) {
@@ -918,11 +997,10 @@ public class BinaryDictionaryTests extends AndroidTestCase {
final WordProperty invalidWordProperty = binaryDictionary.getWordProperty("dummyWord");
assertFalse(invalidWordProperty.isValid());
- final ArrayList<String> words = new ArrayList<String>();
- final HashMap<String, Integer> wordProbabilities = new HashMap<String, Integer>();
- final HashMap<String, HashSet<String>> bigrams = new HashMap<String, HashSet<String>>();
- final HashMap<Pair<String, String>, Integer> bigramProbabilities =
- new HashMap<Pair<String, String>, Integer>();
+ final ArrayList<String> words = new ArrayList<>();
+ final HashMap<String, Integer> wordProbabilities = new HashMap<>();
+ final HashMap<String, HashSet<String>> bigrams = new HashMap<>();
+ final HashMap<Pair<String, String>, Integer> bigramProbabilities = new HashMap<>();
for (int i = 0; i < UNIGRAM_COUNT; i++) {
final String word = CodePointUtils.generateWord(random, codePointSet);
@@ -930,9 +1008,10 @@ public class BinaryDictionaryTests extends AndroidTestCase {
final boolean isNotAWord = random.nextBoolean();
final boolean isBlacklisted = random.nextBoolean();
// TODO: Add tests for historical info.
- binaryDictionary.addUnigramWord(word, unigramProbability,
+ binaryDictionary.addUnigramEntry(word, unigramProbability,
null /* shortcutTarget */, BinaryDictionary.NOT_A_PROBABILITY,
- isNotAWord, isBlacklisted, BinaryDictionary.NOT_A_VALID_TIMESTAMP);
+ false /* isBeginningOfSentence */, isNotAWord, isBlacklisted,
+ BinaryDictionary.NOT_A_VALID_TIMESTAMP);
if (binaryDictionary.needsToRunGC(false /* mindsBlockByGC */)) {
binaryDictionary.flushWithGC();
}
@@ -957,18 +1036,19 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
final String word0 = words.get(word0Index);
final String word1 = words.get(word1Index);
- final int bigramProbability = random.nextInt(0xF);
- binaryDictionary.addBigramWords(word0, word1, bigramProbability,
- BinaryDictionary.NOT_A_VALID_TIMESTAMP);
+ final int unigramProbability = wordProbabilities.get(word1);
+ final int bigramProbability =
+ unigramProbability + random.nextInt(0xFF - unigramProbability);
+ addBigramWords(binaryDictionary, word0, word1, bigramProbability);
if (binaryDictionary.needsToRunGC(false /* mindsBlockByGC */)) {
binaryDictionary.flushWithGC();
}
if (!bigrams.containsKey(word0)) {
- final HashSet<String> bigramWord1s = new HashSet<String>();
+ final HashSet<String> bigramWord1s = new HashSet<>();
bigrams.put(word0, bigramWord1s);
}
bigrams.get(word0).add(word1);
- bigramProbabilities.put(new Pair<String, String>(word0, word1), bigramProbability);
+ bigramProbabilities.put(new Pair<>(word0, word1), bigramProbability);
}
for (int i = 0; i < words.size(); i++) {
@@ -982,18 +1062,18 @@ public class BinaryDictionaryTests extends AndroidTestCase {
for (int j = 0; j < wordProperty.mBigrams.size(); j++) {
final String word1 = wordProperty.mBigrams.get(j).mWord;
assertTrue(bigramWord1s.contains(word1));
- final int bigramProbabilityDelta = bigramProbabilities.get(
- new Pair<String, String>(word0, word1));
- final int unigramProbability = wordProbabilities.get(word1);
- final int bigramProbablity = binaryDictionary.calculateProbability(
- unigramProbability, bigramProbabilityDelta);
- assertEquals(wordProperty.mBigrams.get(j).getProbability(), bigramProbablity);
+ if (canCheckBigramProbability(formatVersion)) {
+ final int bigramProbability = bigramProbabilities.get(new Pair<>(word0, word1));
+ assertEquals(bigramProbability, wordProperty.mBigrams.get(j).getProbability());
+ }
}
}
}
public void testIterateAllWords() {
- testIterateAllWords(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testIterateAllWords(formatVersion);
+ }
}
private void testIterateAllWords(final int formatVersion) {
@@ -1017,12 +1097,11 @@ public class BinaryDictionaryTests extends AndroidTestCase {
final WordProperty invalidWordProperty = binaryDictionary.getWordProperty("dummyWord");
assertFalse(invalidWordProperty.isValid());
- final ArrayList<String> words = new ArrayList<String>();
- final HashMap<String, Integer> wordProbabilitiesToCheckLater =
- new HashMap<String, Integer>();
- final HashMap<String, HashSet<String>> bigrams = new HashMap<String, HashSet<String>>();
+ final ArrayList<String> words = new ArrayList<>();
+ final HashMap<String, Integer> wordProbabilitiesToCheckLater = new HashMap<>();
+ final HashMap<String, HashSet<String>> bigrams = new HashMap<>();
final HashMap<Pair<String, String>, Integer> bigramProbabilitiesToCheckLater =
- new HashMap<Pair<String, String>, Integer>();
+ new HashMap<>();
for (int i = 0; i < UNIGRAM_COUNT; i++) {
final String word = CodePointUtils.generateWord(random, codePointSet);
@@ -1043,24 +1122,24 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
final String word0 = words.get(word0Index);
final String word1 = words.get(word1Index);
- final int bigramProbability = random.nextInt(0xF);
- binaryDictionary.addBigramWords(word0, word1, bigramProbability,
- BinaryDictionary.NOT_A_VALID_TIMESTAMP);
+ final int unigramProbability = wordProbabilitiesToCheckLater.get(word1);
+ final int bigramProbability =
+ unigramProbability + random.nextInt(0xFF - unigramProbability);
+ addBigramWords(binaryDictionary, word0, word1, bigramProbability);
if (binaryDictionary.needsToRunGC(false /* mindsBlockByGC */)) {
binaryDictionary.flushWithGC();
}
if (!bigrams.containsKey(word0)) {
- final HashSet<String> bigramWord1s = new HashSet<String>();
+ final HashSet<String> bigramWord1s = new HashSet<>();
bigrams.put(word0, bigramWord1s);
}
bigrams.get(word0).add(word1);
- bigramProbabilitiesToCheckLater.put(
- new Pair<String, String>(word0, word1), bigramProbability);
+ bigramProbabilitiesToCheckLater.put(new Pair<>(word0, word1), bigramProbability);
}
- final HashSet<String> wordSet = new HashSet<String>(words);
+ final HashSet<String> wordSet = new HashSet<>(words);
final HashSet<Pair<String, String>> bigramSet =
- new HashSet<Pair<String,String>>(bigramProbabilitiesToCheckLater.keySet());
+ new HashSet<>(bigramProbabilitiesToCheckLater.keySet());
int token = 0;
do {
final BinaryDictionary.GetNextWordPropertyResult result =
@@ -1074,12 +1153,11 @@ public class BinaryDictionaryTests extends AndroidTestCase {
for (int j = 0; j < wordProperty.mBigrams.size(); j++) {
final String word1 = wordProperty.mBigrams.get(j).mWord;
assertTrue(bigramWord1s.contains(word1));
- final int unigramProbability = wordProbabilitiesToCheckLater.get(word1);
- final Pair<String, String> bigram = new Pair<String, String>(word0, word1);
- final int bigramProbabilityDelta = bigramProbabilitiesToCheckLater.get(bigram);
- final int bigramProbablity = binaryDictionary.calculateProbability(
- unigramProbability, bigramProbabilityDelta);
- assertEquals(wordProperty.mBigrams.get(j).getProbability(), bigramProbablity);
+ final Pair<String, String> bigram = new Pair<>(word0, word1);
+ if (canCheckBigramProbability(formatVersion)) {
+ final int bigramProbability = bigramProbabilitiesToCheckLater.get(bigram);
+ assertEquals(bigramProbability, wordProperty.mBigrams.get(j).getProbability());
+ }
bigramSet.remove(bigram);
}
token = result.mNextToken;
@@ -1089,7 +1167,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testAddShortcuts() {
- testAddShortcuts(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddShortcuts(formatVersion);
+ }
}
private void testAddShortcuts(final int formatVersion) {
@@ -1105,26 +1185,26 @@ public class BinaryDictionaryTests extends AndroidTestCase {
final int unigramProbability = 100;
final int shortcutProbability = 10;
- binaryDictionary.addUnigramWord("aaa", unigramProbability, "zzz",
- shortcutProbability, false /* isNotAWord */, false /* isBlacklisted */,
- 0 /* timestamp */);
+ binaryDictionary.addUnigramEntry("aaa", unigramProbability, "zzz",
+ shortcutProbability, false /* isBeginningOfSentence */,
+ false /* isNotAWord */, false /* isBlacklisted */, 0 /* timestamp */);
WordProperty wordProperty = binaryDictionary.getWordProperty("aaa");
assertEquals(1, wordProperty.mShortcutTargets.size());
assertEquals("zzz", wordProperty.mShortcutTargets.get(0).mWord);
assertEquals(shortcutProbability, wordProperty.mShortcutTargets.get(0).getProbability());
final int updatedShortcutProbability = 2;
- binaryDictionary.addUnigramWord("aaa", unigramProbability, "zzz",
- updatedShortcutProbability, false /* isNotAWord */, false /* isBlacklisted */,
- 0 /* timestamp */);
+ binaryDictionary.addUnigramEntry("aaa", unigramProbability, "zzz",
+ updatedShortcutProbability, false /* isBeginningOfSentence */,
+ false /* isNotAWord */, false /* isBlacklisted */, 0 /* timestamp */);
wordProperty = binaryDictionary.getWordProperty("aaa");
assertEquals(1, wordProperty.mShortcutTargets.size());
assertEquals("zzz", wordProperty.mShortcutTargets.get(0).mWord);
assertEquals(updatedShortcutProbability,
wordProperty.mShortcutTargets.get(0).getProbability());
- binaryDictionary.addUnigramWord("aaa", unigramProbability, "yyy",
- shortcutProbability, false /* isNotAWord */, false /* isBlacklisted */,
- 0 /* timestamp */);
- final HashMap<String, Integer> shortcutTargets = new HashMap<String, Integer>();
+ binaryDictionary.addUnigramEntry("aaa", unigramProbability, "yyy",
+ shortcutProbability, false /* isBeginningOfSentence */, false /* isNotAWord */,
+ false /* isBlacklisted */, 0 /* timestamp */);
+ final HashMap<String, Integer> shortcutTargets = new HashMap<>();
shortcutTargets.put("zzz", updatedShortcutProbability);
shortcutTargets.put("yyy", shortcutProbability);
wordProperty = binaryDictionary.getWordProperty("aaa");
@@ -1149,7 +1229,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
public void testAddManyShortcuts() {
- testAddManyShortcuts(FormatSpec.VERSION4);
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testAddManyShortcuts(formatVersion);
+ }
}
private void testAddManyShortcuts(final int formatVersion) {
@@ -1160,10 +1242,9 @@ public class BinaryDictionaryTests extends AndroidTestCase {
final int codePointSetSize = 20;
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
- final ArrayList<String> words = new ArrayList<String>();
- final HashMap<String, Integer> unigramProbabilities = new HashMap<String, Integer>();
- final HashMap<String, HashMap<String, Integer>> shortcutTargets =
- new HashMap<String, HashMap<String, Integer>>();
+ final ArrayList<String> words = new ArrayList<>();
+ final HashMap<String, Integer> unigramProbabilities = new HashMap<>();
+ final HashMap<String, HashMap<String, Integer>> shortcutTargets = new HashMap<>();
File dictFile = null;
try {
@@ -1190,15 +1271,14 @@ public class BinaryDictionaryTests extends AndroidTestCase {
final int shortcutProbability = random.nextInt(0xF);
final String word = words.get(random.nextInt(words.size()));
final int unigramProbability = unigramProbabilities.get(word);
- binaryDictionary.addUnigramWord(word, unigramProbability, shortcutTarget,
- shortcutProbability, false /* isNotAWord */, false /* isBlacklisted */,
- 0 /* timestamp */);
+ binaryDictionary.addUnigramEntry(word, unigramProbability, shortcutTarget,
+ shortcutProbability, false /* isBeginningOfSentence */, false /* isNotAWord */,
+ false /* isBlacklisted */, 0 /* timestamp */);
if (shortcutTargets.containsKey(word)) {
final HashMap<String, Integer> shortcutTargetsOfWord = shortcutTargets.get(word);
shortcutTargetsOfWord.put(shortcutTarget, shortcutProbability);
} else {
- final HashMap<String, Integer> shortcutTargetsOfWord =
- new HashMap<String, Integer>();
+ final HashMap<String, Integer> shortcutTargetsOfWord = new HashMap<>();
shortcutTargetsOfWord.put(shortcutTarget, shortcutProbability);
shortcutTargets.put(word, shortcutTargetsOfWord);
}
@@ -1223,4 +1303,198 @@ public class BinaryDictionaryTests extends AndroidTestCase {
}
}
}
+
+ public void testDictMigration() {
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testDictMigration(FormatSpec.VERSION4_ONLY_FOR_TESTING, formatVersion);
+ }
+ }
+
+ private void testDictMigration(final int fromFormatVersion, final int toFormatVersion) {
+ File dictFile = null;
+ try {
+ dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary", fromFormatVersion);
+ } catch (IOException e) {
+ fail("IOException while writing an initial dictionary : " + e);
+ }
+ final BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
+ 0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
+ Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
+ final int unigramProbability = 100;
+ addUnigramWord(binaryDictionary, "aaa", unigramProbability);
+ addUnigramWord(binaryDictionary, "bbb", unigramProbability);
+ final int bigramProbability = 150;
+ addBigramWords(binaryDictionary, "aaa", "bbb", bigramProbability);
+ final int shortcutProbability = 10;
+ binaryDictionary.addUnigramEntry("ccc", unigramProbability, "xxx", shortcutProbability,
+ false /* isBeginningOfSentence */, false /* isNotAWord */,
+ false /* isBlacklisted */, 0 /* timestamp */);
+ binaryDictionary.addUnigramEntry("ddd", unigramProbability, null /* shortcutTarget */,
+ Dictionary.NOT_A_PROBABILITY, false /* isBeginningOfSentence */,
+ true /* isNotAWord */, true /* isBlacklisted */, 0 /* timestamp */);
+ assertEquals(unigramProbability, binaryDictionary.getFrequency("aaa"));
+ assertEquals(unigramProbability, binaryDictionary.getFrequency("bbb"));
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "bbb"));
+ assertEquals(fromFormatVersion, binaryDictionary.getFormatVersion());
+ assertTrue(binaryDictionary.migrateTo(toFormatVersion));
+ assertTrue(binaryDictionary.isValidDictionary());
+ assertEquals(toFormatVersion, binaryDictionary.getFormatVersion());
+ assertEquals(unigramProbability, binaryDictionary.getFrequency("aaa"));
+ assertEquals(unigramProbability, binaryDictionary.getFrequency("bbb"));
+ if (canCheckBigramProbability(toFormatVersion)) {
+ assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "aaa", "bbb"));
+ }
+ assertTrue(isValidBigram(binaryDictionary, "aaa", "bbb"));
+ WordProperty wordProperty = binaryDictionary.getWordProperty("ccc");
+ assertEquals(1, wordProperty.mShortcutTargets.size());
+ assertEquals("xxx", wordProperty.mShortcutTargets.get(0).mWord);
+ wordProperty = binaryDictionary.getWordProperty("ddd");
+ assertTrue(wordProperty.mIsBlacklistEntry);
+ assertTrue(wordProperty.mIsNotAWord);
+ }
+
+ public void testLargeDictMigration() {
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testLargeDictMigration(FormatSpec.VERSION4_ONLY_FOR_TESTING, formatVersion);
+ }
+ }
+
+ private void testLargeDictMigration(final int fromFormatVersion, final int toFormatVersion) {
+ final int UNIGRAM_COUNT = 3000;
+ final int BIGRAM_COUNT = 3000;
+ final int codePointSetSize = 50;
+ final long seed = System.currentTimeMillis();
+ final Random random = new Random(seed);
+
+ File dictFile = null;
+ try {
+ dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary", fromFormatVersion);
+ } catch (IOException e) {
+ fail("IOException while writing an initial dictionary : " + e);
+ }
+ final BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
+ 0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
+ Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
+
+ final ArrayList<String> words = new ArrayList<>();
+ final ArrayList<Pair<String, String>> bigrams = new ArrayList<>();
+ final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
+ final HashMap<String, Integer> unigramProbabilities = new HashMap<>();
+ final HashMap<Pair<String, String>, Integer> bigramProbabilities = new HashMap<>();
+
+ for (int i = 0; i < UNIGRAM_COUNT; i++) {
+ final String word = CodePointUtils.generateWord(random, codePointSet);
+ final int unigramProbability = random.nextInt(0xFF);
+ addUnigramWord(binaryDictionary, word, unigramProbability);
+ if (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
+ binaryDictionary.flushWithGC();
+ }
+ words.add(word);
+ unigramProbabilities.put(word, unigramProbability);
+ }
+
+ for (int i = 0; i < BIGRAM_COUNT; i++) {
+ final int word0Index = random.nextInt(words.size());
+ final int word1Index = random.nextInt(words.size());
+ if (word0Index == word1Index) {
+ continue;
+ }
+ final String word0 = words.get(word0Index);
+ final String word1 = words.get(word1Index);
+ final int unigramProbability = unigramProbabilities.get(word1);
+ final int bigramProbability =
+ random.nextInt(0xFF - unigramProbability) + unigramProbability;
+ addBigramWords(binaryDictionary, word0, word1, bigramProbability);
+ if (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
+ binaryDictionary.flushWithGC();
+ }
+ final Pair<String, String> bigram = new Pair<>(word0, word1);
+ bigrams.add(bigram);
+ bigramProbabilities.put(bigram, bigramProbability);
+ }
+ assertTrue(binaryDictionary.migrateTo(toFormatVersion));
+
+ for (final String word : words) {
+ assertEquals((int)unigramProbabilities.get(word), binaryDictionary.getFrequency(word));
+ }
+ assertEquals(unigramProbabilities.size(), Integer.parseInt(
+ binaryDictionary.getPropertyForTest(BinaryDictionary.UNIGRAM_COUNT_QUERY)));
+
+ for (final Pair<String, String> bigram : bigrams) {
+ if (canCheckBigramProbability(toFormatVersion)) {
+ assertEquals((int)bigramProbabilities.get(bigram),
+ getBigramProbability(binaryDictionary, bigram.first, bigram.second));
+ }
+ assertTrue(isValidBigram(binaryDictionary, bigram.first, bigram.second));
+ }
+ assertEquals(bigramProbabilities.size(), Integer.parseInt(
+ binaryDictionary.getPropertyForTest(BinaryDictionary.BIGRAM_COUNT_QUERY)));
+ }
+
+ public void testBeginningOfSentence() {
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ if (supportsBeginningOfSentence(formatVersion)) {
+ testBeginningOfSentence(formatVersion);
+ }
+ }
+ }
+
+ private void testBeginningOfSentence(final int formatVersion) {
+ File dictFile = null;
+ try {
+ dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary", formatVersion);
+ } catch (IOException e) {
+ fail("IOException while writing an initial dictionary : " + e);
+ }
+ final BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
+ 0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
+ Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
+ final int dummyProbability = 0;
+ final PrevWordsInfo prevWordsInfoBeginningOfSentence = PrevWordsInfo.BEGINNING_OF_SENTENCE;
+ final int bigramProbability = 200;
+ addUnigramWord(binaryDictionary, "aaa", dummyProbability);
+ binaryDictionary.addNgramEntry(prevWordsInfoBeginningOfSentence, "aaa", bigramProbability,
+ BinaryDictionary.NOT_A_VALID_TIMESTAMP /* timestamp */);
+ assertEquals(bigramProbability,
+ binaryDictionary.getNgramProbability(prevWordsInfoBeginningOfSentence, "aaa"));
+ binaryDictionary.addNgramEntry(prevWordsInfoBeginningOfSentence, "aaa", bigramProbability,
+ BinaryDictionary.NOT_A_VALID_TIMESTAMP /* timestamp */);
+ addUnigramWord(binaryDictionary, "bbb", dummyProbability);
+ binaryDictionary.addNgramEntry(prevWordsInfoBeginningOfSentence, "bbb", bigramProbability,
+ BinaryDictionary.NOT_A_VALID_TIMESTAMP /* timestamp */);
+ binaryDictionary.flushWithGC();
+ assertEquals(bigramProbability,
+ binaryDictionary.getNgramProbability(prevWordsInfoBeginningOfSentence, "aaa"));
+ assertEquals(bigramProbability,
+ binaryDictionary.getNgramProbability(prevWordsInfoBeginningOfSentence, "bbb"));
+ }
+
+ public void testGetMaxFrequencyOfExactMatches() {
+ for (final int formatVersion : DICT_FORMAT_VERSIONS) {
+ testGetMaxFrequencyOfExactMatches(formatVersion);
+ }
+ }
+
+ private void testGetMaxFrequencyOfExactMatches(final int formatVersion) {
+ File dictFile = null;
+ try {
+ dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary", formatVersion);
+ } catch (IOException e) {
+ fail("IOException while writing an initial dictionary : " + e);
+ }
+ final BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
+ 0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
+ Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
+ addUnigramWord(binaryDictionary, "abc", 10);
+ addUnigramWord(binaryDictionary, "aBc", 15);
+ assertEquals(15, binaryDictionary.getMaxFrequencyOfExactMatches("abc"));
+ addUnigramWord(binaryDictionary, "ab'c", 20);
+ assertEquals(20, binaryDictionary.getMaxFrequencyOfExactMatches("abc"));
+ addUnigramWord(binaryDictionary, "a-b-c", 25);
+ assertEquals(25, binaryDictionary.getMaxFrequencyOfExactMatches("abc"));
+ addUnigramWord(binaryDictionary, "ab-'-'-'-c", 30);
+ assertEquals(30, binaryDictionary.getMaxFrequencyOfExactMatches("abc"));
+ addUnigramWord(binaryDictionary, "ab c", 255);
+ assertEquals(30, binaryDictionary.getMaxFrequencyOfExactMatches("abc"));
+ }
}
diff --git a/tests/src/com/android/inputmethod/latin/DistracterFilterTest.java b/tests/src/com/android/inputmethod/latin/DistracterFilterTest.java
new file mode 100644
index 000000000..70b8f530a
--- /dev/null
+++ b/tests/src/com/android/inputmethod/latin/DistracterFilterTest.java
@@ -0,0 +1,151 @@
+/*
+ * 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 java.util.Locale;
+
+import android.test.suitebuilder.annotation.LargeTest;
+
+import com.android.inputmethod.latin.utils.DistracterFilterCheckingExactMatches;
+
+/**
+ * Unit test for DistracterFilter
+ */
+@LargeTest
+public class DistracterFilterTest extends InputTestsBase {
+ private DistracterFilterCheckingExactMatches mDistracterFilter;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mDistracterFilter = new DistracterFilterCheckingExactMatches(getContext());
+ mDistracterFilter.updateEnabledSubtypes(mLatinIME.getEnabledSubtypesForTest());
+ }
+
+ public void testIsDistractorToWordsInDictionaries() {
+ final PrevWordsInfo EMPTY_PREV_WORDS_INFO = PrevWordsInfo.EMPTY_PREV_WORDS_INFO;
+
+ final Locale localeEnUs = new Locale("en", "US");
+ String typedWord;
+
+ typedWord = "Bill";
+ // For this test case, we consider "Bill" is a distracter to "bill".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "nOt";
+ // For this test case, we consider "nOt" is a distracter to "not".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "youre";
+ // For this test case, we consider "youre" is a distracter to "you're".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "Banana";
+ // For this test case, we consider "Banana" is a distracter to "banana".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "orange";
+ // For this test case, we consider "orange" is not a distracter to any word in dictionaries.
+ assertFalse(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "Orange";
+ // For this test case, we consider "Orange" is a distracter to "orange".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "café";
+ // For this test case, we consider "café" is a distracter to "cafe".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "cafe";
+ // For this test case, we consider "cafe" is not a distracter to any word in dictionaries.
+ assertFalse(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "I'll";
+ // For this test case, we consider "I'll" is not a distracter to any word in dictionaries.
+ assertFalse(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "ill";
+ // For this test case, we consider "ill" is a distracter to "I'll"
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "asdfd";
+ // For this test case, we consider "asdfd" is not a distracter to any word in dictionaries.
+ assertFalse(
+ mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ typedWord = "thank";
+ // For this test case, we consider "thank" is not a distracter to any other word
+ // in dictionaries.
+ assertFalse(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeEnUs));
+
+ final Locale localeDeDe = new Locale("de", "DE");
+
+ typedWord = "fuer";
+ // For this test case, we consider "fuer" is a distracter to "für".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeDeDe));
+
+ typedWord = "fUEr";
+ // For this test case, we consider "fUEr" is a distracter to "für".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeDeDe));
+
+ typedWord = "fur";
+ // For this test case, we consider "fur" is a distracter to "für".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeDeDe));
+
+ final Locale localeFrFr = new Locale("fr", "FR");
+
+ typedWord = "a";
+ // For this test case, we consider "a" is a distracter to "à".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeFrFr));
+
+ typedWord = "à";
+ // For this test case, we consider "à" is not a distracter to any word in dictionaries.
+ assertFalse(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeFrFr));
+
+ typedWord = "etre";
+ // For this test case, we consider "etre" is a distracter to "être".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeFrFr));
+
+ typedWord = "États-unis";
+ // For this test case, we consider "États-unis" is a distracter to "États-Unis".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeFrFr));
+
+ typedWord = "ÉtatsUnis";
+ // For this test case, we consider "ÉtatsUnis" is a distracter to "États-Unis".
+ assertTrue(mDistracterFilter.isDistracterToWordsInDictionaries(
+ EMPTY_PREV_WORDS_INFO, typedWord, localeFrFr));
+ }
+}
diff --git a/tests/src/com/android/inputmethod/latin/InputLogicTests.java b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
index d2dd29262..460f600ac 100644
--- a/tests/src/com/android/inputmethod/latin/InputLogicTests.java
+++ b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
@@ -334,6 +334,18 @@ public class InputLogicTests extends InputTestsBase {
assertEquals("manual pick then separator", EXPECTED_RESULT, mEditText.getText().toString());
}
+ // This test matches the one in InputLogicTestsNonEnglish. In some non-English languages,
+ // ! and ? are clustering punctuation signs.
+ public void testClusteringPunctuation() {
+ final String WORD1_TO_TYPE = "test";
+ final String WORD2_TO_TYPE = "!!?!:!";
+ final String EXPECTED_RESULT = "test!!?!:!";
+ type(WORD1_TO_TYPE);
+ pickSuggestionManually(0, WORD1_TO_TYPE);
+ type(WORD2_TO_TYPE);
+ assertEquals("clustering punctuation", EXPECTED_RESULT, mEditText.getText().toString());
+ }
+
public void testManualPickThenStripperThenPick() {
final String WORD_TO_TYPE = "this";
final String STRIPPER = "\n";
@@ -469,6 +481,27 @@ public class InputLogicTests extends InputTestsBase {
suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null);
}
+ public void testPredictionsWithDoubleSpaceToPeriod() {
+ final String WORD_TO_TYPE = "Barack ";
+ type(WORD_TO_TYPE);
+ sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
+ runMessages();
+ // No need to test here, testPredictionsAfterSpace is testing it already
+ type(" ");
+ sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
+ runMessages();
+ // Test the predictions have been cleared
+ SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest();
+ assertEquals("predictions cleared after double-space-to-period", suggestedWords.size(), 0);
+ type(Constants.CODE_DELETE);
+ sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
+ runMessages();
+ // Test the first prediction is displayed
+ suggestedWords = mLatinIME.getSuggestedWordsForTest();
+ assertEquals("predictions after cancel double-space-to-period", "Obama",
+ suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null);
+ }
+
public void testPredictionsAfterManualPick() {
final String WORD_TO_TYPE = "Barack";
type(WORD_TO_TYPE);
@@ -588,4 +621,16 @@ public class InputLogicTests extends InputTestsBase {
assertEquals("type words letter by letter", EXPECTED_RESULT,
mEditText.getText().toString());
}
+
+ public void testSwitchLanguages() {
+ final String WORD_TO_TYPE_FIRST_PART = "com";
+ final String WORD_TO_TYPE_SECOND_PART = "md ";
+ final String EXPECTED_RESULT = "comme ";
+ changeLanguage("en");
+ type(WORD_TO_TYPE_FIRST_PART);
+ changeLanguage("fr");
+ type(WORD_TO_TYPE_SECOND_PART);
+ assertEquals("Composing continues after switching languages", EXPECTED_RESULT,
+ mEditText.getText().toString());
+ }
}
diff --git a/tests/src/com/android/inputmethod/latin/InputLogicTestsLanguageWithoutSpaces.java b/tests/src/com/android/inputmethod/latin/InputLogicTestsLanguageWithoutSpaces.java
index e38ba721e..2560407dc 100644
--- a/tests/src/com/android/inputmethod/latin/InputLogicTestsLanguageWithoutSpaces.java
+++ b/tests/src/com/android/inputmethod/latin/InputLogicTestsLanguageWithoutSpaces.java
@@ -19,8 +19,6 @@ package com.android.inputmethod.latin;
import android.test.suitebuilder.annotation.LargeTest;
import android.view.inputmethod.BaseInputConnection;
-import com.android.inputmethod.latin.suggestions.SuggestionStripView;
-
@LargeTest
public class InputLogicTestsLanguageWithoutSpaces extends InputTestsBase {
public void testAutoCorrectForLanguageWithoutSpaces() {
diff --git a/tests/src/com/android/inputmethod/latin/InputLogicTestsNonEnglish.java b/tests/src/com/android/inputmethod/latin/InputLogicTestsNonEnglish.java
index 1257ae297..914b0bb23 100644
--- a/tests/src/com/android/inputmethod/latin/InputLogicTestsNonEnglish.java
+++ b/tests/src/com/android/inputmethod/latin/InputLogicTestsNonEnglish.java
@@ -18,8 +18,6 @@ package com.android.inputmethod.latin;
import android.test.suitebuilder.annotation.LargeTest;
-import com.android.inputmethod.latin.suggestions.SuggestionStripView;
-
@LargeTest
public class InputLogicTestsNonEnglish extends InputTestsBase {
final String NEXT_WORD_PREDICTION_OPTION = "next_word_prediction";
@@ -45,6 +43,19 @@ public class InputLogicTestsNonEnglish extends InputTestsBase {
mEditText.getText().toString());
}
+ public void testClusteringPunctuationForFrench() {
+ final String WORD1_TO_TYPE = "test";
+ final String WORD2_TO_TYPE = "!!?!:!";
+ // In English, the expected result would be "test!!?!:!"
+ final String EXPECTED_RESULT = "test !!?! : !";
+ changeLanguage("fr");
+ type(WORD1_TO_TYPE);
+ pickSuggestionManually(0, WORD1_TO_TYPE);
+ type(WORD2_TO_TYPE);
+ assertEquals("clustering punctuation for French", EXPECTED_RESULT,
+ mEditText.getText().toString());
+ }
+
public void testWordThenSpaceThenPunctuationFromStripTwiceForFrench() {
final String WORD_TO_TYPE = "test ";
final String PUNCTUATION_FROM_STRIP = "!";
diff --git a/tests/src/com/android/inputmethod/latin/InputLogicTestsReorderingMyanmar.java b/tests/src/com/android/inputmethod/latin/InputLogicTestsReorderingMyanmar.java
new file mode 100644
index 000000000..61eae4e8b
--- /dev/null
+++ b/tests/src/com/android/inputmethod/latin/InputLogicTestsReorderingMyanmar.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2012 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 android.util.Pair;
+
+/*
+ * Relevant characters for this test :
+ * Spurs the need to reorder :
+ * U+1031 MYANMAR VOWEL SIGN E : ေ
+ * U+1004 U+103A U+1039 Kinzi. It's a compound character.
+ *
+ * List of consonants :
+ * U+1000 MYANMAR LETTER KA က
+ * U+1001 MYANMAR LETTER KHA ခ
+ * U+1002 MYANMAR LETTER GA ဂ
+ * U+1003 MYANMAR LETTER GHA ဃ
+ * U+1004 MYANMAR LETTER NGA င
+ * U+1005 MYANMAR LETTER CA စ
+ * U+1006 MYANMAR LETTER CHA ဆ
+ * U+1007 MYANMAR LETTER JA ဇ
+ * U+1008 MYANMAR LETTER JHA ဈ
+ * U+1009 MYANMAR LETTER NYA ဉ
+ * U+100A MYANMAR LETTER NNYA ည
+ * U+100B MYANMAR LETTER TTA ဋ
+ * U+100C MYANMAR LETTER TTHA ဌ
+ * U+100D MYANMAR LETTER DDA ဍ
+ * U+100E MYANMAR LETTER DDHA ဎ
+ * U+100F MYANMAR LETTER NNA ဏ
+ * U+1010 MYANMAR LETTER TA တ
+ * U+1011 MYANMAR LETTER THA ထ
+ * U+1012 MYANMAR LETTER DA ဒ
+ * U+1013 MYANMAR LETTER DHA ဓ
+ * U+1014 MYANMAR LETTER NA န
+ * U+1015 MYANMAR LETTER PA ပ
+ * U+1016 MYANMAR LETTER PHA ဖ
+ * U+1017 MYANMAR LETTER BA ဗ
+ * U+1018 MYANMAR LETTER BHA ဘ
+ * U+1019 MYANMAR LETTER MA မ
+ * U+101A MYANMAR LETTER YA ယ
+ * U+101B MYANMAR LETTER RA ရ
+ * U+101C MYANMAR LETTER LA လ
+ * U+101D MYANMAR LETTER WA ဝ
+ * U+101E MYANMAR LETTER SA သ
+ * U+101F MYANMAR LETTER HA ဟ
+ * U+1020 MYANMAR LETTER LLA ဠ
+ * U+103F MYANMAR LETTER GREAT SA ဿ
+ *
+ * List of medials :
+ * U+103B MYANMAR CONSONANT SIGN MEDIAL YA ျ
+ * U+103C MYANMAR CONSONANT SIGN MEDIAL RA ြ
+ * U+103D MYANMAR CONSONANT SIGN MEDIAL WA ွ
+ * U+103E MYANMAR CONSONANT SIGN MEDIAL HA ှ
+ * U+105E MYANMAR CONSONANT SIGN MON MEDIAL NA ၞ
+ * U+105F MYANMAR CONSONANT SIGN MON MEDIAL MA ၟ
+ * U+1060 MYANMAR CONSONANT SIGN MON MEDIAL LA ၠ
+ * U+1082 MYANMAR CONSONANT SIGN SHAN MEDIAL WA ႂ
+ *
+ * Other relevant characters :
+ * U+200C ZERO WIDTH NON-JOINER
+ * U+200B ZERO WIDTH SPACE
+ */
+
+@LargeTest
+@SuppressWarnings("rawtypes")
+public class InputLogicTestsReorderingMyanmar extends InputTestsBase {
+ // The tests are formatted as follows.
+ // Each test is an entry in the array of Pair arrays.
+
+ // One test is an array of pairs. Each pair contains, in the `first' member,
+ // the code points that the next key press should contain. In the `second'
+ // member is stored the string that should be in the text view after this
+ // key press.
+
+ private static final Pair[][] TESTS = {
+
+ // Tests for U+1031 MYANMAR VOWEL SIGN E : ေ
+ new Pair[] { // Type : U+1031 U+1000 U+101F ေ က ဟ
+ Pair.create(new int[] { 0x1031 }, "\u1031"), // ေ
+ Pair.create(new int[] { 0x1000 }, "\u1000\u1031"), // ကေ
+ Pair.create(new int[] { 0x101F }, "\u1000\u1031\u101F") // ကေဟ
+ },
+
+ new Pair[] { // Type : U+1000 U+1031 U+101F က ေ ဟ
+ Pair.create(new int[] { 0x1000 }, "\u1000"), // က
+ Pair.create(new int[] { 0x1031 }, "\u1000\u200B\u1031"), // က‌ေ
+ Pair.create(new int[] { 0x101F }, "\u1000\u101F\u1031") // ကဟေ
+ },
+
+ new Pair[] { // Type : U+1031 U+101D U+103E U+1018 ေ ဝ ှ ဘ
+ Pair.create(new int[] { 0x1031 }, "\u1031"), // ေ
+ Pair.create(new int[] { 0x101D }, "\u101D\u1031"), // ဝေ
+ Pair.create(new int[] { 0x103E }, "\u101D\u103E\u1031"), // ဝှေ
+ Pair.create(new int[] { 0x1018 }, "\u101D\u103E\u1031\u1018") // ဝှေဘ
+ },
+
+ new Pair[] { // Type : U+1031 U+1014 U+1031 U+1000 U+102C U+1004 U+103A U+1038 U+101C
+ // U+102C U+1038 U+104B ေ န ေ က ာ င ် း လ ာ း ။
+ Pair.create(new int[] { 0x1031 }, "\u1031"), // ေ
+ Pair.create(new int[] { 0x1014 }, "\u1014\u1031"), // နေ
+ Pair.create(new int[] { 0x1031 }, "\u1014\u1031\u1031"), // နေ‌ေ
+ Pair.create(new int[] { 0x1000 }, "\u1014\u1031\u1000\u1031"), // နေကေ
+ Pair.create(new int[] { 0x102C }, "\u1014\u1031\u1000\u1031\u102C"), // နေကော
+ Pair.create(new int[] { 0x1004 }, "\u1014\u1031\u1000\u1031\u102C\u1004"), // နေကောင
+ Pair.create(new int[] { 0x103A }, // နေကောင်
+ "\u1014\u1031\u1000\u1031\u102C\u1004\u103A"),
+ Pair.create(new int[] { 0x1038 }, // နေကောင်း
+ "\u1014\u1031\u1000\u1031\u102C\u1004\u103A\u1038"),
+ Pair.create(new int[] { 0x101C }, // နေကောင်းလ
+ "\u1014\u1031\u1000\u1031\u102C\u1004\u103A\u1038\u101C"),
+ Pair.create(new int[] { 0x102C }, // နေကောင်းလာ
+ "\u1014\u1031\u1000\u1031\u102C\u1004\u103A\u1038\u101C\u102C"),
+ Pair.create(new int[] { 0x1038 }, // နေကောင်းလား
+ "\u1014\u1031\u1000\u1031\u102C\u1004\u103A\u1038\u101C\u102C\u1038"),
+ Pair.create(new int[] { 0x104B }, // နေကောင်းလား။
+ "\u1014\u1031\u1000\u1031\u102C\u1004\u103A\u1038\u101C\u102C\u1038\u104B")
+ },
+
+ new Pair[] { // Type : U+1031 U+1031 U+1031 U+1000 ေ ေ ေ က
+ Pair.create(new int[] { 0x1031 }, "\u1031"), // ေ
+ Pair.create(new int[] { 0x1031 }, "\u1031\u1031"), // ေေ
+ Pair.create(new int[] { 0x1031 }, "\u1031\u1031\u1031"), // U+1031ေေေ
+ Pair.create(new int[] { 0x1000 }, "\u1031\u1031\u1000\u1031") // ေေကေ
+ },
+
+ new Pair[] { // Type : U+1031 U+1001 U+103B U+103D U+1038 ေ ခ ျ ွ း
+ Pair.create(new int[] { 0x1031 }, "\u1031"), // ေ
+ Pair.create(new int[] { 0x1001 }, "\u1001\u1031"), // ခေ
+ Pair.create(new int[] { 0x103B }, "\u1001\u103B\u1031"), // ချေ
+ Pair.create(new int[] { 0x103D }, "\u1001\u103B\u103D\u1031"), // ချွေ
+ Pair.create(new int[] { 0x1038 }, "\u1001\u103B\u103D\u1031\u1038") // ချွေး
+ },
+
+ // Tests for Kinzi U+1004 U+103A U+1039 :
+
+ /* Kinzi reordering is not implemented yet. Uncomment these tests when it is.
+
+ new Pair[] { // Type : U+1021 U+1002 (U+1004 U+103A U+1039)
+ // U+101C U+1014 U+103A အ ဂ (င ် ္) လ န ်
+ Pair.create(new int[] { 0x1021 }, "\u1021"), // အ
+ Pair.create(new int[] { 0x1002 }, "\u1021\u1002"), // အဂ
+ Pair.create(new int[] { 0x1004, 0x103A, 0x1039 }, // အင်္ဂ
+ "\u1021\u1004\u103A\u1039\u1002"),
+ Pair.create(new int[] { 0x101C }, // အင်္ဂလ
+ "\u1021\u1004\u103A\u1039\u1002\u101C"),
+ Pair.create(new int[] { 0x1014 }, // အင်္ဂလန
+ "\u1021\u1004\u103A\u1039\u1002\u101C\u1014"),
+ Pair.create(new int[] { 0x103A }, // အင်္ဂလန်
+ "\u1021\u1004\u103A\u1039\u1002\u101C\u1014\u103A")
+ },
+
+ new Pair[] { //Type : kinzi after a whole syllable U+101E U+1001 U+103B U+102D U+102F
+ // (U+1004 U+103A U+1039) U+1004 U+103A U+1038 သ ခ ျ ိ ု င ် ္ င ် း
+ Pair.create(new int[] { 0x101E }, "\u101E"), // သခ
+ Pair.create(new int[] { 0x1001 }, "\u101E\u1001"), // သခ
+ Pair.create(new int[] { 0x103B }, "\u101E\u1001\u103B"), // သချ
+ Pair.create(new int[] { 0x102D }, "\u101E\u1001\u103B\u102D"), // သချိ
+ Pair.create(new int[] { 0x102F }, "\u101E\u1001\u103B\u102D\u102F"), // သချို
+ Pair.create(new int[] { 0x1004, 0x103A, 0x1039}, // သင်္ချို
+ "\u101E\u1004\u103A\u1039\u1001\u103B\u102D\u102F"),
+ Pair.create(new int[] { 0x1004 }, // သင်္ချိုင
+ "\u101E\u1004\u103A\u1039\u1001\u103B\u102D\u102F\u1004"),
+ Pair.create(new int[] { 0x103A }, // သင်္ချိုင်
+ "\u101E\u1004\u103A\u1039\u1001\u103B\u102D\u102F\u1004\u103A"),
+ Pair.create(new int[] { 0x1038 }, // သင်္ချိုင်း
+ "\u101E\u1004\u103A\u1039\u1001\u103B\u102D\u102F\u1004\u103A\u1038")
+ },
+
+ new Pair[] { // Type : kinzi after the consonant U+101E U+1001 (U+1004 U+103A U+1039)
+ // U+103B U+102D U+102F U+1004 U+103A U+1038 သ ခ င ် ္ ျ ိ ု င ် း
+ Pair.create(new int[] { 0x101E }, "\u101E"), // သခ
+ Pair.create(new int[] { 0x1001 }, "\u101E\u1001"), // သခ
+ Pair.create(new int[] { 0x1004, 0x103A, 0x1039 }, // သင်္ခ
+ "\u101E\u1004\u103A\u1039\u1001"),
+ Pair.create(new int[] { 0x103B }, // သင်္ချ
+ "\u101E\u1004\u103A\u1039\u1001\u103B"),
+ Pair.create(new int[] { 0x102D }, // သင်္ချိ
+ "\u101E\u1004\u103A\u1039\u1001\u103B\u102D"),
+ Pair.create(new int[] { 0x102F }, // သင်္ချို
+ "\u101E\u1004\u103A\u1039\u1001\u103B\u102D\u102F"),
+ Pair.create(new int[] { 0x1004 }, // သင်္ချိုင
+ "\u101E\u1004\u103A\u1039\u1001\u103B\u102D\u102F\u1004"),
+ Pair.create(new int[] { 0x103A }, // သင်္ချိုင်
+ "\u101E\u1004\u103A\u1039\u1001\u103B\u102D\u102F\u1004\u103A"),
+ Pair.create(new int[] { 0x1038 }, // သင်္ချိုင်း
+ "\u101E\u1004\u103A\u1039\u1001\u103B\u102D\u102F\u1004\u103A\u1038")
+ },
+ */
+ };
+
+ @SuppressWarnings("unchecked")
+ private void doMyanmarTest(final int testNumber, final Pair[] test) {
+ int stepNumber = 0;
+ for (final Pair<int[], String> step : test) {
+ ++stepNumber;
+ final int[] input = step.first;
+ final String expectedResult = step.second;
+ if (input.length > 1) {
+ mLatinIME.onTextInput(new String(input, 0, input.length));
+ } else {
+ type(input[0]);
+ }
+ assertEquals("Myanmar reordering test " + testNumber + ", step " + stepNumber,
+ expectedResult, mEditText.getText().toString());
+ }
+ }
+
+ public void testMyanmarReordering() {
+ int testNumber = 0;
+ changeLanguage("my_MM", "CombiningRules=MyanmarReordering");
+ for (final Pair[] test : TESTS) {
+ // Small trick to reset LatinIME : setText("") and send updateSelection with values
+ // LatinIME has never seen, and cursor pos 0,0.
+ mEditText.setText("");
+ mLatinIME.onUpdateSelection(1, 1, 0, 0, -1, -1);
+ doMyanmarTest(++testNumber, test);
+ }
+ }
+}
diff --git a/tests/src/com/android/inputmethod/latin/InputTestsBase.java b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
index 260e534ee..8406c9099 100644
--- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java
+++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
@@ -162,9 +162,9 @@ public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> {
return previousSetting;
}
- // returns the previous setting value
- protected boolean setDebugMode(final boolean value) {
- return setBooleanPreference(DebugSettings.PREF_DEBUG_MODE, value, false);
+ protected void setDebugMode(final boolean value) {
+ setBooleanPreference(DebugSettings.PREF_DEBUG_MODE, value, false);
+ setBooleanPreference(Settings.PREF_KEY_IS_INTERNAL, value, false);
}
protected EditorInfo enrichEditorInfo(final EditorInfo ei) {
@@ -299,11 +299,15 @@ public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> {
}
protected void changeLanguage(final String locale) {
- changeLanguageWithoutWait(locale);
+ changeLanguage(locale, null);
+ }
+
+ protected void changeLanguage(final String locale, final String combiningSpec) {
+ changeLanguageWithoutWait(locale, combiningSpec);
waitForDictionariesToBeLoaded();
}
- protected void changeLanguageWithoutWait(final String locale) {
+ protected void changeLanguageWithoutWait(final String locale, final String combiningSpec) {
mEditText.mCurrentLocale = LocaleUtils.constructLocaleFromString(locale);
// TODO: this is forcing a QWERTY keyboard for all locales, which is wrong.
// It's still better than using whatever keyboard is the current one, but we
@@ -314,7 +318,8 @@ public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> {
"KeyboardLayoutSet=" + SubtypeLocaleUtils.QWERTY
+ "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE
+ "," + Constants.Subtype.ExtraValue.ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE
- + "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE;
+ + "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE
+ + null == combiningSpec ? "" : ("," + combiningSpec);
final InputMethodSubtype subtype = InputMethodSubtypeCompatUtils.newInputMethodSubtype(
R.string.subtype_no_language_qwerty,
R.drawable.ic_ime_switcher_dark,
@@ -325,7 +330,7 @@ public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> {
false /* overridesImplicitlyEnabledSubtype */,
0 /* id */);
SubtypeSwitcher.getInstance().forceSubtype(subtype);
- mLatinIME.loadKeyboard();
+ mLatinIME.onCurrentInputMethodSubtypeChanged(subtype);
runMessages();
mKeyboard = mLatinIME.mKeyboardSwitcher.getKeyboard();
mLatinIME.clearPersonalizedDictionariesForTest();
diff --git a/tests/src/com/android/inputmethod/latin/LatinImeStressTests.java b/tests/src/com/android/inputmethod/latin/LatinImeStressTests.java
index db14b8329..f5e993de8 100644
--- a/tests/src/com/android/inputmethod/latin/LatinImeStressTests.java
+++ b/tests/src/com/android/inputmethod/latin/LatinImeStressTests.java
@@ -30,10 +30,10 @@ public class LatinImeStressTests extends InputTestsBase {
final int maxWordCountToTypeInEachIteration = 20;
final long seed = System.currentTimeMillis();
final Random random = new Random(seed);
- final int codePointSetSize = 30;
final int[] codePointSet = CodePointUtils.LATIN_ALPHABETS_LOWER;
for (int i = 0; i < switchCount; ++i) {
- changeLanguageWithoutWait(locales[random.nextInt(locales.length)]);
+ changeLanguageWithoutWait(locales[random.nextInt(locales.length)],
+ null /* combiningSpec */);
final int wordCount = random.nextInt(maxWordCountToTypeInEachIteration);
for (int j = 0; j < wordCount; ++j) {
final String word = CodePointUtils.generateWord(random, codePointSet);
@@ -50,7 +50,8 @@ public class LatinImeStressTests extends InputTestsBase {
final int codePointSetSize = 30;
final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
for (int i = 0; i < switchCount; ++i) {
- changeLanguageWithoutWait(locales[random.nextInt(locales.length)]);
+ changeLanguageWithoutWait(locales[random.nextInt(locales.length)],
+ null /* combiningSpec */);
final int wordCount = random.nextInt(maxWordCountToTypeInEachIteration);
for (int j = 0; j < wordCount; ++j) {
final String word = CodePointUtils.generateWord(random, codePointSet);
diff --git a/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java b/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
index 842f3f3a9..2c92bb3d6 100644
--- a/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
+++ b/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
@@ -155,13 +155,17 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
*/
public void testGetPreviousWord() {
// If one of the following cases breaks, the bigram suggestions won't work.
- assertEquals(RichInputConnection.getNthPreviousWord(
- "abc def", mSpacingAndPunctuations, 2), "abc");
- assertNull(RichInputConnection.getNthPreviousWord(
- "abc", mSpacingAndPunctuations, 2));
- assertNull(RichInputConnection.getNthPreviousWord(
- "abc. def", mSpacingAndPunctuations, 2));
-
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc def", mSpacingAndPunctuations, 2).mPrevWord, "abc");
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc", mSpacingAndPunctuations, 2), PrevWordsInfo.BEGINNING_OF_SENTENCE);
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc. def", mSpacingAndPunctuations, 2), PrevWordsInfo.BEGINNING_OF_SENTENCE);
+
+ assertFalse(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc def", mSpacingAndPunctuations, 2).mIsBeginningOfSentence);
+ assertTrue(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc", mSpacingAndPunctuations, 2).mIsBeginningOfSentence);
// The following tests reflect the current behavior of the function
// RichInputConnection#getNthPreviousWord.
// TODO: However at this time, the code does never go
@@ -169,23 +173,33 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
// this function if needed - especially since it does not seem very
// logical. These tests are just there to catch any unintentional
// changes in the behavior of the RichInputConnection#getPreviousWord method.
- assertEquals(RichInputConnection.getNthPreviousWord(
- "abc def ", mSpacingAndPunctuations, 2), "abc");
- assertEquals(RichInputConnection.getNthPreviousWord(
- "abc def.", mSpacingAndPunctuations, 2), "abc");
- assertEquals(RichInputConnection.getNthPreviousWord(
- "abc def .", mSpacingAndPunctuations, 2), "def");
- assertNull(RichInputConnection.getNthPreviousWord(
- "abc ", mSpacingAndPunctuations, 2));
-
- assertEquals(RichInputConnection.getNthPreviousWord(
- "abc def", mSpacingAndPunctuations, 1), "def");
- assertEquals(RichInputConnection.getNthPreviousWord(
- "abc def ", mSpacingAndPunctuations, 1), "def");
- assertNull(RichInputConnection.getNthPreviousWord(
- "abc def.", mSpacingAndPunctuations, 1));
- assertNull(RichInputConnection.getNthPreviousWord(
- "abc def .", mSpacingAndPunctuations, 1));
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc def ", mSpacingAndPunctuations, 2).mPrevWord, "abc");
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc def.", mSpacingAndPunctuations, 2).mPrevWord, "abc");
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc def .", mSpacingAndPunctuations, 2).mPrevWord, "def");
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc ", mSpacingAndPunctuations, 2), PrevWordsInfo.BEGINNING_OF_SENTENCE);
+
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc def", mSpacingAndPunctuations, 1).mPrevWord, "def");
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc def ", mSpacingAndPunctuations, 1).mPrevWord, "def");
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc 'def", mSpacingAndPunctuations, 1).mPrevWord, "'def");
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc def.", mSpacingAndPunctuations, 1), PrevWordsInfo.BEGINNING_OF_SENTENCE);
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc def .", mSpacingAndPunctuations, 1), PrevWordsInfo.BEGINNING_OF_SENTENCE);
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc, def", mSpacingAndPunctuations, 2), PrevWordsInfo.EMPTY_PREV_WORDS_INFO);
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc? def", mSpacingAndPunctuations, 2), PrevWordsInfo.EMPTY_PREV_WORDS_INFO);
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc! def", mSpacingAndPunctuations, 2), PrevWordsInfo.EMPTY_PREV_WORDS_INFO);
+ assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
+ "abc 'def", mSpacingAndPunctuations, 2), PrevWordsInfo.EMPTY_PREV_WORDS_INFO);
}
/**
diff --git a/tests/src/com/android/inputmethod/latin/ShiftModeTests.java b/tests/src/com/android/inputmethod/latin/ShiftModeTests.java
index 6fc9df793..a319ffda6 100644
--- a/tests/src/com/android/inputmethod/latin/ShiftModeTests.java
+++ b/tests/src/com/android/inputmethod/latin/ShiftModeTests.java
@@ -16,6 +16,7 @@
package com.android.inputmethod.latin;
+import android.os.Build;
import android.test.suitebuilder.annotation.LargeTest;
import android.text.TextUtils;
import android.view.inputmethod.EditorInfo;
@@ -78,4 +79,56 @@ public class ShiftModeTests extends InputTestsBase {
runMessages();
assertTrue("Caps after a while after repeating Backspace a lot", isCapsModeAutoShifted());
}
+
+ public void testAutoCapsAfterDigitsPeriod() {
+ changeLanguage("en");
+ type("On 22.11.");
+ assertFalse("(English) Auto caps after digits-period", isCapsModeAutoShifted());
+ type(" ");
+ assertTrue("(English) Auto caps after digits-period-whitespace", isCapsModeAutoShifted());
+ mEditText.setText("");
+ changeLanguage("fr");
+ type("Le 22.");
+ assertFalse("(French) Auto caps after digits-period", isCapsModeAutoShifted());
+ type(" ");
+ assertTrue("(French) Auto caps after digits-period-whitespace", isCapsModeAutoShifted());
+ mEditText.setText("");
+ changeLanguage("de");
+ type("Am 22.");
+ assertFalse("(German) Auto caps after digits-period", isCapsModeAutoShifted());
+ type(" ");
+ // For German, no auto-caps in this case
+ assertFalse("(German) Auto caps after digits-period-whitespace", isCapsModeAutoShifted());
+ }
+
+ public void testAutoCapsAfterInvertedMarks() {
+ changeLanguage("es");
+ assertTrue("(Spanish) Auto caps at start", isCapsModeAutoShifted());
+ type("Hey. ¿");
+ assertTrue("(Spanish) Auto caps after inverted what", isCapsModeAutoShifted());
+ mEditText.setText("");
+ type("¡");
+ assertTrue("(Spanish) Auto caps after inverted bang", isCapsModeAutoShifted());
+ }
+
+ public void DISABLED_testOtherSentenceSeparators() {
+ // We only run this test on Kitkat+ because previous versions of Android don't
+ // have an Armenian locale. For some reason I don't know, when the requested
+ // locale is not present as a device locale, then the application under test can't
+ // access the resources in that locale -- though it works when the app is actually
+ // running on the device and not under test. If we ever figure out what's going
+ // on, remove this test.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ changeLanguage("hy-AM");
+ assertTrue("(Armenian) Auto caps at start", isCapsModeAutoShifted());
+ type("Hey. ");
+ assertFalse("(Armenian) No auto-caps after latin period", isCapsModeAutoShifted());
+ type("Hey\u0589");
+ assertFalse("(Armenian) No auto-caps directly after armenian period",
+ isCapsModeAutoShifted());
+ type(" ");
+ assertTrue("(Armenian) Auto-caps after armenian period-whitespace",
+ isCapsModeAutoShifted());
+ }
+ }
}
diff --git a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java
index 8fe473523..66b4a9c71 100644
--- a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java
+++ b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java
@@ -16,12 +16,10 @@
package com.android.inputmethod.latin;
-import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
-
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import java.util.ArrayList;
import java.util.Locale;
@@ -33,7 +31,7 @@ public class SuggestedWordsTests extends AndroidTestCase {
final String TYPED_WORD = "typed";
final int TYPED_WORD_FREQ = 5;
final int NUMBER_OF_ADDED_SUGGESTIONS = 5;
- final ArrayList<SuggestedWordInfo> list = CollectionUtils.newArrayList();
+ final ArrayList<SuggestedWordInfo> list = new ArrayList<>();
list.add(new SuggestedWordInfo(TYPED_WORD, TYPED_WORD_FREQ,
SuggestedWordInfo.KIND_TYPED, null /* sourceDict */,
SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */,
@@ -53,16 +51,16 @@ public class SuggestedWordsTests extends AndroidTestCase {
false /* isPrediction*/);
assertEquals(NUMBER_OF_ADDED_SUGGESTIONS + 1, words.size());
assertEquals("typed", words.getWord(0));
- assertEquals(SuggestedWordInfo.KIND_TYPED, words.getInfo(0).mKind);
+ assertTrue(words.getInfo(0).isKindOf(SuggestedWordInfo.KIND_TYPED));
assertEquals("0", words.getWord(1));
- assertEquals(SuggestedWordInfo.KIND_CORRECTION, words.getInfo(1).mKind);
+ assertTrue(words.getInfo(1).isKindOf(SuggestedWordInfo.KIND_CORRECTION));
assertEquals("4", words.getWord(5));
- assertEquals(SuggestedWordInfo.KIND_CORRECTION, words.getInfo(5).mKind);
+ assertTrue(words.getInfo(5).isKindOf(SuggestedWordInfo.KIND_CORRECTION));
final SuggestedWords wordsWithoutTyped = words.getSuggestedWordsExcludingTypedWord();
assertEquals(words.size() - 1, wordsWithoutTyped.size());
assertEquals("0", wordsWithoutTyped.getWord(0));
- assertEquals(SuggestedWordInfo.KIND_CORRECTION, wordsWithoutTyped.getInfo(0).mKind);
+ assertTrue(wordsWithoutTyped.getInfo(0).isKindOf(SuggestedWordInfo.KIND_CORRECTION));
}
// Helper for testGetTransformedWordInfo
diff --git a/tests/src/com/android/inputmethod/latin/WordComposerTests.java b/tests/src/com/android/inputmethod/latin/WordComposerTests.java
index d68bb5c54..c44544f3d 100644
--- a/tests/src/com/android/inputmethod/latin/WordComposerTests.java
+++ b/tests/src/com/android/inputmethod/latin/WordComposerTests.java
@@ -40,8 +40,7 @@ public class WordComposerTests extends AndroidTestCase {
final int[] COORDINATES_WITHIN_BMP =
CoordinateUtils.newCoordinateArray(CODEPOINTS_WITHIN_BMP.length,
Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
- final String PREVWORD = "prevword";
- wc.setComposingWord(CODEPOINTS_WITHIN_BMP, COORDINATES_WITHIN_BMP, PREVWORD);
+ wc.setComposingWord(CODEPOINTS_WITHIN_BMP, COORDINATES_WITHIN_BMP);
assertEquals(wc.size(), STR_WITHIN_BMP.codePointCount(0, STR_WITHIN_BMP.length()));
assertFalse(wc.isCursorFrontOrMiddleOfComposingWord());
wc.setCursorPositionWithinWord(2);
@@ -56,15 +55,12 @@ public class WordComposerTests extends AndroidTestCase {
// Move the cursor to after the 'f'
assertTrue(wc.moveCursorByAndReturnIfInsideComposingWord(1));
assertFalse(wc.isCursorFrontOrMiddleOfComposingWord());
- // Check the previous word is still there
- assertEquals(PREVWORD, wc.getPreviousWordForSuggestion());
// Move the cursor past the end of the word
assertFalse(wc.moveCursorByAndReturnIfInsideComposingWord(1));
assertFalse(wc.moveCursorByAndReturnIfInsideComposingWord(15));
// Do what LatinIME does when the cursor is moved outside of the word,
// and check the behavior is correct.
wc.reset();
- assertNull(wc.getPreviousWordForSuggestion());
// \uD861\uDED7 is 𨛗, a character outside the BMP
final String STR_WITH_SUPPLEMENTARY_CHAR = "abcde\uD861\uDED7fgh";
@@ -73,8 +69,8 @@ public class WordComposerTests extends AndroidTestCase {
final int[] COORDINATES_WITH_SUPPLEMENTARY_CHAR =
CoordinateUtils.newCoordinateArray(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR.length,
Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
- wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR, COORDINATES_WITH_SUPPLEMENTARY_CHAR,
- null /* previousWord */);
+ wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR,
+ COORDINATES_WITH_SUPPLEMENTARY_CHAR);
assertEquals(wc.size(), CODEPOINTS_WITH_SUPPLEMENTARY_CHAR.length);
assertFalse(wc.isCursorFrontOrMiddleOfComposingWord());
wc.setCursorPositionWithinWord(3);
@@ -83,48 +79,43 @@ public class WordComposerTests extends AndroidTestCase {
assertTrue(wc.isCursorFrontOrMiddleOfComposingWord());
assertTrue(wc.moveCursorByAndReturnIfInsideComposingWord(1));
assertFalse(wc.isCursorFrontOrMiddleOfComposingWord());
- assertNull(wc.getPreviousWordForSuggestion());
- wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR, COORDINATES_WITH_SUPPLEMENTARY_CHAR,
- STR_WITHIN_BMP);
+ wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR,
+ COORDINATES_WITH_SUPPLEMENTARY_CHAR);
wc.setCursorPositionWithinWord(3);
assertTrue(wc.moveCursorByAndReturnIfInsideComposingWord(7));
- assertEquals(STR_WITHIN_BMP, wc.getPreviousWordForSuggestion());
- wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR, COORDINATES_WITH_SUPPLEMENTARY_CHAR,
- STR_WITH_SUPPLEMENTARY_CHAR);
+ wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR,
+ COORDINATES_WITH_SUPPLEMENTARY_CHAR);
wc.setCursorPositionWithinWord(3);
assertTrue(wc.moveCursorByAndReturnIfInsideComposingWord(7));
- assertEquals(STR_WITH_SUPPLEMENTARY_CHAR, wc.getPreviousWordForSuggestion());
- wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR, COORDINATES_WITH_SUPPLEMENTARY_CHAR,
- STR_WITHIN_BMP);
+ wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR,
+ COORDINATES_WITH_SUPPLEMENTARY_CHAR);
wc.setCursorPositionWithinWord(3);
assertTrue(wc.moveCursorByAndReturnIfInsideComposingWord(-3));
assertFalse(wc.moveCursorByAndReturnIfInsideComposingWord(-1));
- assertEquals(STR_WITHIN_BMP, wc.getPreviousWordForSuggestion());
- wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR, COORDINATES_WITH_SUPPLEMENTARY_CHAR,
- null /* previousWord */);
+
+ wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR,
+ COORDINATES_WITH_SUPPLEMENTARY_CHAR);
wc.setCursorPositionWithinWord(3);
assertFalse(wc.moveCursorByAndReturnIfInsideComposingWord(-9));
- assertNull(wc.getPreviousWordForSuggestion());
- wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR, COORDINATES_WITH_SUPPLEMENTARY_CHAR,
- STR_WITH_SUPPLEMENTARY_CHAR);
+ wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR,
+ COORDINATES_WITH_SUPPLEMENTARY_CHAR);
assertTrue(wc.moveCursorByAndReturnIfInsideComposingWord(-10));
- assertEquals(STR_WITH_SUPPLEMENTARY_CHAR, wc.getPreviousWordForSuggestion());
- wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR, COORDINATES_WITH_SUPPLEMENTARY_CHAR,
- null /* previousWord */);
+ wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR,
+ COORDINATES_WITH_SUPPLEMENTARY_CHAR);
assertFalse(wc.moveCursorByAndReturnIfInsideComposingWord(-11));
- wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR, COORDINATES_WITH_SUPPLEMENTARY_CHAR,
- null /* previousWord */);
+ wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR,
+ COORDINATES_WITH_SUPPLEMENTARY_CHAR);
assertTrue(wc.moveCursorByAndReturnIfInsideComposingWord(0));
- wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR, COORDINATES_WITH_SUPPLEMENTARY_CHAR,
- null /* previousWord */);
+ wc.setComposingWord(CODEPOINTS_WITH_SUPPLEMENTARY_CHAR,
+ COORDINATES_WITH_SUPPLEMENTARY_CHAR);
wc.setCursorPositionWithinWord(2);
assertTrue(wc.moveCursorByAndReturnIfInsideComposingWord(0));
}
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
index f29fc21c1..4b332ca84 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
@@ -28,10 +28,8 @@ import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer;
import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions;
import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode;
import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray;
-import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
import com.android.inputmethod.latin.utils.ByteArrayDictBuffer;
-import com.android.inputmethod.latin.utils.CollectionUtils;
import java.io.File;
import java.io.IOException;
@@ -61,15 +59,12 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
private static final int NUM_OF_NODES_HAVING_SHORTCUTS = 50;
private static final int NUM_OF_SHORTCUTS = 5;
- private static final ArrayList<String> sWords = CollectionUtils.newArrayList();
- private static final ArrayList<String> sWordsWithVariousCodePoints =
- CollectionUtils.newArrayList();
- private static final SparseArray<List<Integer>> sEmptyBigrams =
- CollectionUtils.newSparseArray();
- private static final SparseArray<List<Integer>> sStarBigrams = CollectionUtils.newSparseArray();
- private static final SparseArray<List<Integer>> sChainBigrams =
- CollectionUtils.newSparseArray();
- private static final HashMap<String, List<String>> sShortcuts = CollectionUtils.newHashMap();
+ private static final ArrayList<String> sWords = new ArrayList<>();
+ private static final ArrayList<String> sWordsWithVariousCodePoints = new ArrayList<>();
+ private static final SparseArray<List<Integer>> sEmptyBigrams = new SparseArray<>();
+ private static final SparseArray<List<Integer>> sStarBigrams = new SparseArray<>();
+ private static final SparseArray<List<Integer>> sChainBigrams = new SparseArray<>();
+ private static final HashMap<String, List<String>> sShortcuts = new HashMap<>();
public BinaryDictDecoderEncoderTests() {
this(System.currentTimeMillis(), DEFAULT_MAX_UNIGRAMS);
@@ -125,7 +120,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
private void generateWords(final int number, final Random random) {
final int[] codePointSet = CodePointUtils.generateCodePointSet(DEFAULT_CODE_POINT_SET_SIZE,
random);
- final Set<String> wordSet = CollectionUtils.newHashSet();
+ final Set<String> wordSet = new HashSet<>();
while (wordSet.size() < number) {
wordSet.add(CodePointUtils.generateWord(random, codePointSet));
}
@@ -147,7 +142,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
final List<String> words, final HashMap<String, List<String>> shortcutMap) {
for (int i = 0; i < number; ++i) {
final String word = words.get(i);
- final ArrayList<WeightedString> shortcuts = CollectionUtils.newArrayList();
+ final ArrayList<WeightedString> shortcuts = new ArrayList<>();
if (shortcutMap != null && shortcutMap.containsKey(word)) {
for (final String shortcut : shortcutMap.get(word)) {
shortcuts.add(new WeightedString(shortcut, UNIGRAM_FREQ));
@@ -325,7 +320,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
}
public void testReadAndWriteWithByteBuffer() {
- final List<String> results = CollectionUtils.newArrayList();
+ final List<String> results = new ArrayList<>();
runReadAndWriteTests(results, BinaryDictUtils.USE_BYTE_BUFFER,
BinaryDictUtils.VERSION2_OPTIONS);
@@ -339,7 +334,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
}
public void testReadAndWriteWithByteArray() {
- final List<String> results = CollectionUtils.newArrayList();
+ final List<String> results = new ArrayList<>();
runReadAndWriteTests(results, BinaryDictUtils.USE_BYTE_ARRAY,
BinaryDictUtils.VERSION2_OPTIONS);
@@ -362,8 +357,8 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
final TreeMap<Integer, ArrayList<PendingAttribute>> resultBigrams,
final boolean checkProbability) {
// check unigrams
- final Set<String> actualWordsSet = new HashSet<String>(resultWords.values());
- final Set<String> expectedWordsSet = new HashSet<String>(expectedWords);
+ final Set<String> actualWordsSet = new HashSet<>(resultWords.values());
+ final Set<String> expectedWordsSet = new HashSet<>(expectedWords);
assertEquals(actualWordsSet, expectedWordsSet);
if (checkProbability) {
for (int freq : resultFrequencies.values()) {
@@ -372,7 +367,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
}
// check bigrams
- final HashMap<String, Set<String>> expBigrams = new HashMap<String, Set<String>>();
+ final HashMap<String, Set<String>> expBigrams = new HashMap<>();
for (int i = 0; i < expectedBigrams.size(); ++i) {
final String word1 = expectedWords.get(expectedBigrams.keyAt(i));
for (int w2 : expectedBigrams.valueAt(i)) {
@@ -383,7 +378,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
}
}
- final HashMap<String, Set<String>> actBigrams = new HashMap<String, Set<String>>();
+ final HashMap<String, Set<String>> actBigrams = new HashMap<>();
for (Entry<Integer, ArrayList<PendingAttribute>> entry : resultBigrams.entrySet()) {
final String word1 = resultWords.get(entry.getKey());
final int unigramFreq = resultFrequencies.get(entry.getKey());
@@ -407,10 +402,9 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
private long timeAndCheckReadUnigramsAndBigramsBinary(final File file, final List<String> words,
final SparseArray<List<Integer>> bigrams, final int bufferType,
final boolean checkProbability) {
- final TreeMap<Integer, String> resultWords = CollectionUtils.newTreeMap();
- final TreeMap<Integer, ArrayList<PendingAttribute>> resultBigrams =
- CollectionUtils.newTreeMap();
- final TreeMap<Integer, Integer> resultFreqs = CollectionUtils.newTreeMap();
+ final TreeMap<Integer, String> resultWords = new TreeMap<>();
+ final TreeMap<Integer, ArrayList<PendingAttribute>> resultBigrams = new TreeMap<>();
+ final TreeMap<Integer, Integer> resultFreqs = new TreeMap<>();
long now = -1, diff = -1;
try {
@@ -468,7 +462,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
}
public void testReadUnigramsAndBigramsBinaryWithByteBuffer() {
- final ArrayList<String> results = CollectionUtils.newArrayList();
+ final ArrayList<String> results = new ArrayList<>();
runReadUnigramsAndBigramsTests(results, BinaryDictUtils.USE_BYTE_BUFFER,
BinaryDictUtils.VERSION2_OPTIONS);
@@ -479,7 +473,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
}
public void testReadUnigramsAndBigramsBinaryWithByteArray() {
- final ArrayList<String> results = CollectionUtils.newArrayList();
+ final ArrayList<String> results = new ArrayList<>();
runReadUnigramsAndBigramsTests(results, BinaryDictUtils.USE_BYTE_ARRAY,
BinaryDictUtils.VERSION2_OPTIONS);
@@ -590,7 +584,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
}
public void testGetTerminalPosition() {
- final ArrayList<String> results = CollectionUtils.newArrayList();
+ final ArrayList<String> results = new ArrayList<>();
runGetTerminalPositionTests(BinaryDictUtils.USE_BYTE_ARRAY,
BinaryDictUtils.VERSION2_OPTIONS);
@@ -656,15 +650,15 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
0 /* offset */, file.length(), true /* useFullEditDistance */,
Locale.ENGLISH, dictName, false /* isUpdatable */);
- final HashSet<String> wordSet = new HashSet<String>(words);
- final HashSet<Pair<String, String>> bigramSet = new HashSet<Pair<String,String>>();
+ final HashSet<String> wordSet = new HashSet<>(words);
+ final HashSet<Pair<String, String>> bigramSet = new HashSet<>();
for (int i = 0; i < words.size(); i++) {
final List<Integer> bigramList = bigrams.get(i);
if (bigramList != null) {
for (final Integer word1Index : bigramList) {
final String word1 = words.get(word1Index);
- bigramSet.add(new Pair<String, String>(words.get(i), word1));
+ bigramSet.add(new Pair<>(words.get(i), word1));
}
}
}
@@ -689,7 +683,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
}
for (int j = 0; j < wordProperty.mBigrams.size(); j++) {
final String word1 = wordProperty.mBigrams.get(j).mWord;
- final Pair<String, String> bigram = new Pair<String, String>(word0, word1);
+ final Pair<String, String> bigram = new Pair<>(word0, word1);
assertTrue(bigramSet.contains(bigram));
bigramSet.remove(bigram);
}
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
index 6f8b07a34..96604a197 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
@@ -32,9 +32,6 @@ import java.nio.ByteBuffer;
* TODO: Rename this class to DictDecoderUtils.
*/
public final class BinaryDictDecoderUtils {
-
- private static final boolean DBG = MakedictLog.DBG;
-
private BinaryDictDecoderUtils() {
// This utility class is not publicly instantiable.
}
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java
index 39bd98bad..084371944 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java
@@ -258,7 +258,7 @@ public class BinaryDictEncoderUtils {
final PtNodeArray rootNodeArray) {
final int treeSize = FusionDictionary.countPtNodes(rootNodeArray);
MakedictLog.i("Counted nodes : " + treeSize);
- final ArrayList<PtNodeArray> flatTree = new ArrayList<PtNodeArray>(treeSize);
+ final ArrayList<PtNodeArray> flatTree = new ArrayList<>(treeSize);
return flattenTreeInner(flatTree, rootNodeArray);
}
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
index 42a50be66..9c3b37387 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
@@ -90,7 +90,7 @@ public final class BinaryDictIOUtils {
final Map<Integer, ArrayList<PendingAttribute>> bigrams) {
int[] pushedChars = new int[FormatSpec.MAX_WORD_LENGTH + 1];
- Stack<Position> stack = new Stack<Position>();
+ Stack<Position> stack = new Stack<>();
int index = 0;
Position initPos = new Position(bodyOffset, 0);
diff --git a/tests/src/com/android/inputmethod/latin/makedict/FusionDictionary.java b/tests/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
index f60b3af4f..4a8c178b5 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
@@ -57,7 +57,7 @@ public final class FusionDictionary implements Iterable<WordProperty> {
int mCachedParentAddress = 0;
public PtNodeArray() {
- mData = new ArrayList<PtNode>();
+ mData = new ArrayList<>();
}
public PtNodeArray(ArrayList<PtNode> data) {
Collections.sort(data, PTNODE_COMPARATOR);
@@ -161,14 +161,14 @@ public final class FusionDictionary implements Iterable<WordProperty> {
// We don't want write permission to escape outside the package, so we return a copy
if (null == mShortcutTargets) return null;
final ArrayList<WeightedString> copyOfShortcutTargets =
- new ArrayList<WeightedString>(mShortcutTargets);
+ new ArrayList<>(mShortcutTargets);
return copyOfShortcutTargets;
}
public ArrayList<WeightedString> getBigrams() {
// We don't want write permission to escape outside the package, so we return a copy
if (null == mBigrams) return null;
- final ArrayList<WeightedString> copyOfBigrams = new ArrayList<WeightedString>(mBigrams);
+ final ArrayList<WeightedString> copyOfBigrams = new ArrayList<>(mBigrams);
return copyOfBigrams;
}
@@ -183,7 +183,7 @@ public final class FusionDictionary implements Iterable<WordProperty> {
*/
public void addBigram(final String word, final ProbabilityInfo probabilityInfo) {
if (mBigrams == null) {
- mBigrams = new ArrayList<WeightedString>();
+ mBigrams = new ArrayList<>();
}
WeightedString bigram = getBigram(word);
if (bigram != null) {
@@ -571,7 +571,6 @@ public final class FusionDictionary implements Iterable<WordProperty> {
/**
* Helper method to find a word in a given branch.
*/
- @SuppressWarnings("unused")
public static PtNode findWordInTree(PtNodeArray nodeArray, final String string) {
int index = 0;
final StringBuilder checker = DBG ? new StringBuilder() : null;
@@ -651,7 +650,7 @@ public final class FusionDictionary implements Iterable<WordProperty> {
public DictionaryIterator(ArrayList<PtNode> ptRoot) {
mCurrentString = new StringBuilder();
- mPositions = new LinkedList<Position>();
+ mPositions = new LinkedList<>();
final Position rootPos = new Position(ptRoot);
mPositions.add(rootPos);
}
diff --git a/tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoder.java b/tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoder.java
index 7091c119e..65b84d5f7 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoder.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoder.java
@@ -20,7 +20,6 @@ import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.BinaryDictionary;
import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding;
import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer;
-import com.android.inputmethod.latin.utils.CollectionUtils;
import java.io.File;
import java.io.FileNotFoundException;
@@ -34,8 +33,6 @@ import java.util.Arrays;
// TODO: Separate logics that are used only for testing.
@UsedForTesting
public class Ver2DictDecoder extends AbstractDictDecoder {
- private static final String TAG = Ver2DictDecoder.class.getSimpleName();
-
/**
* A utility class for reading a PtNode.
*/
@@ -233,7 +230,7 @@ public class Ver2DictDecoder extends AbstractDictDecoder {
final ArrayList<WeightedString> shortcutTargets;
if (0 != (flags & FormatSpec.FLAG_HAS_SHORTCUT_TARGETS)) {
// readShortcut will add shortcuts to shortcutTargets.
- shortcutTargets = new ArrayList<WeightedString>();
+ shortcutTargets = new ArrayList<>();
addressPointer += PtNodeReader.readShortcut(mDictBuffer, shortcutTargets);
} else {
shortcutTargets = null;
@@ -241,7 +238,7 @@ public class Ver2DictDecoder extends AbstractDictDecoder {
final ArrayList<PendingAttribute> bigrams;
if (0 != (flags & FormatSpec.FLAG_HAS_BIGRAMS)) {
- bigrams = new ArrayList<PendingAttribute>();
+ bigrams = new ArrayList<>();
addressPointer += PtNodeReader.readBigramAddresses(mDictBuffer, bigrams,
addressPointer);
if (bigrams.size() >= FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) {
@@ -267,7 +264,7 @@ public class Ver2DictDecoder extends AbstractDictDecoder {
final FusionDictionary fusionDict =
new FusionDictionary(new FusionDictionary.PtNodeArray(), header.mDictionaryOptions);
int token = 0;
- final ArrayList<WordProperty> wordProperties = CollectionUtils.newArrayList();
+ final ArrayList<WordProperty> wordProperties = new ArrayList<>();
do {
final BinaryDictionary.GetNextWordPropertyResult result =
binaryDictionary.getNextWordProperty(token);
diff --git a/tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoderTests.java b/tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoderTests.java
index 9dc2b1058..3882c2c55 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoderTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/Ver2DictDecoderTests.java
@@ -58,7 +58,6 @@ public class Ver2DictDecoderTests extends AndroidTestCase {
}
}
- @SuppressWarnings("null")
public void runTestOpenBuffer(final String testName, final DictionaryBufferFactory factory) {
File testFile = null;
try {
@@ -102,7 +101,6 @@ public class Ver2DictDecoderTests extends AndroidTestCase {
new DictionaryBufferFromWritableByteBufferFactory());
}
- @SuppressWarnings("null")
public void runTestGetBuffer(final String testName, final DictionaryBufferFactory factory) {
File testFile = null;
try {
diff --git a/tests/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java b/tests/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java
index f3fad7e99..5e8417ed6 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java
@@ -18,7 +18,6 @@ package com.android.inputmethod.latin.makedict;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.BinaryDictionary;
-import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.FileUtils;
import java.io.File;
@@ -31,8 +30,6 @@ import java.util.ArrayList;
*/
@UsedForTesting
public class Ver4DictDecoder extends AbstractDictDecoder {
- private static final String TAG = Ver4DictDecoder.class.getSimpleName();
-
final File mDictDirectory;
@UsedForTesting
@@ -73,7 +70,7 @@ public class Ver4DictDecoder extends AbstractDictDecoder {
final FusionDictionary fusionDict =
new FusionDictionary(new FusionDictionary.PtNodeArray(), header.mDictionaryOptions);
int token = 0;
- final ArrayList<WordProperty> wordProperties = CollectionUtils.newArrayList();
+ final ArrayList<WordProperty> wordProperties = new ArrayList<>();
do {
final BinaryDictionary.GetNextWordPropertyResult result =
binaryDictionary.getNextWordProperty(token);
diff --git a/tests/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java b/tests/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java
index dab9a4315..8f32e5336 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java
@@ -19,6 +19,7 @@ package com.android.inputmethod.latin.makedict;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.BinaryDictionary;
import com.android.inputmethod.latin.Dictionary;
+import com.android.inputmethod.latin.PrevWordsInfo;
import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions;
import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode;
import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
@@ -74,33 +75,54 @@ public class Ver4DictEncoder implements DictEncoder {
for (final WordProperty wordProperty : dict) {
// TODO: switch to addMultipleDictionaryEntries when they support shortcuts
if (null == wordProperty.mShortcutTargets || wordProperty.mShortcutTargets.isEmpty()) {
- binaryDict.addUnigramWord(wordProperty.mWord, wordProperty.getProbability(),
+ if (!binaryDict.addUnigramEntry(wordProperty.mWord, wordProperty.getProbability(),
null /* shortcutTarget */, 0 /* shortcutProbability */,
- wordProperty.mIsNotAWord, wordProperty.mIsBlacklistEntry,
- 0 /* timestamp */);
+ wordProperty.mIsBeginningOfSentence, wordProperty.mIsNotAWord,
+ wordProperty.mIsBlacklistEntry, 0 /* timestamp */)) {
+ MakedictLog.e("Cannot add unigram entry for " + wordProperty.mWord);
+ }
} else {
for (final WeightedString shortcutTarget : wordProperty.mShortcutTargets) {
- binaryDict.addUnigramWord(wordProperty.mWord, wordProperty.getProbability(),
+ if (!binaryDict.addUnigramEntry(wordProperty.mWord,
+ wordProperty.getProbability(),
shortcutTarget.mWord, shortcutTarget.getProbability(),
- wordProperty.mIsNotAWord, wordProperty.mIsBlacklistEntry,
- 0 /* timestamp */);
+ wordProperty.mIsBeginningOfSentence, wordProperty.mIsNotAWord,
+ wordProperty.mIsBlacklistEntry, 0 /* timestamp */)) {
+ MakedictLog.e("Cannot add unigram entry for " + wordProperty.mWord
+ + ", shortcutTarget: " + shortcutTarget.mWord);
+ return;
+ }
}
}
if (binaryDict.needsToRunGC(true /* mindsBlockByGC */)) {
- binaryDict.flushWithGC();
+ if (!binaryDict.flushWithGC()) {
+ MakedictLog.e("Cannot flush dict with GC.");
+ return;
+ }
}
}
for (final WordProperty word0Property : dict) {
if (null == word0Property.mBigrams) continue;
for (final WeightedString word1 : word0Property.mBigrams) {
- binaryDict.addBigramWords(word0Property.mWord, word1.mWord, word1.getProbability(),
- 0 /* timestamp */);
+ final PrevWordsInfo prevWordsInfo = new PrevWordsInfo(word0Property.mWord);
+ if (!binaryDict.addNgramEntry(prevWordsInfo, word1.mWord,
+ word1.getProbability(), 0 /* timestamp */)) {
+ MakedictLog.e("Cannot add n-gram entry for "
+ + prevWordsInfo + " -> " + word1.mWord);
+ return;
+ }
if (binaryDict.needsToRunGC(true /* mindsBlockByGC */)) {
- binaryDict.flushWithGC();
+ if (!binaryDict.flushWithGC()) {
+ MakedictLog.e("Cannot flush dict with GC.");
+ return;
+ }
}
}
}
- binaryDict.flushWithGC();
+ if (!binaryDict.flushWithGC()) {
+ MakedictLog.e("Cannot flush dict with GC.");
+ return;
+ }
binaryDict.close();
}
diff --git a/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java
new file mode 100644
index 000000000..0f2f9814b
--- /dev/null
+++ b/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java
@@ -0,0 +1,117 @@
+/*
+ * 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.personalization;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import com.android.inputmethod.latin.BinaryDictionary;
+import com.android.inputmethod.latin.Dictionary;
+import com.android.inputmethod.latin.DictionaryFacilitator;
+import com.android.inputmethod.latin.ExpandableBinaryDictionary;
+import com.android.inputmethod.latin.ExpandableBinaryDictionary.AddMultipleDictionaryEntriesCallback;
+import com.android.inputmethod.latin.makedict.CodePointUtils;
+import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.LargeTest;
+import android.util.Log;
+
+/**
+ * Unit tests for personalization dictionary
+ */
+@LargeTest
+public class PersonalizationDictionaryTests extends AndroidTestCase {
+ private static final String TAG = PersonalizationDictionaryTests.class.getSimpleName();
+
+ private static final Locale LOCALE_EN_US = new Locale("en", "US");
+ private static final String DUMMY_PACKAGE_NAME = "test.package.name";
+ private static final long TIMEOUT_TO_WAIT_DICTIONARY_OPERATIONS_IN_SECONDS = 120;
+
+ private DictionaryFacilitator getDictionaryFacilitator() {
+ final ArrayList<String> dictTypes = new ArrayList<>();
+ dictTypes.add(Dictionary.TYPE_MAIN);
+ dictTypes.add(Dictionary.TYPE_PERSONALIZATION);
+ final DictionaryFacilitator dictionaryFacilitator = new DictionaryFacilitator();
+ dictionaryFacilitator.resetDictionariesForTesting(getContext(), LOCALE_EN_US, dictTypes,
+ new HashMap<String, File>(), new HashMap<String, Map<String, String>>());
+ return dictionaryFacilitator;
+ }
+
+ public void testAddManyTokens() {
+ final DictionaryFacilitator dictionaryFacilitator = getDictionaryFacilitator();
+ dictionaryFacilitator.clearPersonalizationDictionary();
+ final int dataChunkCount = 20;
+ final int wordCountInOneChunk = 2000;
+ final Random random = new Random(System.currentTimeMillis());
+ final int[] codePointSet = CodePointUtils.LATIN_ALPHABETS_LOWER;
+
+ final SpacingAndPunctuations spacingAndPunctuations =
+ new SpacingAndPunctuations(getContext().getResources());
+
+ final int timeStampInSeconds = (int)TimeUnit.MILLISECONDS.toSeconds(
+ System.currentTimeMillis());
+
+ for (int i = 0; i < dataChunkCount; i++) {
+ final ArrayList<String> tokens = new ArrayList<>();
+ for (int j = 0; j < wordCountInOneChunk; j++) {
+ tokens.add(CodePointUtils.generateWord(random, codePointSet));
+ }
+ final PersonalizationDataChunk personalizationDataChunk = new PersonalizationDataChunk(
+ true /* inputByUser */, tokens, timeStampInSeconds, DUMMY_PACKAGE_NAME);
+ final CountDownLatch countDownLatch = new CountDownLatch(1);
+ final AddMultipleDictionaryEntriesCallback callback =
+ new AddMultipleDictionaryEntriesCallback() {
+ @Override
+ public void onFinished() {
+ countDownLatch.countDown();
+ }
+ };
+ dictionaryFacilitator.addEntriesToPersonalizationDictionary(personalizationDataChunk,
+ spacingAndPunctuations, callback);
+ try {
+ countDownLatch.await(TIMEOUT_TO_WAIT_DICTIONARY_OPERATIONS_IN_SECONDS,
+ TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Interrupted while waiting for finishing dictionary operations.", e);
+ }
+ }
+ dictionaryFacilitator.flushPersonalizationDictionary();
+ try {
+ dictionaryFacilitator.waitForLoadingDictionariesForTesting(
+ TIMEOUT_TO_WAIT_DICTIONARY_OPERATIONS_IN_SECONDS, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Interrupted while waiting for finishing dictionary operations.", e);
+ }
+ final String dictName = ExpandableBinaryDictionary.getDictName(
+ PersonalizationDictionary.NAME, LOCALE_EN_US, null /* dictFile */);
+ final File dictFile = ExpandableBinaryDictionary.getDictFile(
+ getContext(), dictName, null /* dictFile */);
+
+ final BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
+ 0 /* offset */, 0 /* size */,
+ true /* useFullEditDistance */, LOCALE_EN_US, Dictionary.TYPE_PERSONALIZATION,
+ true /* isUpdatable */);
+ assertTrue(binaryDictionary.isValidDictionary());
+ }
+}
diff --git a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
index f2d7b76b2..48d3a1cad 100644
--- a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
@@ -21,16 +21,17 @@ import android.test.suitebuilder.annotation.LargeTest;
import android.util.Log;
import com.android.inputmethod.latin.ExpandableBinaryDictionary;
+import com.android.inputmethod.latin.PrevWordsInfo;
import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
-import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.DistracterFilter;
import com.android.inputmethod.latin.utils.FileUtils;
import java.io.File;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Random;
-import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
@@ -101,19 +102,20 @@ public class UserHistoryDictionaryTests extends AndroidTestCase {
}
private static List<String> generateWords(final int number, final Random random) {
- final Set<String> wordSet = CollectionUtils.newHashSet();
+ final HashSet<String> wordSet = new HashSet<>();
while (wordSet.size() < number) {
wordSet.add(generateWord(random.nextInt()));
}
- return new ArrayList<String>(wordSet);
+ return new ArrayList<>(wordSet);
}
private static void addToDict(final UserHistoryDictionary dict, final List<String> words) {
- String prevWord = null;
+ PrevWordsInfo prevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO;
for (String word : words) {
- UserHistoryDictionary.addToDictionary(dict, prevWord, word, true,
- (int)TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
- prevWord = word;
+ UserHistoryDictionary.addToDictionary(dict, prevWordsInfo, word, true,
+ (int)TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()),
+ DistracterFilter.EMPTY_DISTRACTER_FILTER);
+ prevWordsInfo = new PrevWordsInfo(word);
}
}
@@ -132,7 +134,7 @@ public class UserHistoryDictionaryTests extends AndroidTestCase {
dict.waitAllTasksForTests();
for (int i = 0; i < numberOfWords; ++i) {
final String word = words.get(i);
- assertTrue(dict.isInUnderlyingBinaryDictionaryForTests(word));
+ assertTrue(dict.isInDictionary(word));
}
}
// write to file.
@@ -260,24 +262,25 @@ public class UserHistoryDictionaryTests extends AndroidTestCase {
final UserHistoryDictionary dict =
PersonalizationHelper.getUserHistoryDictionary(getContext(), dummyLocale);
dict.waitAllTasksForTests();
- String prevWord = null;
+ PrevWordsInfo prevWordsInfo = new PrevWordsInfo(null);
for (final String word : words) {
- UserHistoryDictionary.addToDictionary(dict, prevWord, word, true, mCurrentTime);
- prevWord = word;
+ UserHistoryDictionary.addToDictionary(dict, prevWordsInfo, word, true, mCurrentTime,
+ DistracterFilter.EMPTY_DISTRACTER_FILTER);
+ prevWordsInfo = new PrevWordsInfo(word);
dict.waitAllTasksForTests();
- assertTrue(dict.isInUnderlyingBinaryDictionaryForTests(word));
+ assertTrue(dict.isInDictionary(word));
}
forcePassingShortTime();
dict.runGCIfRequired();
dict.waitAllTasksForTests();
for (final String word : words) {
- assertTrue(dict.isInUnderlyingBinaryDictionaryForTests(word));
+ assertTrue(dict.isInDictionary(word));
}
forcePassingLongTime();
dict.runGCIfRequired();
dict.waitAllTasksForTests();
for (final String word : words) {
- assertFalse(dict.isInUnderlyingBinaryDictionaryForTests(word));
+ assertFalse(dict.isInDictionary(word));
}
}
}
diff --git a/tests/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerServiceTest.java b/tests/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerServiceTest.java
index 995d7f07b..2272d6ba0 100644
--- a/tests/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerServiceTest.java
+++ b/tests/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerServiceTest.java
@@ -39,7 +39,7 @@ public class AndroidSpellCheckerServiceTest extends InputTestsBase {
// it yields 5).
assertTrue(suggestions.length >= 2);
// We also assume the top suggestion should be "this".
- assertEquals("", "this", suggestions[0]);
+ assertEquals("Test basic spell checking", "this", suggestions[0]);
}
public void testRussianSpellchecker() {
@@ -62,4 +62,21 @@ public class AndroidSpellCheckerServiceTest extends InputTestsBase {
// Russian dictionary.
assertEquals("", "года", suggestions[0]);
}
+
+ public void testSpellcheckWithPeriods() {
+ changeLanguage("en_US");
+ mEditText.setText("I'm.sure ");
+ mEditText.setSelection(mEditText.getText().length());
+ mEditText.onAttachedToWindow();
+ sleep(1000);
+ runMessages();
+ sleep(1000);
+
+ final SpanGetter span = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
+ // If no span, the following will crash
+ final String[] suggestions = span.getSuggestions();
+ // The first suggestion should be "I'm sure".
+ assertEquals("Test spell checking of mistyped period for space", "I'm sure",
+ suggestions[0]);
+ }
}
diff --git a/tests/src/com/android/inputmethod/latin/utils/AsyncResultHolderTests.java b/tests/src/com/android/inputmethod/latin/utils/AsyncResultHolderTests.java
index 7fd167977..1501e942a 100644
--- a/tests/src/com/android/inputmethod/latin/utils/AsyncResultHolderTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/AsyncResultHolderTests.java
@@ -45,27 +45,27 @@ public class AsyncResultHolderTests extends AndroidTestCase {
}
public void testGetWithoutSet() {
- final AsyncResultHolder<Integer> holder = new AsyncResultHolder<Integer>();
+ final AsyncResultHolder<Integer> holder = new AsyncResultHolder<>();
final int resultValue = holder.get(DEFAULT_VALUE, TIMEOUT_IN_MILLISECONDS);
assertEquals(DEFAULT_VALUE, resultValue);
}
public void testGetBeforeSet() {
- final AsyncResultHolder<Integer> holder = new AsyncResultHolder<Integer>();
+ final AsyncResultHolder<Integer> holder = new AsyncResultHolder<>();
setAfterGivenTime(holder, SET_VALUE, TIMEOUT_IN_MILLISECONDS + MARGIN_IN_MILLISECONDS);
final int resultValue = holder.get(DEFAULT_VALUE, TIMEOUT_IN_MILLISECONDS);
assertEquals(DEFAULT_VALUE, resultValue);
}
public void testGetAfterSet() {
- final AsyncResultHolder<Integer> holder = new AsyncResultHolder<Integer>();
+ final AsyncResultHolder<Integer> holder = new AsyncResultHolder<>();
holder.set(SET_VALUE);
final int resultValue = holder.get(DEFAULT_VALUE, TIMEOUT_IN_MILLISECONDS);
assertEquals(SET_VALUE, resultValue);
}
public void testGetBeforeTimeout() {
- final AsyncResultHolder<Integer> holder = new AsyncResultHolder<Integer>();
+ final AsyncResultHolder<Integer> holder = new AsyncResultHolder<>();
setAfterGivenTime(holder, SET_VALUE, TIMEOUT_IN_MILLISECONDS - MARGIN_IN_MILLISECONDS);
final int resultValue = holder.get(DEFAULT_VALUE, TIMEOUT_IN_MILLISECONDS);
assertEquals(SET_VALUE, resultValue);
diff --git a/tests/src/com/android/inputmethod/latin/utils/BinaryDictionaryUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/BinaryDictionaryUtilsTests.java
index d86639101..a333ee9bc 100644
--- a/tests/src/com/android/inputmethod/latin/utils/BinaryDictionaryUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/BinaryDictionaryUtilsTests.java
@@ -48,7 +48,7 @@ public class BinaryDictionaryUtilsTests extends AndroidTestCase {
private File createEmptyVer4DictionaryAndGetFile(final String dictId) throws IOException {
final File file = getDictFile(dictId);
FileUtils.deleteRecursively(file);
- Map<String, String> attributeMap = new HashMap<String, String>();
+ Map<String, String> attributeMap = new HashMap<>();
attributeMap.put(DictionaryHeader.DICTIONARY_ID_KEY, dictId);
attributeMap.put(DictionaryHeader.DICTIONARY_VERSION_KEY,
String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())));
diff --git a/tests/src/com/android/inputmethod/latin/utils/ExecutorUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/ExecutorUtilsTests.java
new file mode 100644
index 000000000..ae2623d12
--- /dev/null
+++ b/tests/src/com/android/inputmethod/latin/utils/ExecutorUtilsTests.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2013 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.utils;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.util.Log;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Unit tests for ExecutorUtils.
+ */
+@MediumTest
+public class ExecutorUtilsTests extends AndroidTestCase {
+ private static final String TAG = ExecutorUtilsTests.class.getSimpleName();
+
+ private static final String TEST_EXECUTOR_ID = "test";
+ private static final int NUM_OF_TASKS = 10;
+ private static final int DELAY_FOR_WAITING_TASKS_MILLISECONDS = 500;
+
+ public void testExecute() {
+ final ExecutorService executor = ExecutorUtils.getExecutor(TEST_EXECUTOR_ID);
+ final AtomicInteger v = new AtomicInteger(0);
+ for (int i = 0; i < NUM_OF_TASKS; ++i) {
+ executor.execute(new Runnable() {
+ @Override
+ public void run() {
+ v.incrementAndGet();
+ }
+ });
+ }
+ try {
+ executor.awaitTermination(DELAY_FOR_WAITING_TASKS_MILLISECONDS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ Log.d(TAG, "Exception while sleeping.", e);
+ }
+
+ assertEquals(NUM_OF_TASKS, v.get());
+ }
+}
diff --git a/tests/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutorTests.java b/tests/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutorTests.java
deleted file mode 100644
index e0755483c..000000000
--- a/tests/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutorTests.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2013 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.utils;
-
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Unit tests for PrioritizedSerialExecutor.
- * TODO: Add more detailed tests to make use of priorities, etc.
- */
-@MediumTest
-public class PrioritizedSerialExecutorTests extends AndroidTestCase {
- private static final String TAG = PrioritizedSerialExecutorTests.class.getSimpleName();
-
- private static final int NUM_OF_TASKS = 10;
- private static final int DELAY_FOR_WAITING_TASKS_MILLISECONDS = 500;
-
- public void testExecute() {
- final PrioritizedSerialExecutor executor = new PrioritizedSerialExecutor();
- final AtomicInteger v = new AtomicInteger(0);
- for (int i = 0; i < NUM_OF_TASKS; ++i) {
- executor.execute(new Runnable() {
- @Override
- public void run() {
- v.incrementAndGet();
- }
- });
- }
- try {
- Thread.sleep(DELAY_FOR_WAITING_TASKS_MILLISECONDS);
- } catch (InterruptedException e) {
- Log.d(TAG, "Exception while sleeping.", e);
- }
-
- assertEquals(NUM_OF_TASKS, v.get());
- }
-
- public void testExecutePrioritized() {
- final PrioritizedSerialExecutor executor = new PrioritizedSerialExecutor();
- final AtomicInteger v = new AtomicInteger(0);
- for (int i = 0; i < NUM_OF_TASKS; ++i) {
- executor.executePrioritized(new Runnable() {
- @Override
- public void run() {
- v.incrementAndGet();
- }
- });
- }
- try {
- Thread.sleep(DELAY_FOR_WAITING_TASKS_MILLISECONDS);
- } catch (InterruptedException e) {
- Log.d(TAG, "Exception while sleeping.", e);
- }
-
- assertEquals(NUM_OF_TASKS, v.get());
- }
-
- public void testExecuteCombined() {
- final PrioritizedSerialExecutor executor = new PrioritizedSerialExecutor();
- final AtomicInteger v = new AtomicInteger(0);
- for (int i = 0; i < NUM_OF_TASKS; ++i) {
- executor.execute(new Runnable() {
- @Override
- public void run() {
- v.incrementAndGet();
- }
- });
- }
-
- for (int i = 0; i < NUM_OF_TASKS; ++i) {
- executor.executePrioritized(new Runnable() {
- @Override
- public void run() {
- v.incrementAndGet();
- }
- });
- }
-
- try {
- Thread.sleep(DELAY_FOR_WAITING_TASKS_MILLISECONDS);
- } catch (InterruptedException e) {
- Log.d(TAG, "Exception while sleeping.", e);
- }
-
- assertEquals(2 * NUM_OF_TASKS, v.get());
- }
-}
diff --git a/tests/src/com/android/inputmethod/latin/utils/RecapitalizeStatusTests.java b/tests/src/com/android/inputmethod/latin/utils/RecapitalizeStatusTests.java
index ada80c3fa..a3f2ce586 100644
--- a/tests/src/com/android/inputmethod/latin/utils/RecapitalizeStatusTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/RecapitalizeStatusTests.java
@@ -29,25 +29,25 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
public void testTrim() {
final RecapitalizeStatus status = new RecapitalizeStatus();
- status.initialize(30, 40, "abcdefghij", Locale.ENGLISH, SPACE);
+ status.start(30, 40, "abcdefghij", Locale.ENGLISH, SPACE);
status.trim();
assertEquals("abcdefghij", status.getRecapitalizedString());
assertEquals(30, status.getNewCursorStart());
assertEquals(40, status.getNewCursorEnd());
- status.initialize(30, 44, " abcdefghij", Locale.ENGLISH, SPACE);
+ status.start(30, 44, " abcdefghij", Locale.ENGLISH, SPACE);
status.trim();
assertEquals("abcdefghij", status.getRecapitalizedString());
assertEquals(34, status.getNewCursorStart());
assertEquals(44, status.getNewCursorEnd());
- status.initialize(30, 40, "abcdefgh ", Locale.ENGLISH, SPACE);
+ status.start(30, 40, "abcdefgh ", Locale.ENGLISH, SPACE);
status.trim();
assertEquals("abcdefgh", status.getRecapitalizedString());
assertEquals(30, status.getNewCursorStart());
assertEquals(38, status.getNewCursorEnd());
- status.initialize(30, 45, " abcdefghij ", Locale.ENGLISH, SPACE);
+ status.start(30, 45, " abcdefghij ", Locale.ENGLISH, SPACE);
status.trim();
assertEquals("abcdefghij", status.getRecapitalizedString());
assertEquals(33, status.getNewCursorStart());
@@ -56,7 +56,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
public void testRotate() {
final RecapitalizeStatus status = new RecapitalizeStatus();
- status.initialize(29, 40, "abcd efghij", Locale.ENGLISH, SPACE);
+ status.start(29, 40, "abcd efghij", Locale.ENGLISH, SPACE);
status.rotate();
assertEquals("Abcd Efghij", status.getRecapitalizedString());
assertEquals(29, status.getNewCursorStart());
@@ -68,7 +68,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
status.rotate();
assertEquals("Abcd Efghij", status.getRecapitalizedString());
- status.initialize(29, 40, "Abcd Efghij", Locale.ENGLISH, SPACE);
+ status.start(29, 40, "Abcd Efghij", Locale.ENGLISH, SPACE);
status.rotate();
assertEquals("ABCD EFGHIJ", status.getRecapitalizedString());
assertEquals(29, status.getNewCursorStart());
@@ -80,7 +80,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
status.rotate();
assertEquals("ABCD EFGHIJ", status.getRecapitalizedString());
- status.initialize(29, 40, "ABCD EFGHIJ", Locale.ENGLISH, SPACE);
+ status.start(29, 40, "ABCD EFGHIJ", Locale.ENGLISH, SPACE);
status.rotate();
assertEquals("abcd efghij", status.getRecapitalizedString());
assertEquals(29, status.getNewCursorStart());
@@ -92,7 +92,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
status.rotate();
assertEquals("abcd efghij", status.getRecapitalizedString());
- status.initialize(29, 39, "AbCDefghij", Locale.ENGLISH, SPACE);
+ status.start(29, 39, "AbCDefghij", Locale.ENGLISH, SPACE);
status.rotate();
assertEquals("abcdefghij", status.getRecapitalizedString());
assertEquals(29, status.getNewCursorStart());
@@ -106,7 +106,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
status.rotate();
assertEquals("abcdefghij", status.getRecapitalizedString());
- status.initialize(29, 40, "Abcd efghij", Locale.ENGLISH, SPACE);
+ status.start(29, 40, "Abcd efghij", Locale.ENGLISH, SPACE);
status.rotate();
assertEquals("abcd efghij", status.getRecapitalizedString());
assertEquals(29, status.getNewCursorStart());
@@ -120,7 +120,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
status.rotate();
assertEquals("abcd efghij", status.getRecapitalizedString());
- status.initialize(30, 34, "grüß", Locale.GERMAN, SPACE);
+ status.start(30, 34, "grüß", Locale.GERMAN, SPACE);
status.rotate();
assertEquals("Grüß", status.getRecapitalizedString());
assertEquals(30, status.getNewCursorStart());
@@ -138,7 +138,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
assertEquals(30, status.getNewCursorStart());
assertEquals(34, status.getNewCursorEnd());
- status.initialize(30, 33, "œuf", Locale.FRENCH, SPACE);
+ status.start(30, 33, "œuf", Locale.FRENCH, SPACE);
status.rotate();
assertEquals("Œuf", status.getRecapitalizedString());
assertEquals(30, status.getNewCursorStart());
@@ -156,7 +156,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
assertEquals(30, status.getNewCursorStart());
assertEquals(33, status.getNewCursorEnd());
- status.initialize(30, 33, "œUf", Locale.FRENCH, SPACE);
+ status.start(30, 33, "œUf", Locale.FRENCH, SPACE);
status.rotate();
assertEquals("œuf", status.getRecapitalizedString());
assertEquals(30, status.getNewCursorStart());
@@ -178,7 +178,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase {
assertEquals(30, status.getNewCursorStart());
assertEquals(33, status.getNewCursorEnd());
- status.initialize(30, 35, "école", Locale.FRENCH, SPACE);
+ status.start(30, 35, "école", Locale.FRENCH, SPACE);
status.rotate();
assertEquals("École", status.getRecapitalizedString());
assertEquals(30, status.getNewCursorStart());
diff --git a/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
index 3eb704093..8e764e40f 100644
--- a/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
@@ -24,10 +24,10 @@ import java.util.HashMap;
@SmallTest
public class ResourceUtilsTests extends AndroidTestCase {
public void testFindConstantForKeyValuePairsSimple() {
- final HashMap<String,String> anyKeyValue = CollectionUtils.newHashMap();
+ final HashMap<String,String> anyKeyValue = new HashMap<>();
anyKeyValue.put("anyKey", "anyValue");
final HashMap<String,String> nullKeyValue = null;
- final HashMap<String,String> emptyKeyValue = CollectionUtils.newHashMap();
+ final HashMap<String,String> emptyKeyValue = new HashMap<>();
final String[] nullArray = null;
assertNull(ResourceUtils.findConstantForKeyValuePairs(anyKeyValue, nullArray));
@@ -48,7 +48,7 @@ public class ResourceUtilsTests extends AndroidTestCase {
"HARDWARE=mako,0.5",
};
- final HashMap<String,String> keyValues = CollectionUtils.newHashMap();
+ final HashMap<String,String> keyValues = new HashMap<>();
keyValues.put(HARDWARE_KEY, "grouper");
assertEquals("0.3", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
keyValues.put(HARDWARE_KEY, "mako");
@@ -88,7 +88,7 @@ public class ResourceUtilsTests extends AndroidTestCase {
"HARDWARE=mantaray:MODEL=Nexus 10:MANUFACTURER=samsung,0.2"
};
- final HashMap<String,String> keyValues = CollectionUtils.newHashMap();
+ final HashMap<String,String> keyValues = new HashMap<>();
keyValues.put(HARDWARE_KEY, "grouper");
keyValues.put(MODEL_KEY, "Nexus 7");
keyValues.put(MANUFACTURER_KEY, "asus");
@@ -126,7 +126,7 @@ public class ResourceUtilsTests extends AndroidTestCase {
"HARDWARE=manta.*:MODEL=Nexus 10:MANUFACTURER=samsung,0.2"
};
- final HashMap<String,String> keyValues = CollectionUtils.newHashMap();
+ final HashMap<String,String> keyValues = new HashMap<>();
keyValues.put(HARDWARE_KEY, "grouper");
keyValues.put(MODEL_KEY, "Nexus 7");
keyValues.put(MANUFACTURER_KEY, "asus");
diff --git a/tests/src/com/android/inputmethod/latin/utils/SpacebarLanguagetUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/SpacebarLanguagetUtilsTests.java
index ff1103e4f..4156de78b 100644
--- a/tests/src/com/android/inputmethod/latin/utils/SpacebarLanguagetUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/SpacebarLanguagetUtilsTests.java
@@ -31,7 +31,7 @@ import java.util.Locale;
@SmallTest
public class SpacebarLanguagetUtilsTests extends AndroidTestCase {
// All input method subtypes of LatinIME.
- private final ArrayList<InputMethodSubtype> mSubtypesList = CollectionUtils.newArrayList();
+ private final ArrayList<InputMethodSubtype> mSubtypesList = new ArrayList<>();
private RichInputMethodManager mRichImm;
private Resources mRes;
diff --git a/tests/src/com/android/inputmethod/latin/utils/StringAndJsonUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/StringAndJsonUtilsTests.java
index 2a4ead383..cd9a98356 100644
--- a/tests/src/com/android/inputmethod/latin/utils/StringAndJsonUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/StringAndJsonUtilsTests.java
@@ -285,20 +285,6 @@ public class StringAndJsonUtilsTests extends AndroidTestCase {
assertTrue(bytesStr.equals(bytesStr2));
}
- public void testContainsOnlyWhitespace() {
- assertTrue(StringUtils.containsOnlyWhitespace(" "));
- assertTrue(StringUtils.containsOnlyWhitespace(""));
- assertTrue(StringUtils.containsOnlyWhitespace(" \n\t\t"));
- // U+2002 : EN SPACE
- // U+2003 : EM SPACE
- // U+3000 : IDEOGRAPHIC SPACE (commonly "double-width space")
- assertTrue(StringUtils.containsOnlyWhitespace("\u2002\u2003\u3000"));
- assertFalse(StringUtils.containsOnlyWhitespace(" a "));
- assertFalse(StringUtils.containsOnlyWhitespace(". "));
- assertFalse(StringUtils.containsOnlyWhitespace("."));
- assertTrue(StringUtils.containsOnlyWhitespace(""));
- }
-
public void testJsonUtils() {
final Object[] objs = new Object[] { 1, "aaa", "bbb", 3 };
final List<Object> objArray = Arrays.asList(objs);
@@ -372,4 +358,14 @@ public class StringAndJsonUtilsTests extends AndroidTestCase {
assertTrue("copyCodePointsAndReturnCodePointCount throws when array is too small",
exceptionHappened);
}
+
+ public void testGetTrailingSingleQuotesCount() {
+ assertEquals(0, StringUtils.getTrailingSingleQuotesCount(""));
+ assertEquals(1, StringUtils.getTrailingSingleQuotesCount("'"));
+ assertEquals(5, StringUtils.getTrailingSingleQuotesCount("'''''"));
+ assertEquals(0, StringUtils.getTrailingSingleQuotesCount("a"));
+ assertEquals(0, StringUtils.getTrailingSingleQuotesCount("'this"));
+ assertEquals(1, StringUtils.getTrailingSingleQuotesCount("'word'"));
+ assertEquals(0, StringUtils.getTrailingSingleQuotesCount("I'm"));
+ }
}
diff --git a/tests/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtilsTests.java
index ee345905c..8e409ab99 100644
--- a/tests/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtilsTests.java
@@ -31,7 +31,7 @@ import java.util.Locale;
@SmallTest
public class SubtypeLocaleUtilsTests extends AndroidTestCase {
// All input method subtypes of LatinIME.
- private final ArrayList<InputMethodSubtype> mSubtypesList = CollectionUtils.newArrayList();
+ private final ArrayList<InputMethodSubtype> mSubtypesList = new ArrayList<>();
private RichInputMethodManager mRichImm;
private Resources mRes;
diff --git a/tests/src/com/android/inputmethod/research/MotionEventReaderTests.java b/tests/src/com/android/inputmethod/research/MotionEventReaderTests.java
deleted file mode 100644
index 28a9f3d5c..000000000
--- a/tests/src/com/android/inputmethod/research/MotionEventReaderTests.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2013 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.research;
-
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.JsonReader;
-
-import com.android.inputmethod.research.MotionEventReader.ReplayData;
-
-import java.io.IOException;
-import java.io.StringReader;
-
-@SmallTest
-public class MotionEventReaderTests extends AndroidTestCase {
- private MotionEventReader mMotionEventReader = new MotionEventReader();
- private ReplayData mReplayData;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mReplayData = new ReplayData();
- }
-
- private JsonReader jsonReaderForString(final String s) {
- return new JsonReader(new StringReader(s));
- }
-
- public void testTopLevelDataVariant() {
- final JsonReader jsonReader = jsonReaderForString(
- "{"
- + "\"_ct\": 1359590400000,"
- + "\"_ut\": 4381933,"
- + "\"_ty\": \"MotionEvent\","
- + "\"action\": \"UP\","
- + "\"isLoggingRelated\": false,"
- + "\"x\": 100.0,"
- + "\"y\": 200.0"
- + "}"
- );
- try {
- mMotionEventReader.readLogStatement(jsonReader, mReplayData);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IOException thrown");
- }
- assertEquals("x set correctly", (int) mReplayData.mPointerCoordsArrays.get(0)[0].x, 100);
- assertEquals("y set correctly", (int) mReplayData.mPointerCoordsArrays.get(0)[0].y, 200);
- assertEquals("only one pointer", mReplayData.mPointerCoordsArrays.get(0).length, 1);
- assertEquals("only one MotionEvent", mReplayData.mPointerCoordsArrays.size(), 1);
- }
-
- public void testNestedDataVariant() {
- final JsonReader jsonReader = jsonReaderForString(
- "{"
- + " \"_ct\": 135959040000,"
- + " \"_ut\": 4382702,"
- + " \"_ty\": \"MotionEvent\","
- + " \"action\": \"MOVE\","
- + " \"isLoggingRelated\": false,"
- + " \"motionEvent\": {"
- + " \"pointerIds\": ["
- + " 0"
- + " ],"
- + " \"xyt\": ["
- + " {"
- + " \"t\": 4382551,"
- + " \"d\": ["
- + " {"
- + " \"x\": 100.0,"
- + " \"y\": 200.0,"
- + " \"toma\": 999.0,"
- + " \"tomi\": 999.0,"
- + " \"o\": 0.0"
- + " }"
- + " ]"
- + " },"
- + " {"
- + " \"t\": 4382559,"
- + " \"d\": ["
- + " {"
- + " \"x\": 300.0,"
- + " \"y\": 400.0,"
- + " \"toma\": 999.0,"
- + " \"tomi\": 999.0,"
- + " \"o\": 0.0"
- + " }"
- + " ]"
- + " }"
- + " ]"
- + " }"
- + "}"
- );
- try {
- mMotionEventReader.readLogStatement(jsonReader, mReplayData);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IOException thrown");
- }
- assertEquals("x1 set correctly", (int) mReplayData.mPointerCoordsArrays.get(0)[0].x, 100);
- assertEquals("y1 set correctly", (int) mReplayData.mPointerCoordsArrays.get(0)[0].y, 200);
- assertEquals("x2 set correctly", (int) mReplayData.mPointerCoordsArrays.get(1)[0].x, 300);
- assertEquals("y2 set correctly", (int) mReplayData.mPointerCoordsArrays.get(1)[0].y, 400);
- assertEquals("only one pointer", mReplayData.mPointerCoordsArrays.get(0).length, 1);
- assertEquals("two MotionEvents", mReplayData.mPointerCoordsArrays.size(), 2);
- }
-
- public void testNestedDataVariantMultiPointer() {
- final JsonReader jsonReader = jsonReaderForString(
- "{"
- + " \"_ct\": 135959040000,"
- + " \"_ut\": 4382702,"
- + " \"_ty\": \"MotionEvent\","
- + " \"action\": \"MOVE\","
- + " \"isLoggingRelated\": false,"
- + " \"motionEvent\": {"
- + " \"pointerIds\": ["
- + " 1"
- + " ],"
- + " \"xyt\": ["
- + " {"
- + " \"t\": 4382551,"
- + " \"d\": ["
- + " {"
- + " \"x\": 100.0,"
- + " \"y\": 200.0,"
- + " \"toma\": 999.0,"
- + " \"tomi\": 999.0,"
- + " \"o\": 0.0"
- + " },"
- + " {"
- + " \"x\": 300.0,"
- + " \"y\": 400.0,"
- + " \"toma\": 999.0,"
- + " \"tomi\": 999.0,"
- + " \"o\": 0.0"
- + " }"
- + " ]"
- + " }"
- + " ]"
- + " }"
- + "}"
- );
- try {
- mMotionEventReader.readLogStatement(jsonReader, mReplayData);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IOException thrown");
- }
- assertEquals("x1 set correctly", (int) mReplayData.mPointerCoordsArrays.get(0)[0].x, 100);
- assertEquals("y1 set correctly", (int) mReplayData.mPointerCoordsArrays.get(0)[0].y, 200);
- assertEquals("x2 set correctly", (int) mReplayData.mPointerCoordsArrays.get(0)[1].x, 300);
- assertEquals("y2 set correctly", (int) mReplayData.mPointerCoordsArrays.get(0)[1].y, 400);
- assertEquals("two pointers", mReplayData.mPointerCoordsArrays.get(0).length, 2);
- assertEquals("one MotionEvent", mReplayData.mPointerCoordsArrays.size(), 1);
- }
-}