From 24cd2617f527d3d52c7fa36463002c47024083c8 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 3 Feb 2012 18:37:30 +0900 Subject: [PATCH] Filter out empty entry from more keys CSV Change-Id: I9a26aaa58f0f502b3bfef9de422370d2b0add8d8 --- .../keyboard/internal/KeySpecParser.java | 18 ++++++++++++------ .../internal/KeySpecParserCsvTests.java | 10 ++++++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java index 4e290024c..adb5f4759 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java @@ -325,7 +325,7 @@ public class KeySpecParser { return null; } if (Utils.codePointCount(text) == 1) { - return new String[] { text }; + return text.codePointAt(0) == COMMA ? null : new String[] { text }; } ArrayList list = null; @@ -333,10 +333,13 @@ public class KeySpecParser { for (int pos = 0; pos < size; pos++) { final char c = text.charAt(pos); if (c == COMMA) { - if (list == null) { - list = new ArrayList(); + // Skip empty entry. + if (pos - start > 0) { + if (list == null) { + list = new ArrayList(); + } + list.add(text.substring(start, pos)); } - list.add(text.substring(start, pos)); // Skip comma start = pos + 1; } else if (c == ESCAPE_CHAR) { @@ -344,10 +347,13 @@ public class KeySpecParser { pos++; } } + final String remain = (size - start > 0) ? text.substring(start) : null; if (list == null) { - return new String[] { text.substring(start) }; + return remain != null ? new String[] { remain } : null; } else { - list.add(text.substring(start)); + if (remain != null) { + list.add(remain); + } return list.toArray(new String[list.size()]); } } diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserCsvTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserCsvTests.java index 721c801e1..a0ce86d1c 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserCsvTests.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserCsvTests.java @@ -42,7 +42,8 @@ public class KeySpecParserCsvTests extends AndroidTestCase { final String actual[] = KeySpecParser.parseCsvString(value, mTestResources, R.string.empty_string); if (expected.length == 0) { - assertNull(message, actual); + assertNull(message + ": expected=null actual=" + Arrays.toString(actual), + actual); return; } assertEquals(message + ": expected=" + Arrays.toString(expected) @@ -74,6 +75,11 @@ public class KeySpecParserCsvTests extends AndroidTestCase { public void testParseCsvTextZero() { assertTextArray("Empty string", ""); + assertTextArray("Empty entry", ","); + assertTextArray("Empty entry at beginning", ",a", "a"); + assertTextArray("Empty entry at end", "a,", "a"); + assertTextArray("Empty entry at middle", "a,,b", "a", "b"); + assertTextArray("Empty entries with escape", ",a,b\\,c,,d,", "a", "b\\,c", "d"); } public void testParseCsvTextSingle() { @@ -82,7 +88,7 @@ public class KeySpecParserCsvTests extends AndroidTestCase { assertTextArray("Single escape", "\\", "\\"); assertTextArray("Space", " ", " "); assertTextArray("Single label", "abc", "abc"); - assertTextArray("Single srrogate pairs label", SURROGATE2, SURROGATE2); + assertTextArray("Single surrogate pairs label", SURROGATE2, SURROGATE2); assertTextArray("Spaces", " ", " "); assertTextArray("Spaces in label", "a b c", "a b c"); assertTextArray("Spaces at beginning of label", " abc", " abc");