Merge "Add null check to KeySpecParser"

main
Tadashi G. Takaoka 2014-02-05 09:32:04 +00:00 committed by Android (Google) Code Review
commit 6e5dbdd501
5 changed files with 43 additions and 4 deletions

View File

@ -120,6 +120,10 @@ public final class KeySpecParser {
} }
public static String getLabel(final String keySpec) { public static String getLabel(final String keySpec) {
if (keySpec == null) {
// TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
return null;
}
if (hasIcon(keySpec)) { if (hasIcon(keySpec)) {
return null; return null;
} }
@ -140,6 +144,10 @@ public final class KeySpecParser {
} }
public static String getOutputText(final String keySpec) { public static String getOutputText(final String keySpec) {
if (keySpec == null) {
// TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
return null;
}
final int labelEnd = indexOfLabelEnd(keySpec); final int labelEnd = indexOfLabelEnd(keySpec);
if (hasCode(keySpec, labelEnd)) { if (hasCode(keySpec, labelEnd)) {
return null; return null;
@ -165,6 +173,10 @@ public final class KeySpecParser {
} }
public static int getCode(final String keySpec, final KeyboardCodesSet codesSet) { public static int getCode(final String keySpec, final KeyboardCodesSet codesSet) {
if (keySpec == null) {
// TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
return CODE_UNSPECIFIED;
}
final int labelEnd = indexOfLabelEnd(keySpec); final int labelEnd = indexOfLabelEnd(keySpec);
if (hasCode(keySpec, labelEnd)) { if (hasCode(keySpec, labelEnd)) {
checkDoubleLabelEnd(keySpec, labelEnd); checkDoubleLabelEnd(keySpec, labelEnd);
@ -187,6 +199,7 @@ public final class KeySpecParser {
return (StringUtils.codePointCount(label) == 1) ? label.codePointAt(0) : CODE_OUTPUT_TEXT; return (StringUtils.codePointCount(label) == 1) ? label.codePointAt(0) : CODE_OUTPUT_TEXT;
} }
// TODO: Make this method private once Key.code attribute is removed.
public static int parseCode(final String text, final KeyboardCodesSet codesSet, public static int parseCode(final String text, final KeyboardCodesSet codesSet,
final int defCode) { final int defCode) {
if (text == null) { if (text == null) {
@ -202,6 +215,10 @@ public final class KeySpecParser {
} }
public static int getIconId(final String keySpec) { public static int getIconId(final String keySpec) {
if (keySpec == null) {
// TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
return KeyboardIconsSet.ICON_UNDEFINED;
}
if (!hasIcon(keySpec)) { if (!hasIcon(keySpec)) {
return KeyboardIconsSet.ICON_UNDEFINED; return KeyboardIconsSet.ICON_UNDEFINED;
} }

View File

@ -46,6 +46,9 @@ public final class MoreKeySpec {
public MoreKeySpec(final String moreKeySpec, boolean needsToUpperCase, final Locale locale, public MoreKeySpec(final String moreKeySpec, boolean needsToUpperCase, final Locale locale,
final KeyboardCodesSet codesSet) { final KeyboardCodesSet codesSet) {
if (TextUtils.isEmpty(moreKeySpec)) {
throw new KeySpecParser.KeySpecParserError("Empty more key spec");
}
mLabel = StringUtils.toUpperCaseOfStringForLocale( mLabel = StringUtils.toUpperCaseOfStringForLocale(
KeySpecParser.getLabel(moreKeySpec), needsToUpperCase, locale); KeySpecParser.getLabel(moreKeySpec), needsToUpperCase, locale);
final int code = StringUtils.toUpperCaseOfCodeForLocale( final int code = StringUtils.toUpperCaseOfCodeForLocale(

View File

@ -16,6 +16,9 @@
package com.android.inputmethod.keyboard.internal; package com.android.inputmethod.keyboard.internal;
import static com.android.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED;
import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.Constants;
@ -40,4 +43,13 @@ public final class KeySpecParserTests extends KeySpecParserTestsBase {
Constants.printableCode(expectedCode), Constants.printableCode(expectedCode),
Constants.printableCode(actualCode)); Constants.printableCode(actualCode));
} }
// TODO: Remove this method.
// These should throw {@link KeySpecParserError} when Key.keyLabel attribute become mandatory.
public void testEmptySpec() {
assertParser("Null spec", null,
null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParser("Empty spec", "",
null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
}
} }

View File

@ -251,10 +251,6 @@ abstract class KeySpecParserTestsBase extends AndroidTestCase {
} }
public void testFormatError() { public void testFormatError() {
assertParserError("Null spec", null, null,
null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Empty spec", "", null,
null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Single bar", "|", assertParserError("Single bar", "|",
"|", null, ICON_UNDEFINED, '|'); "|", null, ICON_UNDEFINED, '|');
assertParserError("Empty label with outputText", "|a", assertParserError("Empty label with outputText", "|a",

View File

@ -16,6 +16,9 @@
package com.android.inputmethod.keyboard.internal; package com.android.inputmethod.keyboard.internal;
import static com.android.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED;
import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.Constants;
@ -42,6 +45,14 @@ public final class MoreKeySpecTests extends KeySpecParserTestsBase {
Constants.printableCode(spec.mCode)); Constants.printableCode(spec.mCode));
} }
// TODO: Move this method to {@link KeySpecParserBase}.
public void testEmptySpec() {
assertParserError("Null spec", null,
null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Empty spec", "",
null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
}
private static void assertArrayEquals(final String message, final Object[] expected, private static void assertArrayEquals(final String message, final Object[] expected,
final Object[] actual) { final Object[] actual) {
if (expected == actual) { if (expected == actual) {