aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorTadashi G. Takaoka <takaoka@google.com>2014-08-28 15:14:36 +0900
committerTadashi G. Takaoka <takaoka@google.com>2014-09-25 18:27:23 +0900
commitaaefd5666112c4a6fff58783c25cf9a75b468edd (patch)
tree69f8d60a187dac846a855aa0b94a67a97c1ce156 /tests
parentdbb2182e3928cb8d204290f83a01718d5ff9b162 (diff)
downloadlatinime-aaefd5666112c4a6fff58783c25cf9a75b468edd.tar.gz
latinime-aaefd5666112c4a6fff58783c25cf9a75b468edd.tar.xz
latinime-aaefd5666112c4a6fff58783c25cf9a75b468edd.zip
Add !string/<resource_name> reference
This CL introduces new text reference notation !string/<resource_name> to refer a string resource on the fly. This notation is mainly used to represent action key labels may refer a string in a system locale in run-time. This notation is needed to implement Hinglish and Serbian-Latin keyboards that need to refer its own action key labels. Bug: 17169632 Bug: 9687668 Change-Id: I042f6bd04714e0e448cd92031730eb9fb422e6d3
Diffstat (limited to 'tests')
-rw-r--r--tests/res/values/donottranslate.xml18
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelBase.java6
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java102
-rw-r--r--tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java200
-rw-r--r--tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecStringReferenceTests.java284
5 files changed, 405 insertions, 205 deletions
diff --git a/tests/res/values/donottranslate.xml b/tests/res/values/donottranslate.xml
index 263d0af24..f26947608 100644
--- a/tests/res/values/donottranslate.xml
+++ b/tests/res/values/donottranslate.xml
@@ -50,13 +50,15 @@
<string name="multiple_labels_with_escape_surrounded_by_spaces">" \\abc , d\\ef , gh\\i "</string>
<string name="multiple_labels_with_comma_and_escape">"ab\\\\,d\\\\\\,,g\\,i"</string>
<string name="multiple_labels_with_comma_and_escape_surrounded_by_spaces">" ab\\\\ , d\\\\\\, , g\\,i "</string>
- <string name="indirect_string">!text/multiple_chars</string>
- <string name="indirect_string_with_literal">x,!text/multiple_chars,y</string>
- <string name="indirect2_string">!text/indirect_string</string>
- <string name="infinite_indirection">infinite,!text/infinite_indirection,loop</string>
- <string name="upper_indirect_string">!TEXT/MULTIPLE_CHARS</string>
- <string name="upper_indirect_string_with_literal">x,!TEXT/MULTIPLE_CHARS,y</string>
- <string name="upper_indirect2_string">!TEXT/UPPER_INDIRECT_STRING</string>
- <string name="upper_infinite_indirection">infinite,!TEXT/INFINITE_INDIRECTION,loop</string>
+ <string name="indirect_string">!string/multiple_chars</string>
+ <string name="indirect_string_with_literal">x,!string/multiple_chars,y</string>
+ <string name="indirect2_string">!string/indirect_string</string>
+ <string name="infinite_indirection">infinite,!string/infinite_indirection,loop</string>
+ <string name="upper_indirect_string">!STRING/MULTIPLE_CHARS</string>
+ <string name="upper_indirect_string_with_literal">x,!STRING/MULTIPLE_CHARS,y</string>
+ <string name="upper_indirect2_string">!STRING/UPPER_INDIRECT_STRING</string>
+ <string name="upper_infinite_indirection">infinite,!STRING/INFINITE_INDIRECTION,loop</string>
<string name="keyspec_indirect_navigate_actions">!fixedColumnOrder!2,!text/keyspec_action_previous,!text/keyspec_action_next</string>
+ <string name="label_next_key">ActionNext</string>
+ <string name="label_previous_key">ActionPrevious</string>
</resources>
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelBase.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelBase.java
index 17cee29b3..22c22a00a 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelBase.java
@@ -25,6 +25,7 @@ import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyVisual;
import com.android.inputmethod.latin.Constants;
+import com.android.inputmethod.latin.utils.LocaleUtils;
import com.android.inputmethod.latin.utils.RunInLocale;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
@@ -64,10 +65,11 @@ abstract class KeyboardLayoutSetActionLabelBase extends KeyboardLayoutSetTestsBa
}
protected static Locale getLabelLocale(final InputMethodSubtype subtype) {
- if (subtype.getLocale().equals(SubtypeLocaleUtils.NO_LANGUAGE)) {
+ final String localeString = subtype.getLocale();
+ if (localeString.equals(SubtypeLocaleUtils.NO_LANGUAGE)) {
return null;
}
- return SubtypeLocaleUtils.getSubtypeLocale(subtype);
+ return LocaleUtils.constructLocaleFromString(localeString);
}
public void testActionUnspecified() {
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java
index 07d47053a..36b9c9cfc 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java
@@ -22,15 +22,40 @@ import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
+import com.android.inputmethod.keyboard.internal.KeyboardTextsSet;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.RichInputMethodManager;
import com.android.inputmethod.latin.utils.RunInLocale;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
+import java.util.ArrayList;
import java.util.Locale;
@MediumTest
public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActionLabelBase {
+ // Filter a subtype whose name should be displayed using {@link Locale#ROOT}, such like
+ // Hinglish (hi_ZZ) and Serbian-Latn (sr_ZZ).
+ static final SubtypeFilter SUBTYPE_FILTER_NAME_IN_BASE_LOCALE = new SubtypeFilter() {
+ @Override
+ public boolean accept(final InputMethodSubtype subtype) {
+ return Locale.ROOT.equals(
+ SubtypeLocaleUtils.getDisplayLocaleOfSubtypeLocale(subtype.getLocale()));
+ }
+ };
+
+ private ArrayList<InputMethodSubtype> mSubtypesWhoseNameIsDisplayedInItsLocale;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mSubtypesWhoseNameIsDisplayedInItsLocale = getSubtypesFilteredBy(new SubtypeFilter() {
+ @Override
+ public boolean accept(final InputMethodSubtype subtype) {
+ return !SUBTYPE_FILTER_NAME_IN_BASE_LOCALE.accept(subtype);
+ }
+ });
+ }
+
@Override
protected int getKeyboardThemeForTests() {
return KeyboardTheme.THEME_ID_KLP;
@@ -38,7 +63,7 @@ public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActio
@Override
public void testActionGo() {
- for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
final String tag = "go " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
final ExpectedActionKey expectedKey = ExpectedActionKey.newLabelKey(
R.string.label_go_key, getLabelLocale(subtype), getContext());
@@ -48,7 +73,7 @@ public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActio
@Override
public void testActionSend() {
- for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
final String tag = "send " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
final ExpectedActionKey expectedKey = ExpectedActionKey.newLabelKey(
R.string.label_send_key, getLabelLocale(subtype), getContext());
@@ -58,7 +83,7 @@ public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActio
@Override
public void testActionNext() {
- for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
final String tag = "next " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
final ExpectedActionKey expectedKey = ExpectedActionKey.newLabelKey(
R.string.label_next_key, getLabelLocale(subtype), getContext());
@@ -68,7 +93,7 @@ public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActio
@Override
public void testActionDone() {
- for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
final String tag = "done " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
final ExpectedActionKey expectedKey = ExpectedActionKey.newLabelKey(
R.string.label_done_key, getLabelLocale(subtype), getContext());
@@ -78,7 +103,7 @@ public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActio
@Override
public void testActionPrevious() {
- for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
final String tag = "previous " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
final ExpectedActionKey expectedKey = ExpectedActionKey.newLabelKey(
R.string.label_previous_key, getLabelLocale(subtype), getContext());
@@ -105,7 +130,7 @@ public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActio
// Working variable to simulate system locale changing.
private Locale mSystemLocale = Locale.getDefault();
- private void doTestActionKeysInLocale(final InputMethodSubtype subtype,
+ private void doTestActionKeysInLocaleWithStringResources(final InputMethodSubtype subtype,
final Locale labelLocale, final Locale systemLocale) {
// Simulate system locale changing, see {@link SystemBroadcastReceiver}.
if (!systemLocale.equals(mSystemLocale)) {
@@ -144,10 +169,10 @@ public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActio
final InputMethodSubtype italian = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
Locale.ITALIAN.toString(), SubtypeLocaleUtils.QWERTY);
// An action label should be displayed in subtype's locale regardless of the system locale.
- doTestActionKeysInLocale(italian, Locale.ITALIAN, Locale.US);
- doTestActionKeysInLocale(italian, Locale.ITALIAN, Locale.FRENCH);
- doTestActionKeysInLocale(italian, Locale.ITALIAN, Locale.ITALIAN);
- doTestActionKeysInLocale(italian, Locale.ITALIAN, Locale.JAPANESE);
+ doTestActionKeysInLocaleWithStringResources(italian, Locale.ITALIAN, Locale.US);
+ doTestActionKeysInLocaleWithStringResources(italian, Locale.ITALIAN, Locale.FRENCH);
+ doTestActionKeysInLocaleWithStringResources(italian, Locale.ITALIAN, Locale.ITALIAN);
+ doTestActionKeysInLocaleWithStringResources(italian, Locale.ITALIAN, Locale.JAPANESE);
}
public void testNoLanguageSubtypeActionLabel() {
@@ -155,9 +180,58 @@ public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActio
final InputMethodSubtype noLanguage = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
SubtypeLocaleUtils.NO_LANGUAGE, SubtypeLocaleUtils.QWERTY);
// An action label of no language keyboard should be displayed in the system locale.
- doTestActionKeysInLocale(noLanguage, Locale.US, Locale.US);
- doTestActionKeysInLocale(noLanguage, Locale.FRENCH, Locale.FRENCH);
- doTestActionKeysInLocale(noLanguage, Locale.ITALIAN, Locale.ITALIAN);
- doTestActionKeysInLocale(noLanguage, Locale.JAPANESE, Locale.JAPANESE);
+ doTestActionKeysInLocaleWithStringResources(noLanguage, Locale.US, Locale.US);
+ doTestActionKeysInLocaleWithStringResources(noLanguage, Locale.FRENCH, Locale.FRENCH);
+ doTestActionKeysInLocaleWithStringResources(noLanguage, Locale.ITALIAN, Locale.ITALIAN);
+ doTestActionKeysInLocaleWithStringResources(noLanguage, Locale.JAPANESE, Locale.JAPANESE);
+ }
+
+ private void doTestActionKeysInLocaleWithKeyboardTextsSet(final InputMethodSubtype subtype,
+ final Locale labelLocale, final Locale systemLocale) {
+ // Simulate system locale changing, see {@link SystemBroadcastReceiver}.
+ if (!systemLocale.equals(mSystemLocale)) {
+ KeyboardLayoutSet.onSystemLocaleChanged();
+ mSystemLocale = systemLocale;
+ }
+ final KeyboardTextsSet textsSet = new KeyboardTextsSet();
+ textsSet.setLocale(labelLocale, getContext());
+ final ExpectedActionKey enterKey = ExpectedActionKey.newIconKey(
+ KeyboardIconsSet.NAME_ENTER_KEY);
+ final ExpectedActionKey goKey = ExpectedActionKey.newLabelKey(
+ textsSet.getText("label_go_key"));
+ final ExpectedActionKey searchKey = ExpectedActionKey.newIconKey(
+ KeyboardIconsSet.NAME_SEARCH_KEY);
+ final ExpectedActionKey sendKey = ExpectedActionKey.newLabelKey(
+ textsSet.getText("label_send_key"));
+ final ExpectedActionKey nextKey = ExpectedActionKey.newLabelKey(
+ textsSet.getText("label_next_key"));
+ final ExpectedActionKey doneKey = ExpectedActionKey.newLabelKey(
+ textsSet.getText("label_done_key"));
+ final ExpectedActionKey previousKey = ExpectedActionKey.newLabelKey(
+ textsSet.getText("label_previous_key"));
+ final String tag = "label=hi_ZZ system=" + systemLocale
+ + " " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ final RunInLocale<Void> job = new RunInLocale<Void>() {
+ @Override
+ public Void job(final Resources res) {
+ doTestActionKeys(subtype, tag, enterKey, enterKey, goKey, searchKey, sendKey,
+ nextKey, doneKey, previousKey);
+ return null;
+ }
+ };
+ job.runInLocale(getContext().getResources(), systemLocale);
+ }
+
+ public void testHinglishActionLabel() {
+ final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
+ final Locale hi_ZZ = new Locale("hi", "ZZ");
+ final InputMethodSubtype hinglish = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+ hi_ZZ.toString(), SubtypeLocaleUtils.QWERTY);
+ // An action label should be displayed in subtype's locale regardless of the system locale.
+ doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, hi_ZZ, hi_ZZ);
+ doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, hi_ZZ, Locale.US);
+ doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, hi_ZZ, Locale.FRENCH);
+ doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, hi_ZZ, Locale.ITALIAN);
+ doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, hi_ZZ, Locale.JAPANESE);
}
}
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
index 922d2a8c8..8f4648c52 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
@@ -16,52 +16,33 @@
package com.android.inputmethod.keyboard.internal;
-import android.app.Instrumentation;
import android.content.Context;
import android.content.res.Resources;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.latin.R;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
-@MediumTest
-public class MoreKeySpecSplitTests extends InstrumentationTestCase {
+@SmallTest
+public class MoreKeySpecSplitTests extends AndroidTestCase {
private static final Locale TEST_LOCALE = Locale.ENGLISH;
- final KeyboardTextsSet mTextsSet = new KeyboardTextsSet();
+ private final KeyboardTextsSet mTextsSet = new KeyboardTextsSet();
@Override
protected void setUp() throws Exception {
super.setUp();
- final Instrumentation instrumentation = getInstrumentation();
- final Context targetContext = instrumentation.getTargetContext();
- mTextsSet.setLocale(TEST_LOCALE, targetContext);
- final String[] testResourceNames = getAllResourceIdNames(
- com.android.inputmethod.latin.tests.R.string.class);
- final Context testContext = instrumentation.getContext();
- final Resources testRes = testContext.getResources();
- final String testResPackageName = testRes.getResourcePackageName(
- // This dummy raw resource is needed to be able to load string resources from a test
- // APK successfully.
- com.android.inputmethod.latin.tests.R.raw.dummy_resource_for_testing);
- mTextsSet.loadStringResourcesInternal(testRes, testResourceNames, testResPackageName);
- }
-
- private static String[] getAllResourceIdNames(final Class<?> resourceIdClass) {
- final ArrayList<String> names = new ArrayList<>();
- for (final Field field : resourceIdClass.getFields()) {
- if (field.getType() == int.class) {
- names.add(field.getName());
- }
- }
- return names.toArray(new String[names.size()]);
+ final Context targetContext = getContext();
+ final Resources targetRes = targetContext.getResources();
+ final String targetPackageName = targetRes.getResourcePackageName(
+ R.string.english_ime_name);
+ mTextsSet.setLocale(TEST_LOCALE, targetRes, targetPackageName);
}
- private static <T> void assertArrayEquals(final String message, final T[] expected,
- final T[] actual) {
+ static <T> void assertArrayEquals(final String message, final T[] expected, final T[] actual) {
if (expected == actual) {
return;
}
@@ -109,14 +90,6 @@ public class MoreKeySpecSplitTests extends InstrumentationTestCase {
private static final String SURROGATE1 = PAIR1 + PAIR2;
private static final String SURROGATE2 = PAIR1 + PAIR2 + PAIR3;
- public void testResolveNullText() {
- assertNull("resolve null", mTextsSet.resolveTextReference(null));
- }
-
- public void testResolveEmptyText() {
- assertNull("resolve empty text", mTextsSet.resolveTextReference("!text/empty_string"));
- }
-
public void testSplitZero() {
assertTextArray("Empty string", "");
assertTextArray("Empty entry", ",");
@@ -224,132 +197,14 @@ public class MoreKeySpecSplitTests extends InstrumentationTestCase {
"\\!", "\\!TEXT/EMPTY_STRING");
}
- public void testSplitResourceError() {
- assertError("Incomplete resource name", "!text/", "!text/");
- assertError("Non existing resource", "!text/non_existing");
- }
-
- public void testSplitResourceZero() {
- assertTextArray("Empty string",
- "!text/empty_string");
- }
-
- public void testSplitResourceSingle() {
- assertTextArray("Single char",
- "!text/single_char", "a");
- assertTextArray("Space",
- "!text/space", " ");
- assertTextArray("Single label",
- "!text/single_label", "abc");
- assertTextArray("Spaces",
- "!text/spaces", " ");
- assertTextArray("Spaces in label",
- "!text/spaces_in_label", "a b c");
- assertTextArray("Spaces at beginning of label",
- "!text/spaces_at_beginning_of_label", " abc");
- assertTextArray("Spaces at end of label",
- "!text/spaces_at_end_of_label", "abc ");
- assertTextArray("label surrounded by spaces",
- "!text/label_surrounded_by_spaces", " abc ");
-
- assertTextArray("Escape and single char",
- "\\\\!text/single_char", "\\\\a");
- }
-
- public void testSplitResourceSingleEscaped() {
- assertTextArray("Escaped char",
- "!text/escaped_char", "\\a");
- assertTextArray("Escaped comma",
- "!text/escaped_comma", "\\,");
- assertTextArray("Escaped comma escape",
- "!text/escaped_comma_escape", "a\\,\\");
- assertTextArray("Escaped escape",
- "!text/escaped_escape", "\\\\");
- assertTextArray("Escaped label",
- "!text/escaped_label", "a\\bc");
- assertTextArray("Escaped label at beginning",
- "!text/escaped_label_at_beginning", "\\abc");
- assertTextArray("Escaped label at end",
- "!text/escaped_label_at_end", "abc\\");
- assertTextArray("Escaped label with comma",
- "!text/escaped_label_with_comma", "a\\,c");
- assertTextArray("Escaped label with comma at beginning",
- "!text/escaped_label_with_comma_at_beginning", "\\,bc");
- assertTextArray("Escaped label with comma at end",
- "!text/escaped_label_with_comma_at_end", "ab\\,");
- assertTextArray("Escaped label with successive",
- "!text/escaped_label_with_successive", "\\,\\\\bc");
- assertTextArray("Escaped label with escape",
- "!text/escaped_label_with_escape", "a\\\\c");
+ public void testSplitTextReferenceError() {
+ assertError("Incomplete text name", "!text/", "!text/");
+ assertError("Non existing text", "!text/non_existing");
}
- public void testSplitResourceMulti() {
- assertTextArray("Multiple chars",
- "!text/multiple_chars", "a", "b", "c");
- assertTextArray("Multiple chars surrounded by spaces",
- "!text/multiple_chars_surrounded_by_spaces",
- " a ", " b ", " c ");
- assertTextArray("Multiple labels",
- "!text/multiple_labels", "abc", "def", "ghi");
- assertTextArray("Multiple labels surrounded by spaces",
- "!text/multiple_labels_surrounded_by_spaces", " abc ", " def ", " ghi ");
- }
-
- public void testSplitResourcetMultiEscaped() {
- assertTextArray("Multiple chars with comma",
- "!text/multiple_chars_with_comma",
- "a", "\\,", "c");
- assertTextArray("Multiple chars with comma surrounded by spaces",
- "!text/multiple_chars_with_comma_surrounded_by_spaces",
- " a ", " \\, ", " c ");
- assertTextArray("Multiple labels with escape",
- "!text/multiple_labels_with_escape",
- "\\abc", "d\\ef", "gh\\i");
- assertTextArray("Multiple labels with escape surrounded by spaces",
- "!text/multiple_labels_with_escape_surrounded_by_spaces",
- " \\abc ", " d\\ef ", " gh\\i ");
- assertTextArray("Multiple labels with comma and escape",
- "!text/multiple_labels_with_comma_and_escape",
- "ab\\\\", "d\\\\\\,", "g\\,i");
- assertTextArray("Multiple labels with comma and escape surrounded by spaces",
- "!text/multiple_labels_with_comma_and_escape_surrounded_by_spaces",
- " ab\\\\ ", " d\\\\\\, ", " g\\,i ");
- }
-
- public void testSplitMultipleResources() {
- assertTextArray("Literals and resources",
- "1,!text/multiple_chars,z", "1", "a", "b", "c", "z");
- assertTextArray("Literals and resources and escape at end",
- "\\1,!text/multiple_chars,z\\", "\\1", "a", "b", "c", "z\\");
- assertTextArray("Multiple single resource chars and labels",
- "!text/single_char,!text/single_label,!text/escaped_comma",
- "a", "abc", "\\,");
- assertTextArray("Multiple single resource chars and labels 2",
- "!text/single_char,!text/single_label,!text/escaped_comma_escape",
- "a", "abc", "a\\,\\");
- assertTextArray("Multiple multiple resource chars and labels",
- "!text/multiple_chars,!text/multiple_labels,!text/multiple_chars_with_comma",
- "a", "b", "c", "abc", "def", "ghi", "a", "\\,", "c");
- assertTextArray("Concatenated resources",
- "!text/multiple_chars!text/multiple_labels!text/multiple_chars_with_comma",
- "a", "b", "cabc", "def", "ghia", "\\,", "c");
- assertTextArray("Concatenated resource and literal",
- "abc!text/multiple_labels",
- "abcabc", "def", "ghi");
- }
-
- public void testSplitIndirectReference() {
- assertTextArray("Indirect",
- "!text/indirect_string", "a", "b", "c");
- assertTextArray("Indirect with literal",
- "1,!text/indirect_string_with_literal,2", "1", "x", "a", "b", "c", "y", "2");
- assertTextArray("Indirect2",
- "!text/indirect2_string", "a", "b", "c");
- }
-
- public void testSplitInfiniteIndirectReference() {
- assertError("Infinite indirection",
- "1,!text/infinite_indirection,2", "1", "infinite", "<infinite>", "loop", "2");
+ public void testSplitEmptyTextReference() {
+ // Note that morekeys_q of English locale is empty.
+ assertTextArray("Empty string", "!text/morekeys_q");
}
public void testLabelReferece() {
@@ -360,12 +215,6 @@ public class MoreKeySpecSplitTests extends InstrumentationTestCase {
assertTextArray("Settings as more key", "!text/keyspec_settings",
"!icon/settings_key|!code/key_settings");
-
- assertTextArray("Indirect naviagte actions as more key",
- "!text/keyspec_indirect_navigate_actions",
- "!fixedColumnOrder!2",
- "!hasLabels!", "Prev|!code/key_action_previous",
- "!hasLabels!", "Next|!code/key_action_next");
}
public void testUselessUpperCaseSpecifier() {
@@ -394,14 +243,6 @@ public class MoreKeySpecSplitTests extends InstrumentationTestCase {
assertTextArray("INDIRECT2",
"!TEXT/INDIRECT2_STRING", "!TEXT/INDIRECT2_STRING");
- assertTextArray("Upper indirect",
- "!text/upper_indirect_string", "!TEXT/MULTIPLE_CHARS");
- assertTextArray("Upper indirect with literal",
- "1,!text/upper_indirect_string_with_literal,2",
- "1", "x", "!TEXT/MULTIPLE_CHARS", "y", "2");
- assertTextArray("Upper indirect2",
- "!text/upper_indirect2_string", "!TEXT/UPPER_INDIRECT_STRING");
-
assertTextArray("UPPER INDIRECT",
"!TEXT/upper_INDIRECT_STRING", "!TEXT/upper_INDIRECT_STRING");
assertTextArray("Upper INDIRECT with literal",
@@ -413,9 +254,6 @@ public class MoreKeySpecSplitTests extends InstrumentationTestCase {
assertTextArray("INFINITE INDIRECTION",
"1,!TEXT/INFINITE_INDIRECTION,2", "1", "!TEXT/INFINITE_INDIRECTION", "2");
- assertTextArray("Upper infinite indirection",
- "1,!text/upper_infinite_indirection,2",
- "1", "infinite", "!TEXT/INFINITE_INDIRECTION", "loop", "2");
assertTextArray("Upper INFINITE INDIRECTION",
"1,!TEXT/UPPER_INFINITE_INDIRECTION,2",
"1", "!TEXT/UPPER_INFINITE_INDIRECTION", "2");
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecStringReferenceTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecStringReferenceTests.java
new file mode 100644
index 000000000..e06ecaedf
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecStringReferenceTests.java
@@ -0,0 +1,284 @@
+/*
+ * 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.internal;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.latin.tests.R;
+
+import java.util.Locale;
+
+@SmallTest
+public class MoreKeySpecStringReferenceTests extends InstrumentationTestCase {
+ private static final Locale TEST_LOCALE = Locale.ENGLISH;
+ private final KeyboardTextsSet mTextsSet = new KeyboardTextsSet();
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ final Instrumentation instrumentation = getInstrumentation();
+ final Context testContext = instrumentation.getContext();
+ final Resources testRes = testContext.getResources();
+ final String testPackageName = testRes.getResourcePackageName(R.string.empty_string);
+ mTextsSet.setLocale(TEST_LOCALE, testRes, testPackageName);
+ }
+
+ private void assertTextArray(final String message, final String value,
+ final String ... expectedArray) {
+ final String resolvedActual = mTextsSet.resolveTextReference(value);
+ final String[] actual = MoreKeySpec.splitKeySpecs(resolvedActual);
+ final String[] expected = (expectedArray.length == 0) ? null : expectedArray;
+ MoreKeySpecSplitTests.assertArrayEquals(message, expected, actual);
+ }
+
+ private void assertError(final String message, final String value, final String ... expected) {
+ try {
+ assertTextArray(message, value, expected);
+ fail(message);
+ } catch (Exception pcpe) {
+ // success.
+ }
+ }
+
+ public void testResolveNullText() {
+ assertEquals("resolve null",
+ mTextsSet.resolveTextReference(null), null);
+ }
+
+ public void testResolveEmptyText() {
+ assertEquals("resolve empty text",
+ mTextsSet.resolveTextReference("!string/empty_string"), null);
+ }
+
+ public void testSplitSingleEscaped() {
+ assertTextArray("Escaped !string", "\\!string",
+ "\\!string");
+ assertTextArray("Escaped !string/", "\\!string/",
+ "\\!string/");
+ assertTextArray("Escaped !STRING/", "\\!STRING/",
+ "\\!STRING/");
+ assertTextArray("Escaped !string/name", "\\!string/empty_string",
+ "\\!string/empty_string");
+ assertTextArray("Escaped !STRING/NAME", "\\!STRING/EMPTY_STRING",
+ "\\!STRING/EMPTY_STRING");
+ }
+
+ public void testSplitMultiEscaped() {
+ assertTextArray("Multiple escaped !string", "\\!,\\!string/empty_string",
+ "\\!", "\\!string/empty_string");
+ assertTextArray("Multiple escaped !STRING", "\\!,\\!STRING/EMPTY_STRING",
+ "\\!", "\\!STRING/EMPTY_STRING");
+ }
+
+ public void testSplitStringReferenceError() {
+ assertError("Incomplete resource name", "!string/", "!string/");
+ assertError("Non existing resource", "!string/non_existing");
+ }
+
+ public void testSplitEmptyStringReference() {
+ assertTextArray("Empty string", "!string/empty_string");
+ }
+
+ public void testSplitResourceSingle() {
+ assertTextArray("Single char", "!string/single_char",
+ "a");
+ assertTextArray("Space", "!string/space",
+ " ");
+ assertTextArray("Single label", "!string/single_label",
+ "abc");
+ assertTextArray("Spaces", "!string/spaces",
+ " ");
+ assertTextArray("Spaces in label", "!string/spaces_in_label",
+ "a b c");
+ assertTextArray("Spaces at beginning of label", "!string/spaces_at_beginning_of_label",
+ " abc");
+ assertTextArray("Spaces at end of label", "!string/spaces_at_end_of_label",
+ "abc ");
+ assertTextArray("label surrounded by spaces", "!string/label_surrounded_by_spaces",
+ " abc ");
+ assertTextArray("Escape and single char", "\\\\!string/single_char",
+ "\\\\a");
+ }
+
+ public void testSplitResourceSingleEscaped() {
+ assertTextArray("Escaped char",
+ "!string/escaped_char", "\\a");
+ assertTextArray("Escaped comma",
+ "!string/escaped_comma", "\\,");
+ assertTextArray("Escaped comma escape",
+ "!string/escaped_comma_escape", "a\\,\\");
+ assertTextArray("Escaped escape",
+ "!string/escaped_escape", "\\\\");
+ assertTextArray("Escaped label",
+ "!string/escaped_label", "a\\bc");
+ assertTextArray("Escaped label at beginning",
+ "!string/escaped_label_at_beginning", "\\abc");
+ assertTextArray("Escaped label at end",
+ "!string/escaped_label_at_end", "abc\\");
+ assertTextArray("Escaped label with comma",
+ "!string/escaped_label_with_comma", "a\\,c");
+ assertTextArray("Escaped label with comma at beginning",
+ "!string/escaped_label_with_comma_at_beginning", "\\,bc");
+ assertTextArray("Escaped label with comma at end",
+ "!string/escaped_label_with_comma_at_end", "ab\\,");
+ assertTextArray("Escaped label with successive",
+ "!string/escaped_label_with_successive", "\\,\\\\bc");
+ assertTextArray("Escaped label with escape",
+ "!string/escaped_label_with_escape", "a\\\\c");
+ }
+
+ public void testSplitResourceMulti() {
+ assertTextArray("Multiple chars",
+ "!string/multiple_chars", "a", "b", "c");
+ assertTextArray("Multiple chars surrounded by spaces",
+ "!string/multiple_chars_surrounded_by_spaces",
+ " a ", " b ", " c ");
+ assertTextArray("Multiple labels",
+ "!string/multiple_labels", "abc", "def", "ghi");
+ assertTextArray("Multiple labels surrounded by spaces",
+ "!string/multiple_labels_surrounded_by_spaces", " abc ", " def ", " ghi ");
+ }
+
+ public void testSplitResourcetMultiEscaped() {
+ assertTextArray("Multiple chars with comma",
+ "!string/multiple_chars_with_comma",
+ "a", "\\,", "c");
+ assertTextArray("Multiple chars with comma surrounded by spaces",
+ "!string/multiple_chars_with_comma_surrounded_by_spaces",
+ " a ", " \\, ", " c ");
+ assertTextArray("Multiple labels with escape",
+ "!string/multiple_labels_with_escape",
+ "\\abc", "d\\ef", "gh\\i");
+ assertTextArray("Multiple labels with escape surrounded by spaces",
+ "!string/multiple_labels_with_escape_surrounded_by_spaces",
+ " \\abc ", " d\\ef ", " gh\\i ");
+ assertTextArray("Multiple labels with comma and escape",
+ "!string/multiple_labels_with_comma_and_escape",
+ "ab\\\\", "d\\\\\\,", "g\\,i");
+ assertTextArray("Multiple labels with comma and escape surrounded by spaces",
+ "!string/multiple_labels_with_comma_and_escape_surrounded_by_spaces",
+ " ab\\\\ ", " d\\\\\\, ", " g\\,i ");
+ }
+
+ public void testSplitMultipleResources() {
+ assertTextArray("Literals and resources",
+ "1,!string/multiple_chars,z",
+ "1", "a", "b", "c", "z");
+ assertTextArray("Literals and resources and escape at end",
+ "\\1,!string/multiple_chars,z\\",
+ "\\1", "a", "b", "c", "z\\");
+ assertTextArray("Multiple single resource chars and labels",
+ "!string/single_char,!string/single_label,!string/escaped_comma",
+ "a", "abc", "\\,");
+ assertTextArray("Multiple single resource chars and labels 2",
+ "!string/single_char,!string/single_label,!string/escaped_comma_escape",
+ "a", "abc", "a\\,\\");
+ assertTextArray("Multiple multiple resource chars and labels",
+ "!string/multiple_chars,!string/multiple_labels,!string/multiple_chars_with_comma",
+ "a", "b", "c", "abc", "def", "ghi", "a", "\\,", "c");
+ assertTextArray("Concatenated resources",
+ "!string/multiple_chars!string/multiple_labels!string/multiple_chars_with_comma",
+ "a", "b", "cabc", "def", "ghia", "\\,", "c");
+ assertTextArray("Concatenated resource and literal",
+ "abc!string/multiple_labels",
+ "abcabc", "def", "ghi");
+ }
+
+ public void testSplitIndirectReference() {
+ assertTextArray("Indirect",
+ "!string/indirect_string", "a", "b", "c");
+ assertTextArray("Indirect with literal",
+ "1,!string/indirect_string_with_literal,2", "1", "x", "a", "b", "c", "y", "2");
+ assertTextArray("Indirect2",
+ "!string/indirect2_string", "a", "b", "c");
+ }
+
+ public void testSplitInfiniteIndirectReference() {
+ assertError("Infinite indirection",
+ "1,!string/infinite_indirection,2", "1", "infinite", "<infinite>", "loop", "2");
+ }
+
+ public void testLabelReferece() {
+ assertTextArray("Indirect naviagte actions as more key",
+ "!string/keyspec_indirect_navigate_actions",
+ "!fixedColumnOrder!2",
+ "!hasLabels!", "ActionPrevious|!code/key_action_previous",
+ "!hasLabels!", "ActionNext|!code/key_action_next");
+ }
+
+ public void testUselessUpperCaseSpecifier() {
+ assertTextArray("EMPTY STRING",
+ "!STRING/EMPTY_STRING", "!STRING/EMPTY_STRING");
+
+ assertTextArray("SINGLE CHAR",
+ "!STRING/SINGLE_CHAR", "!STRING/SINGLE_CHAR");
+ assertTextArray("Escape and SINGLE CHAR",
+ "\\\\!STRING/SINGLE_CHAR", "\\\\!STRING/SINGLE_CHAR");
+
+ assertTextArray("MULTIPLE CHARS",
+ "!STRING/MULTIPLE_CHARS", "!STRING/MULTIPLE_CHARS");
+
+ assertTextArray("Literals and RESOURCES",
+ "1,!STRING/MULTIPLE_CHARS,z", "1", "!STRING/MULTIPLE_CHARS", "z");
+ assertTextArray("Multiple single RESOURCE chars and LABELS 2",
+ "!STRING/SINGLE_CHAR,!STRING/SINGLE_LABEL,!STRING/ESCAPED_COMMA_ESCAPE",
+ "!STRING/SINGLE_CHAR", "!STRING/SINGLE_LABEL", "!STRING/ESCAPED_COMMA_ESCAPE");
+
+ assertTextArray("INDIRECT",
+ "!STRING/INDIRECT_STRING", "!STRING/INDIRECT_STRING");
+ assertTextArray("INDIRECT with literal",
+ "1,!STRING/INDIRECT_STRING_WITH_LITERAL,2",
+ "1", "!STRING/INDIRECT_STRING_WITH_LITERAL", "2");
+ assertTextArray("INDIRECT2",
+ "!STRING/INDIRECT2_STRING", "!STRING/INDIRECT2_STRING");
+
+ assertTextArray("Upper indirect",
+ "!string/upper_indirect_string", "!STRING/MULTIPLE_CHARS");
+ assertTextArray("Upper indirect with literal",
+ "1,!string/upper_indirect_string_with_literal,2",
+ "1", "x", "!STRING/MULTIPLE_CHARS", "y", "2");
+ assertTextArray("Upper indirect2",
+ "!string/upper_indirect2_string", "!STRING/UPPER_INDIRECT_STRING");
+
+ assertTextArray("UPPER INDIRECT",
+ "!STRING/upper_INDIRECT_STRING", "!STRING/upper_INDIRECT_STRING");
+ assertTextArray("Upper INDIRECT with literal",
+ "1,!STRING/upper_INDIRECT_STRING_WITH_LITERAL,2",
+ "1", "!STRING/upper_INDIRECT_STRING_WITH_LITERAL", "2");
+ assertTextArray("Upper INDIRECT2",
+ "!STRING/upper_INDIRECT2_STRING", "!STRING/upper_INDIRECT2_STRING");
+
+ assertTextArray("INFINITE INDIRECTION",
+ "1,!STRING/INFINITE_INDIRECTION,2", "1", "!STRING/INFINITE_INDIRECTION", "2");
+
+ assertTextArray("Upper infinite indirection",
+ "1,!string/upper_infinite_indirection,2",
+ "1", "infinite", "!STRING/INFINITE_INDIRECTION", "loop", "2");
+ assertTextArray("Upper INFINITE INDIRECTION",
+ "1,!STRING/UPPER_INFINITE_INDIRECTION,2",
+ "1", "!STRING/UPPER_INFINITE_INDIRECTION", "2");
+
+ assertTextArray("INDIRECT NAVIGATE ACTIONS AS MORE KEY",
+ "!STRING/INDIRECT_NAVIGATE_ACTIONS_AS_MORE_KEY",
+ "!STRING/INDIRECT_NAVIGATE_ACTIONS_AS_MORE_KEY");
+ }
+}